【问题标题】:functions in assembler汇编器中的函数
【发布时间】:2010-03-10 18:42:24
【问题描述】:

我对堆栈的目的进行了一些哲学思考,经过一些编码后,我弄清楚了它的优势。唯一在我胃里的就是它是如何与功能一起工作的?我尝试使用通用寄存器创建一些简单的函数来添加两个数字,但我想这不是它在 C 中的工作方式。所有参数、局部变量和结果存储在哪里?

你将如何将它重写为汇编器?(C 的编译器将如何重写它?)

int function(int a, int &b, int *c){
 return a*(b++)+(*c);
}

我知道这个例子有点糟糕.. 但是这样我就可以理解所有的可能性

【问题讨论】:

    标签: assembly function callstack


    【解决方案1】:

    您要查找的是有关calling conventions 的信息。函数的调用和返回方式取决于很多因素,包括处理器架构、编译器和操作系统。调用者和被调用者必须就约定达成一致,才能正确传递参数和返回值。

    【讨论】:

    【解决方案2】:

    首先,引用 (int&) 不在 C 中,而在 C++ 中。

    如果您想了解 gcc 的幕后情况,请使用 -S 标志。你不需要有一个实际的程序。

    g++ -S func.c
    

    创建一个文件func.s,其中包含(减去标题等,在 x86 盒子上):

        .text
    .globl __Z8functioniRiPi
    __Z8functioniRiPi:
    LFB2:
        pushq   %rbp
    LCFI0:
        movq    %rsp, %rbp
    LCFI1:
        movl    %edi, -4(%rbp)
        movq    %rsi, -16(%rbp)
        movq    %rdx, -24(%rbp)
        movq    -16(%rbp), %rax
        movl    (%rax), %edx
        movl    %edx, %ecx
        imull   -4(%rbp), %ecx
        movq    -24(%rbp), %rax
        movl    (%rax), %eax
        addl    %eax, %ecx
        incl    %edx
        movq    -16(%rbp), %rax
        movl    %edx, (%rax)
        movl    %ecx, %eax
        leave
        ret
    

    注意 C++ 名称修改 (__Z8functioniRiPi)。现在我们给 g++ -O2 标志:

        .text
        .align 4,0x90
    .globl __Z8functioniRiPi
    __Z8functioniRiPi:
    LFB2:
        pushq   %rbp
    LCFI0:
        movq    %rsp, %rbp
    LCFI1:
        movl    (%rsi), %ecx
        movl    %ecx, %eax
        imull   %edi, %eax
        addl    (%rdx), %eax
        incl    %ecx
        movl    %ecx, (%rsi)
        leave
        ret
    

    -O3 给出相同的代码;真的没有什么可以优化的了。

    玩得开心组装。 ^_^

    【讨论】:

      【解决方案3】:

      Aaron 关于调用约定的说法是正确的答案。对于我个人对该主题的探索,我发现Smashing the Stack For Fun and Profit 是一个很好的堆栈框架角色练习,以及当它被损坏时会发生什么。 Finlay 我推荐assembly primer for hackers,它涵盖了重要的汇编器概念以及您可以用调试器做的有趣的事情。

      【讨论】:

      • maaan!!!那个视频... huaaaahh !解释了一切,即使是那些令人沮丧的段寄存器现在我也清楚了! T H X A L O T!!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 2015-08-21
      • 1970-01-01
      • 2011-09-04
      • 2013-02-09
      • 2011-04-20
      相关资源
      最近更新 更多