關(guān)于C代碼在linux中的匯編分析

作者 云青
原創(chuàng)作品轉(zhuǎn)載請(qǐng)注明出處

基本的匯編知識(shí):

movl辛臊,subl涂炎,pushl,topl宝磨,ret疮绷,addl翰舌,leave,enter

參考資料下載地址冬骚。http://pan.baidu.com/s/1cdISDC
課程地址:《Linux內(nèi)核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

一椅贱、準(zhǔn)備

創(chuàng)建文件,并進(jìn)行編譯

int g(int x)
{
  return x + 3;
}
 
int f(int x)
{
  return g(x);
}
 
int main(void)
{
  return f(8) + 1;
}

編譯命令:

gcc -S -o demo1.s demo1.c -m32

運(yùn)行完畢后生成如下文件:

    .file   "demo1.c"
    .text
    .globl  g
    .type   g, @function
g:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    movl    8(%ebp), %eax
    addl    $3, %eax
    popl    %ebp
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   g, .-g
    .globl  f
    .type   f, @function
f:
.LFB1:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $4, %esp
    movl    8(%ebp), %eax
    movl    %eax, (%esp)
    call    g
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE1:
    .size   f, .-f
    .globl  main
    .type   main, @function
main:
.LFB2:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $4, %esp
    movl    $8, (%esp)
    call    f
    addl    $1, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE2:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4"
    .section    .note.GNU-stack,"",@progbits

我們將命令簡(jiǎn)化得到如下匯編指令:

g:
    pushl   %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %eax
    addl    $3, %eax
    popl    %ebp
    ret

f:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $4, %esp
    movl    8(%ebp), %eax
    movl    %eax, (%esp)
    call    g
    leave
    ret

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

備注:
%開(kāi)頭表示寄存器
$開(kāi)頭表示立即數(shù)
()表示間接尋址只冻,樣例(GAS = C語(yǔ)言):(%eax)= *eax [2]
Imm(Ea) 庇麦,變址尋址,樣例(GAS = C語(yǔ)言):4(%eax) = *(4+eax)

二喜德、匯編指令執(zhí)行流程分析

我們以簡(jiǎn)化版為例:

編譯過(guò)后的匯編指令

C語(yǔ)言的都是從mian函數(shù)開(kāi)始運(yùn)行的山橄,同理,匯編也是從main函數(shù)開(kāi)始運(yùn)行的舍悯,下面我們來(lái)從main函數(shù)入手驾胆。
首先執(zhí)行的是18行pushl指令涣澡,
先畫(huà)出內(nèi)存的棧此時(shí)的情況:esp和ebp此時(shí)都指向棧底。

初始寄存器的指向情況

pushl %ebx ,即將數(shù)據(jù)壓棧丧诺,指令相當(dāng)于
subl $4, %esp
movl %ebx,(%esp)

  1. 執(zhí)行pushl %ebp之后入桂,eip指向下一條指令,變?yōu)椋?/li>
image.png

2驳阎、執(zhí)行movl %esp抗愁,%ebp,之后eip指向下一條指令呵晚,變?yōu)?/p>

image.png

3蜘腌、執(zhí)行 subl $4, %esp

subl $4, %esp

4、執(zhí)行movl $8, (%esp)

movl $8, (%esp)

5 饵隙、call f

call f等價(jià)于
pushl %eip
movl f %eip

call f

6 撮珠、pushl %ebp

pushl %ebp

7、movl %esp, %ebp

movl %esp, %ebp

8金矛、 subl $4, %esp

subl $4, %esp

9芯急、movl 8(%ebp), %eax

image.png

10、movl %eax, (%esp)

11驶俊、call g

12娶耍、

pushl %ebp
movl %esp,%ebp
每進(jìn)入一個(gè)函數(shù)都會(huì)執(zhí)行這兩個(gè)匯編指令
這兩步操作是個(gè)規(guī)范化步驟, 叫做前序(prologue) [1]。

前序

13饼酿、 movl 8(%ebp), %eax

14榕酒、addl $3,%eax

image.png

15、popl %ebp

popl %ebp 相當(dāng)于
movl (%esp)故俐,%ebp
addl $4想鹰,%esb

16、ret
等價(jià)于 popl %eip

ret

17药版、leave 等價(jià)于

movl %ebp,%esp
popl %ebp

leave

18杖挣、ret

ret

19、addl $1,%eax

addl

20 leave


image.png

21刚陡、ret
main函數(shù)運(yùn)行結(jié)束惩妇,將%eax的值返回,即12

參考文章:
[1] X86匯編調(diào)用框架淺析與CFI簡(jiǎn)介
[2] http://www.cnblogs.com/lxgeek/archive/2011/01/01/1923738.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筐乳,一起剝皮案震驚了整個(gè)濱河市歌殃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝙云,老刑警劉巖氓皱,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡波材,警方通過(guò)查閱死者的電腦和手機(jī)股淡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)廷区,“玉大人唯灵,你說(shuō)我怎么就攤上這事∠肚幔” “怎么了埠帕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)玖绿。 經(jīng)常有香客問(wèn)我敛瓷,道長(zhǎng),這世上最難降的妖魔是什么斑匪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任呐籽,我火速辦了婚禮,結(jié)果婚禮上蚀瘸,老公的妹妹穿的比我還像新娘狡蝶。我一直安慰自己,他們只是感情好苍姜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著悬包,像睡著了一般衙猪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上布近,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天垫释,我揣著相機(jī)與錄音,去河邊找鬼撑瞧。 笑死棵譬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的预伺。 我是一名探鬼主播订咸,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酬诀!你這毒婦竟也來(lái)了脏嚷?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瞒御,失蹤者是張志新(化名)和其女友劉穎父叙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趾唱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年涌乳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甜癞。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夕晓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出带欢,到底是詐尸還是另有隱情运授,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布乔煞,位于F島的核電站吁朦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏渡贾。R本人自食惡果不足惜逗宜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望空骚。 院中可真熱鬧纺讲,春花似錦、人聲如沸囤屹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肋坚。三九已至乡括,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間智厌,已是汗流浹背诲泌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铣鹏,地道東北人敷扫。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像诚卸,于是被迫代替她去往敵國(guó)和親葵第。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容