代码之家  ›  专栏  ›  技术社区  ›  Scott

asm子例程处理c++文件中的int和char

  •  1
  • Scott  · 技术社区  · 15 年前

    3 回复  |  直到 10 年前
        1
  •  2
  •   Martin v. Löwis    15 年前

    这在很大程度上取决于你使用的微处理器。如果是x86,char将被加宽为int,然后这两个参数都在堆栈上传递。您可以通过编译执行对汇编代码的调用的C代码来了解自己,并检查汇编代码。

    例如,给定

    void LCD_byte (char byte, int cmd_data);
    
    void foo()
    {
       LCD_byte('a',100);
    }
    

    gcc在x86linux上生成代码

    foo:
            pushl   %ebp
            movl    %esp, %ebp
            subl    $8, %esp
            movl    $100, 4(%esp)
            movl    $97, (%esp)
            call    LCD_byte
            leave
            ret
    

        2
  •  1
  •   Goz    15 年前

    很大程度上取决于调用约定,而调用约定又取决于编译器。

    但99.9%的时间是两件事之一。它们要么被传递到寄存器中,要么被推送到堆栈中并在函数内部弹出。

        3
  •  0
  •   Stack Overflow is garbage    15 年前

    调用约定指定如何传递参数,哪些寄存器是调用方保存的,哪些寄存器是被调用方保存的,返回地址如何存储,以及正确实现可以从C调用的函数所需的一切(以及正确调用C函数所需的一切)