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。但减量甚至没有效果,因为在下一次迭代期间,您再次用 msg 的地址覆盖 ecx。循环再次开始。这是一个无限循环。您是否在调试器中检查了软件?这可以有很大帮助。

于 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 回答