使用外部c函数调试我的nasm程序时遇到了问题。
%macro pint 1
pushad
push %1
call printint
popad
%endmacro
section .text
extern printint
global main
main:
mov eax, 3
pint eax
dec eax
pint eax
mov eax,1
mov ebx,0
int 0x80
虽然printint的定义如下:
void printint(int a) {
printf("%d\n",a);
}
我得到的输出是第一次打印时的3(如预期)和第二次打印时的随机数。 我被告知printf()可能会更改cpu寄存器值而不恢复它们,所以我想在调用printf之前保存堆栈上的所有寄存器会阻止任何寄存器更改,但显然它不会。 任何人都可以解释为什么奇怪的输出以及如何解决它?
感谢。
答案 0 :(得分:5)
printint()
可能正在使用cdecl调用约定。根据该约定,调用者有责任从堆栈中删除推送的参数。
你应该写:
%macro pint 1
pushad
push %1
call printint
add esp, 4 ; Clean pushed parameter.
popad
%endmacro