汇编程序中的函数

Pyj*_*ong 3 assembly callstack function

我已经对堆栈的目的进行了哲学思考,经过一些编码后,我发现它的强度是什么.我的胃口唯一的东西是它如何与功能一起使用?我尝试使用通用寄存器添加两个数字做一些简单的功能,但我想这不是它在C中的工作方式,例如..所有参数,局部变量和存储结果在哪里?

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

int function(int a, int &b, int *c){
 return a*(b++)+(*c);
}
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*otz 5

您正在寻找的是有关呼叫约定的信息.调用和返回函数的方式取决于许多因素,包括处理器体系结构,编译器和操作系统.调用者和被调用者必须就约定达成一致,以便正确传递参数和返回值.


Mik*_*one 5

首先,references(int&)不在C中,只是C++.

如果你想通过gcc查看引擎盖下发生的事情,请使用-S标志.您不需要拥有实际的程序.

g++ -S func.c
Run Code Online (Sandbox Code Playgroud)

创建一个文件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
Run Code Online (Sandbox Code Playgroud)

注意C++名称mangling(__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
Run Code Online (Sandbox Code Playgroud)

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

玩得开心玩乐.^ _ ^