1

私は現在 Intel x86 Assembly を学んでおり、10 回ループする単純なループを構築しようとしているときに問題に遭遇しました。10回ループすると停止するはずですが、永遠に続きます。

これは私が使用しているコードです:

    section .data
    msg     db      "Hello, World!", 0x0a
    len     equ     $-msg

    section .text
    global _start

    _start:
            mov     cx, 10  ; loop counter

            _loop_start:
                    mov     ebx, 0x01
                    mov     ecx, msg
                    mov     edx, len
                    mov     eax, 0x04
                    int     0x80

                    dec     cx
                    cmp     cx, 0
                    jge     _loop_start

            _done:
                    mov     ebx, 0x00
                    mov     eax, 0x01
                    int     0x80

このコードを書く前に、簡単な算術を行うためのこのチュートリアルを見ました。

私はそれを次のようにコンパイルします:

   nasm -f elf64 test.s -o test.o

そして、次のようにリンクします。

   ld -s -o test_exec test.o

前もってありがとう、アニキヤン

4

2 に答える 2

4

cx は ecx の下位 16 ビット部分です。あなたのコードは、ループが 10 回実行されると考えるかもしれないことを示唆しています (ループの前に cx を 10 に設定します)。ただし、値を msg のアドレスで上書きしますmov ecx, msg。したがって、その数値の下位 16 ビットから 0 までカウントダウンを開始します。ただし、次の反復中に ecx を msg のアドレスで再度上書きするため、減分は効果がありません。そしてまたループスタート。無限ループです。デバッガでソフトウェアを確認しましたか? それは大いに役立ちます。

于 2013-04-26T07:13:06.260 に答える
0

「上書き」の問題が解決され、各回路のカウンタを減少させるためにカウンタ 10 から開始し、カウンタの値が 0 以上の場合に分岐すると、11 回のループになります。 .

または、zeroflag を使用して分岐することもできます (zeroflag が設定されていない場合)。

                dec     cl
                jnz     _loop_start

「dec」命令にはすでにフラグ レジスタが含まれているため、値がゼロに減少しているかどうかを確認する場合は、「cmp」命令は必要ありません。

ダーク

于 2013-05-05T08:33:52.020 に答える