簡體   English   中英

了解C函數調用生成的程序集

[英]Understanding assembly generated by C function call

        .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

我試圖了解這個匯編代碼發生了什么。 我通過輸入生成calc.s assembly文件的gcc -O1 -S calc.c來創建它。

有人可以calc.c解釋(根據calc.c中的加法和乘法)發生了什么嗎?

原始的C代碼是:

int calc(int x, int y, int z)
{
        return 3*x + 2*y + 15*z;
}

好的,現在它做了一些事情,我會為你做一些注釋

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM