为什么在nasm中使用外部c函数会破坏这段代码?
我在使用外部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("%dn",a);
}
我得到的输出是第一次打印(如预期)的3和第二次打印的随机数。
我被告知printf()可能会更改cpu寄存器值而不恢复它们,所以我想在调用printf之前将所有寄存器保存在堆栈上会阻止任何寄存器发生变化,但显然它没有。
任何人都可以解释为什么奇怪的输出,我该如何解决它?
谢谢。
没有找到相关结果
已邀请:
1 个回复
弛保矮瘦敖
可能正在使用cdecl调用约定。根据该约定,调用者有责任从堆栈中删除推送的参数。 你应该写: