c++ - asm 子例程处理来自 C++ 文件的 int 和 char

标签 c++ assembly char int

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

最佳答案

这在很大程度上取决于您使用的微处理器。如果是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处找到第一个传入参数。

关于c++ - asm 子例程处理来自 C++ 文件的 int 和 char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1510064/

相关文章:

c++ - SIGPROF 在使用 google perftools 时杀死了我的服务器

c# - 比较和对比 C++ 与 C# 命名空间层次结构

c++ - 在嵌入式 x86 程序集中添加数组?

c++ - 支持两个具有不同语义的整数构造函数

c++ - XCode 8 链接器 (ld) 抑制警告

c++ - gcc 的 asm volatile 是否等同于递归的 gfortran 默认设置?

c - map exe反编译回C语言

C++ 连接字符串导致 "invalid operands of types ‘const char*’ 和 ‘const char"

java - 使用 Character.getNumericValue() 时出错

检查数组索引是数字还是字母?