我哲理有栈一点点的目的,一些编码后,我想通了,什么是它的强度。这在于我的胃痛唯一的一点是它是如何与职能的工作?我试图做一些简单的功能使用的通用寄存器两数相加,但我想这是不是它是如何用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给出了相同的代码;有没有真正别的优化。

有乐趣装配玩耍。 ^ _ ^

什么亚伦说有关调用约定是正确的答案。到话题我个人的探索,我发现砸堆栈的乐趣和利润是当它损坏堆栈帧中的作用,有什么了不起的锻炼可能发生。芬利我建议总成底漆黑客其越过重要汇编概念,以及有趣的事情,你可以用你的调试器做的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top