0

我正在尝试在程序集中创建一个 for 循环,其中EAX寄存器设置为 5,并增加直到大于 10。每次增加时,它都会输出它的当前值。当我执行我的程序时,它进入一个只输出 4 的无限循环。为什么EAX的值为 4?为什么寄存器EAX没有按应有的增加?

include 'include/macro/import32.inc'
format PE console
entry start

section '.text' code readable executable

start:

mov eax,5
loop1:
    inc eax
    push eax
    push msg2
    call [printf]
    cmp eax,10
    jb loop1

call [getchar]
push 0
call [exit]

section '.data' data readable writable
msg2  db "%i",0dh,0ah,0

section 'idata' import data readable
library msvcrt,"msvcrt.dll"
import msvcrt,printf,"printf",getchar,"getchar",exit,"exit"
4

2 回答 2

2

printf返回的输出eax包含打印的字符数:在您的情况下为 3(数字、CR 和 LF)。由于小于 10,因此您循环,添加 1(使其变为 4),打印,然后重复。

您需要做的是push eax在设置printf调用之前存储 eax (),然后在返回pop eax后恢复它 (),printf例如:

loop1:
    inc  eax
    push eax        ; store eax
    push eax
    push msg2
    call [printf]
    add  esp,8      ; clean the stack from the printf call 
    pop  eax        ; restore eax
    cmp  eax,10
    jb   loop1

或者使用不同的寄存器,例如ebx你的循环变量。

于 2013-11-29T04:59:01.993 回答
0

在使用 printf 之前始终保留 EAX。printf 破坏了你的 EAX

inc eax
push eax
...call to printf
pop eax
cmp eax,10
于 2014-01-27T15:52:00.197 回答