Linux內核分析實驗1——彙編一個簡單的C程序

實驗代碼

int g(int x)
{
return x + 3;
}

int f(int x)
{
return g(x);
}

int main(void)
{
return f(2) + 1;
}

彙編指令:gcc -S main.c

彙編結果

g:
    pushl   %ebp
    movl    %esp, %ebp
    movl    8(%ebp),%eax
    addl    $3, %eax
    popl    %ebp
    ret
f:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   8(%ebp)
    call    g
    addl    $4, %esp
    leave
    ret
main:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   $2
    call    f
    addl    $4, %esp
    addl    $1, %eax
    leave
    ret

分析:

程序從main函數開始
首先
pushl %ebp
movl %esp, %ebp
相當於enter指令,保存ebp的值,然後將ebp的值設爲esp,相當於保存原函數的堆棧,然後建立當前函數的堆棧,而且它還有這樣的功能,見下面的博客
http://blog.csdn.net/zhangxinrun/article/details/5888425

把立即數2壓棧,然後調用函數f
同樣enter一下
pushl 8(%ebp),將當前ebp所指向的堆棧位置向上數兩個的位置,也就是放2的那個位置,壓棧。
做一個變址尋址,即將2放入累加器eax中
累加器再加3,累加器爲5.
然後pop %ebp,相當於leave,由於g函數中沒有額外壓棧,所以沒做mov指令
返回f函數,
esp向上移動一個堆棧位置然後leave,
返回main
同樣esp向上移動一個堆棧位置然後leave,與此同時eax加1,得到最終值6
程序結束

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章