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)
我知道这个例子有点糟透..但这样我就能理解所有的可能性
首先,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给出相同的代码; 没有什么可以优化的.
玩得开心玩乐.^ _ ^
| 归档时间: |
|
| 查看次数: |
1443 次 |
| 最近记录: |