了解C函数调用生成的程序集

Joh*_*ith 5 c assembly

        .file   "calc.c"
        .text
.globl calc
        .type   calc, @function
calc:
        pushl   %ebp     
        movl    %esp, %ebp 
        movl    8(%ebp), %edx
        movl    16(%ebp), %ecx  
        leal    (%edx,%edx,2), %edx 
        movl    12(%ebp), %eax 
        leal    (%edx,%eax,2), %eax
        movl    %ecx, %edx
        sall    $4, %edx
        subl    %ecx, %edx
        addl    %edx, %eax
        popl    %ebp
        ret
        .size   calc, .-calc
        .ident  "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
        .section        .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)

我试图了解这个汇编代码发生了什么.我通过键入gcc -O1 -S calc.c生成一个calc.s程序集文件来创建它.

有人可以calc.c逐行解释(就增加和增加而言)正在发生的事情吗?

原始的C代码是:

int calc(int x, int y, int z)
{
        return 3*x + 2*y + 15*z;
}
Run Code Online (Sandbox Code Playgroud)

har*_*old 9

好的,现在它做了一些事情,我会为你做一些注释

calc:
    pushl   %ebp           ; \
    movl    %esp, %ebp     ; /  set up basic stack frame
    movl    8(%ebp), %edx  ; load x
    movl    16(%ebp), %ecx ; load z
    leal    (%edx,%edx,2), %edx ; calculate x + 2 * x
    movl    12(%ebp), %eax ; load y
    leal    (%edx,%eax,2), %eax ; calculate (x + 2 * x) + (2 * y)
    movl    %ecx, %edx     ; make a temp copy of z
    sall    $4, %edx       ; calculate z * 16
    subl    %ecx, %edx     ; calculate (z * 16) - z
    addl    %edx, %eax     ; calculate final sum
    popl    %ebp
    ret
Run Code Online (Sandbox Code Playgroud)

  • 令人惊讶的是,"16z-z"比"15z"更受欢迎.很棒的问题和答案! (4认同)