1

与 c++ 程序链接后,如何在 asm 子例程中处理 int 和 char?例如 extern "C" void LCD_ byte (char byte, int cmd_data); LCD_byte 如何处理“byte”和“cmd_data”?如何访问汇编代码中的“byte”和“cmd_data”?

4

3 回答 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 回答