gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:27:43 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com