为什么在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之前将所有寄存器保存在堆栈上会阻止任何寄存器发生变化,但显然它没有。 任何人都可以解释为什么奇怪的输出,我该如何解决它? 谢谢。     
已邀请:
printint()
可能正在使用cdecl调用约定。根据该约定,调用者有责任从堆栈中删除推送的参数。 你应该写:
%macro pint 1
    pushad
    push %1
    call printint
    add esp, 4  ; Clean pushed parameter.
    popad
%endmacro
    

要回复问题请先登录注册