2

我需要增加一个数字,以便代码永远增加,但它保持为零。

这是我的代码:

section .data
FORMAT: db '%c', 0
FORMATDBG: db '%d', 10, 0
EQUAL: db "is equal", 10, 0
repeat:
    push  ecx  ; just to print
    push  FORMATDBG ; just to print
    call  printf ; just to print
    add esp, 8 ; add the spaces
    inc ecx ; increment ecx
    cmp ecx, 0 ; compare ecx to zero
    ja repeat ; if not equal to zero loop again
4

1 回答 1

6
repeat:
    xor ecx, ecx
    push  ecx  ; just to print
    push  FORMATDBG ; just to print
    call  printf ; just to print
    add esp, 8 ; add the spaces
    inc ecx ; increment ecx
    cmp ecx, 0 ; compare ecx to zero
    ja repeat ; if not equal to zero loop again

xor ecx, ecx设置ecx为零。我不确定你是否知道这一点。您可能不希望它在每次迭代中都发生。此外,您的循环条件ja repeat当前仅在ecx > 0可能不是您想要的(或者不是?)时才会导致循环。

最后一件事,printf可能是垃圾ecx(我假设cdeclstdcall)。阅读调用约定(不确定您使用的是什么编译器/操作系统)并查看哪些寄存器可以保证在函数调用中保留。

就您的代码而言,您可能想要更接近此的东西:

    xor ebx, ebx

repeat:
    push  ebx  ; just to print
    push  FORMATDBG ; just to print
    call  printf ; just to print
    add esp, 8 ; add the spaces
    inc ebx ; increment ecx
    cmp ebx, 0 ; compare ecx to zero
    ja repeat ; if not equal to zero loop again

但这不会导致无限循环。当ebx达到最大值时,它的值将回绕回 0,这将导致循环条件 ( ebx>0) 评估为 false 并退出循环。

于 2012-05-03T00:28:41.290 回答