题
我哲理有栈一点点的目的,一些编码后,我想通了,什么是它的强度。这在于我的胃痛唯一的一点是它是如何与职能的工作?我试图做一些简单的功能使用的通用寄存器两数相加,但我想这是不是它是如何用C的工作例如..哪里都是参数,局部变量和在哪里存储的结果?
你会如何改写这个汇编器?(如何将编译器对C重写一遍?)
int function(int a, int &b, int *c){
return a*(b++)+(*c);
}
我知道这个例子中有点吸..但这样我可以理解一切准备
解决方案
你所寻找的是如何调用约定的信息。该函数的调用和返回的方式取决于许多因素,包括处理器架构,编译器和操作系统。的主叫用户和被叫必须上,以便在约定的参数和返回值同意被正确地传递。
其他提示
首先,参考(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
)。现在我们给克++的-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
给出了相同的代码;有没有真正别的优化。
有乐趣装配玩耍。 ^ _ ^
不隶属于 StackOverflow