Assembly 当循环装入程序集且增量仅打印一次时,可以';我不明白为什么(nasm)

Assembly 当循环装入程序集且增量仅打印一次时,可以';我不明白为什么(nasm),assembly,while-loop,counter,nasm,Assembly,While Loop,Counter,Nasm,我尝试过各种程序“printf”可能正在修改rax或rbx。因此,让我们在“printf”之前保留它们,并在“printf”之后恢复它们: mov-rax,0 mov rbx,6 WhileLoop: Cmp-rax,rbx;循环终止条件(rax过程“printf”可能正在修改rax或rbx。因此,让我们在“printf”之前保留它们,在“printf”之后恢复它们: mov-rax,0 mov rbx,6 WhileLoop: Cmp-rax,rbx;循环终止条件(rax就是这样!我不知道我是

我尝试过各种程序“printf”可能正在修改
rax
rbx
。因此,让我们在“printf”之前保留它们,并在“printf”之后恢复它们:

mov-rax,0
mov rbx,6
WhileLoop:

Cmp-rax,rbx;循环终止条件(rax过程“printf”可能正在修改
rax
rbx
。因此,让我们在“printf”之前保留它们,在“printf”之后恢复它们:

mov-rax,0
mov rbx,6
WhileLoop:

Cmp-rax,rbx;循环终止条件(rax就是这样!我不知道我是否能算出。还要注意,
al
当然是
rax
的最低有效字节,所以你自己已经销毁了
rax
。至于如何算出:1)阅读有关寄存器约定的ABI文档,2)使用调试器。PS:
rbx
printf
保留,但您也必须为您的调用者保留它。我删除了rbx=6并将rax更改为rbx。删除了所有的弹出/推送命令,它成功了!这就是为什么它没有保存它(al)。这不仅仅是“可能的”,这是意料之中的
RAX
用于函数的返回码。@DavidHoelzer,可能“printf”是由用户3866044创建的,所以最好发布一个“安全”的解决方案。就是这样!我不知道我会怎么想。还要注意,
al
当然是
rax
的最低有效字节,所以你自己已经销毁了
rax
。至于如何解决这个问题:1)阅读告诉您有关寄存器约定的ABI文档,2)使用调试器。PS:
rbx
printf
保留,但您也必须为您的调用者保留它。我删除了rbx=6并将rax更改为rbx。删除了所有的弹出/推送命令,它成功了!这就是为什么它没有保存它(al)。这不仅仅是“可能的”,这是意料之中的
RAX
用于函数的返回代码。@DavidHoelzer,可能“printf”是由用户3866044创建的,所以最好发布一个“安全”的解决方案。
    mov rax,0
    mov rbx,6
WhileLoop: 
    Cmp rax,rbx         ;loop termination condition (rax<6)
    jge WhileDone       ;if !<6, exit while loop
    mov rdi, message2   ;print message
    mov al, 0           ;print message
    call printf         ;print message
    inc rax             ;rax=rax+1
    jmp WhileLoop       ;next iteration 
WhileDone:
    mov rax,0
    mov rbx,6
WhileLoop: 
    Cmp rax,rbx         ;loop termination condition (rax<6)
    jge WhileDone       ;if !<6, exit while loop
    PUSH RAX
    PUSH RBX
    mov rdi, message2   ;print message
    mov al, 0           ;print message
    call printf         ;print message
    POP  RBX
    POP  RAX
    inc rax             ;rax=rax+1
    jmp WhileLoop       ;next iteration 
WhileDone: