0

定義された「2d」配列を反復処理して、最小値を見つけようとしています。

マトリックス内の値にアクセスしようとするとエラーが発生します。私が置き換えようとしたことに注意してください:

mov ecx, matrix[edi + esi *2]

mov ecx, [matrix + edi + esi * 2]

そしてそれは助けにはなりませんでした

;-----------------------------------------------
;SECTION .DATA
;Instantiated variables/Constants
;-----------------------------------------------
section .data

result:     db "The smallest number is: " , 0x0a
result_len:     equ $-result

nl:     db "   ", 0x0a
nl_len  equ $-nl

matrix: dw  25, 24, 23, 22, 21
        dw  20, 19, 18, 17, 16 
        dw  15, 14, 13, 12, 11 
        dw  10,  9,  8,  7,  6
        dw   5,  4,  3,  2,  1


;-----------------------------------------------
;SECTION .BSS
;Non initialized variables
;-----------------------------------------------
section .bss


;-----------------------------------------------
;SECTION .TEXT
;Code
;-----------------------------------------------
section .text
global _start 

_start: 
    ;variable declaration
    mov edi, 0
    mov esi, 0
    mov ecx, 9

outerLoop:
    cmp edi, 50                  ;each element is 2 bytes (2 ascii characters)
    jg  endloop                  ;we need 50 because it's 5 elements per row
    mov esi, 0                   ;and 5 rows
innerLoop:
    cmp esi, 5                   ;Compare esi(inner loop index) to 5
    jge innerEnd                 ;jump if it reached the end of the row
    mov eax, matrix[edi + esi*2]
    cmp [eax], ecx
    jg  biggerThan
    mov ecx, [eax]
biggerThan:
    inc esi
    jmp innerLoop
innerEnd:
    add edi, 10                  ;row has been complete, go to next
    jmp outerLoop

endloop:
    push    ecx

    mov eax, 4
    mov ebx, 1
    mov ecx, result
    mov edx, result_len
    int 0x80

    mov eax, 4
    mov ebx, 1
    mov ecx, esp
    add [ecx], DWORD 48
    mov edx, 2
    int 0x80

    ; display new line
    mov eax, 4
    mov ebx, 1
    mov ecx, nl
    mov edx, nl_len
    int 0x80

 exit:
    mov eax, 1          ;eax contains 1 so quit
    mov ebx, 0
    int 0x80

誰かがこの行の理由を説明できれば

mov eax, matrix[edi + esi*2]

それが機能していないか、配列を反復処理して最小のものを見つける方法を教えてください。

4

2 に答える 2

2
mov eax, matrix[edi + esi*2]
cmp [eax], ecx
jg  biggerThan
mov ecx, [eax]

Nasm はすべてのメモリ参照を角括弧内に入れたいので、mov eax, [matrix + edi + esi * 2]正しいはずです。しかし、メモリから 4 バイト (値のうちの 2 つ) を に移動していますeax。必要なのは 2 バイトだけです。ただし、は のアドレスのメモリcmp [eax], ecxと比較しようとしますが、これはほぼ確実に有効なメモリではありません。あなたはおそらくもっと似たものが欲しい...ecxeax

mov ax, [matrix + edi + esi*2]
cmp ax, cx
jg  biggerThan
mov cx, ax

あなたの表示ルーチンは、1 桁でしか機能しません。行列の最小値は 1 桁にすぎないため、これで問題が発生することはありません。

との違いを調べてjgくださいja。あなたの値はすべて正なので、それらを符号なしとして扱うことを意味するかもしれません-ja正しいでしょう。負の数を許可することを提案する場合jgは、正しいです。値が正で 2G 未満の場合はどちらでも機能しますが、違いを学ぶこともできます。

あなたは正しい軌道に乗っています!

于 2013-11-13T00:57:26.440 に答える
0

最小のものを見つけるのは基本的なアルゴリズムです。配列の初期値を「最小の変数」に入れ、次の値が小さければ次の値を比較し、そうでない場合は「最小の変数」に保存します。 、次にそれをスキップして、配列内の次の項目に進みます。

配列内の項目については、おそらく正しいメモリ アドレスを使用していないだけです。ああ、アセンブリ プログラミングの美しさ

于 2013-11-13T00:08:16.217 に答える