我正在汇编 x86-64 中编写一个程序,其目标是增加一个值 (num) 直到达到 10。但是,尽管使用正确的比较来检查 num 是否小于 10,程序仍继续执行并打印值10点后:
[BITS 64]
default rel
section .data
extern ExitProcess, printf
msg db "%d", 10, 0
num dq 0
section .text
global main
main:
sub rsp, 56
again:
mov r8, [num]
add r8, 1
mov [num], r8
lea rcx, [msg]
mov rdx, [num]
call printf
cmp r8, 10
jge end
jmp again
end:
xor rax, rax
call ExitProcess
执行此打印:
1
2
3
4
5
6
7
8
9
10 ; <--- ??? don´t stop
11
12
13
14
15
16
17
18
19
20
21
[...]
但是到了10就应该停止了。为什么会这样呢?
寄存器
r8
在函数printf
内被覆盖(“破坏”)。 您需要在执行 cmp
指令之前从内存中重新加载它。 或者,您可以重新排列代码,以便 cmp
与代码一起完成以进行增量。