为什么我的汇编程序在达到值 10 后仍继续执行,即使比较正确?

问题描述 投票:0回答:1

我正在汇编 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就应该停止了。为什么会这样呢?

assembly logic x86-64 nasm
1个回答
0
投票

寄存器

r8
在函数
printf
内被覆盖(“破坏”)。 您需要在执行
cmp
指令之前从内存中重新加载它。 或者,您可以重新排列代码,以便
cmp
与代码一起完成以进行增量。

© www.soinside.com 2019 - 2024. All rights reserved.