与 c++ 程序链接后,如何在 asm 子例程中处理 int 和 char?例如 extern "C" void LCD_ byte (char byte, int cmd_data); LCD_byte 如何处理“byte”和“cmd_data”?如何访问汇编代码中的“byte”和“cmd_data”?
scott
问问题
384 次
3 回答
2
这在很大程度上取决于您使用的微处理器。如果是x86,char会加宽为int,然后两个参数都传到栈上。您可以通过将调用汇编代码的 C 代码编译并检查汇编代码来发现自己。
例如,给定
void LCD_byte (char byte, int cmd_data);
void foo()
{
LCD_byte('a',100);
}
gcc 在 x86 Linux 上生成代码
foo:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $100, 4(%esp)
movl $97, (%esp)
call LCD_byte
leave
ret
如您所见,两个值都被压入堆栈(因此“a”在顶部),然后对目标例程进行调用指令。因此,目标例程可以在 esp+4 处找到第一个传入的参数。
于 2009-10-02T15:05:41.337 回答
1
好吧,很大程度上取决于调用约定,而AFAIK又取决于编译器。
但是 99.9%% 的时间它是两件事之一。它们要么在寄存器中传递,要么被压入堆栈并在函数内部弹出。
于 2009-10-02T15:01:54.517 回答
0
查找适用于您平台的文档。它告诉您 C 使用哪种调用约定。
调用约定指定如何传递参数,哪些寄存器是调用者保存的,哪些是被调用者保存的,如何存储返回地址以及正确实现可以从 C 调用的函数所需的所有其他内容。(以及所有您需要正确调用 C 函数)
于 2009-10-02T17:04:29.820 回答