使用外部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/

10-11 18:45