我不明白为什么我可以使用ebx
寄存器而不是{for循环的ecx
寄存器。
section .data
msg: db "Hello World",10,0
section .text
global _main
extern _printf
_main:
mov ebx, 5
push ebx
.next:
;push dword msg
push msg
call _printf
add esp,4
sub ebx, 1
jne .next
add esp,4
mov eax,0
ret
我认为call _printf
正在弄乱ecx寄存器,从而导致循环无限期地继续?
如何保留ecx寄存器,使其不受call _printf
?
答案 0 :(得分:1)
对于80x86的32位C调用约定;寄存器EAX,ECX和EDX是“调用者保存”。这意味着任何C函数都可以删除这些寄存器。
其余寄存器(EBX,ESI,EDI和EBP)是“被调用者保存”,不能被C函数破坏。
如果您想使用ECX而不是EBX;那么你必须做这样的事情:
.next:
push ecx ;Save ECX
push msg
call _printf
add esp,4
pop ecx ;Restore ECX
sub ecx, 1
jne .next
当然这只会降低代码效率。