Assembly 当循环装入程序集且增量仅打印一次时,可以';我不明白为什么(nasm)
我尝试过各种程序“printf”可能正在修改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就是这样!我不知道我是
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: