使用外部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之前将所有寄存器保存在堆栈中将防止任何寄存器更改,但显然不会。
谁能解释为什么奇怪的输出,我该如何解决?
谢谢。
最佳答案
printint()
可能正在使用cdecl调用约定。根据该约定,调用者有责任从堆栈中删除推送的参数。
您应该写:
%macro pint 1
pushad
push %1
call printint
add esp, 4 ; Clean pushed parameter.
popad
%endmacro
关于c - 为什么在nasm中使用外部c函数会破坏此代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4531119/