1. 程式人生 > >關於計算機將c程式碼轉換成彙編程式碼的過程描述

關於計算機將c程式碼轉換成彙編程式碼的過程描述

一、實驗截圖:

驗樓中的linux操作平臺上的指令程式碼:

最終轉換成的彙編程式碼:


二、彙編程式碼的分析

%ebp,%esp都指向棧頂

main函式開始:pushl  %ebp——實際上就是把ebp的值放入,即ebp的值0放入第一個棧;

                             movl   %esp,%ebp——%esp指向1的位置(移動4個位元組),%ebp也指向1的標號位置;

                            subl      $4,%esp——%esp指向的位置向下移動一個位置,即為2的位置;

                            movl     $9,(%esp)——就是將9指向%esp的位置;

                           call       f ——就是在2的位置加上eip,eip指向f,ebp指向下一個位置;

此時跳轉到f的位置,則從f的位置開始執行:

                           pushl  %ebp——把ebp指向4的位置,esp也指向4的位置;

                          movl    %esp,%ebp——即%esp也指向4的位置;

                            movl   8(%ebp),%esp——也即此時esp的值就是8;

                           call    g——跳轉到g的位置,即eip指向g的位置;

跳轉到g的位置,類似於f。

leave相當於這兩條指令:movl %ebp,%esp

                                              pop%ebp 

他是:因為esp指向esp的位置,此時為4.

popl %ebp——相當於指向最初始的位置。

整函式的堆疊就是先向下增長,然後再向上還原。將程式變成了指令流。

三、總結:

將c程式碼轉換成彙編程式碼的過程,就是整函式的堆疊的向下增長和向上還原的過程。

                                                                                                                                                                                               莊華健

                                                                                                                                                  Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000