關於計算機將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