为什么在nasm中使用外部c函数会破坏这段代码?

时间:2010-12-25 18:03:51

标签: c assembly external nasm

使用外部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之前保存堆栈上的所有寄存器会阻止任何寄存器更改,但显然它不会。 任何人都可以解释为什么奇怪的输出以及如何解决它?

感谢。

1 个答案:

答案 0 :(得分:5)

printint()可能正在使用cdecl调用约定。根据该约定,调用者有责任从堆栈中删除推送的参数。

你应该写:

%macro pint 1
    pushad
    push %1
    call printint
    add esp, 4  ; Clean pushed parameter.
    popad
%endmacro