1. 程式人生 > >《linux核心分析》作業一:反彙編一個C語言程式並分析彙編程式碼執行過程

《linux核心分析》作業一:反彙編一個C語言程式並分析彙編程式碼執行過程

楊新峰原創作品轉載請註明出處  《Linux核心分析》 MOOC課程http://mooc.study.163.com/course/USTC-1000029000 

實驗環境:實驗樓網站64位linux虛擬機器

原始碼如下:

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

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

int main(){
    return f(6)+2;
}

使用


編譯並檢視彙編原始碼。

將得到的彙編原始碼中前面帶“.”符號的語句刪去,得到精簡的彙編程式碼,如下圖



這段程式碼在記憶體中的工作情況:

首先分析main函式程式碼段,假設ebp起始指向1000;

記憶體示意圖:


18:pushl %ebp  ;將ebp壓棧


19:movl %esp,%ebp  ;將esp的值賦給ebp


20:subl $4,%esp  ;esp-4


21:movl    $6,(%esp)


22:call  f  相當於movl f(f標記的地址),%eip;


9:pushl %ebp


10:movl    %esp,%ebp


11:subl    $4,%esp


12:movl    8(%ebp),%eax


13:movl    %eax,(%esp)


14:call    g


2:pushl   %ebp


3:movl    %esp,%ebp


4:movl    8(%ebp),%eax


5:addl    $5, %eax


6:popl    %ebp


7:ret  相當於popl %eip


15:leave 相當於movl %ebp,%esp;  popl %ebp;


16:ret 


23:addl    $2, %eax


24:leave


25:ret