亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

C程序匯編運行模式簡析

2024-06-28 13:21:41
字體:
來源:轉載
供稿:網友
C程序匯編運行模式簡析

SJTUBEAR 原創作品轉載請注明出處 /《linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000

1. 匯編

在修習LINUX內核這門課的初始階段,首先需要掌握的就是匯編以及匯編程序對于堆棧的操作。

下面我們就來分析一下一個簡單地C程序是如何被匯編程序所表達的!

2. 得到匯編代碼

首先,我們寫一個簡單地C程序,命名為exp1.c:

 1 #include <stdio.h> 2  3 int g(int x) 4 { 5     return x+3; 6 } 7  8 int f(x) 9 {10     return g(x);11 }12 13 int main()14 {15     return f(8)+1;    16 }

程序非常的簡單,我們此時再通過編譯指令將其編譯為匯編程序:

1 gcc –S –o main.s main.c -m32

這樣我們就得到了這個簡單C程序的匯編代碼:

 1     .file    "exp1.c" 2     .text 3     .globl    g 4     .type    g, @function 5 g: 6 .LFB0: 7     .cfi_startPRoc 8     pushl    %ebp 9     .cfi_def_cfa_offset 810     .cfi_offset 5, -811     movl    %esp, %ebp12     .cfi_def_cfa_register 513     movl    8(%ebp), %eax14     addl    $3, %eax15     popl    %ebp16     .cfi_def_cfa 4, 417     .cfi_restore 518     ret19     .cfi_endproc20 .LFE0:21     .size    g, .-g22     .globl    f23     .type    f, @function24 f:25 .LFB1:26     .cfi_startproc27     pushl    %ebp28     .cfi_def_cfa_offset 829     .cfi_offset 5, -830     movl    %esp, %ebp31     .cfi_def_cfa_register 532     subl    $4, %esp33     movl    8(%ebp), %eax34     movl    %eax, (%esp)35     call    g36     leave37     .cfi_restore 538     .cfi_def_cfa 4, 439     ret40     .cfi_endproc41 .LFE1:42     .size    f, .-f43     .globl    main44     .type    main, @function45 main:46 .LFB2:47     .cfi_startproc48     pushl    %ebp49     .cfi_def_cfa_offset 850     .cfi_offset 5, -851     movl    %esp, %ebp52     .cfi_def_cfa_register 553     subl    $4, %esp54     movl    $8, (%esp)55     call    f56     addl    $1, %eax57     leave58     .cfi_restore 559     .cfi_def_cfa 4, 460     ret61     .cfi_endproc62 .LFE2:63     .size    main, .-main64     .ident    "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"65     .section    .note.GNU-stack,"",@progbits
3.匯編代碼分析

匯編出的代碼,多了很多輔助信息,為了能夠更好地看清主干,我們刪減一下:

 1 g: 2     pushl    %ebp            //保存現場,將父函數的棧底寄存器存入當前程序棧中 3     movl    %esp, %ebp      //構建當前函數堆棧 4     movl    8(%ebp), %eax   //從父函數堆棧中取得參數,存入ax寄存器 5     addl    $3, %eax        //完成+3操作 6     popl    %ebp            //恢復原父函數堆棧 7     ret                     //pop出原Eip地址,恢復執行 8 f: 9     pushl    %ebp            //保存現場,將父函數的棧底寄存器存入當前程序棧中10     movl    %esp, %ebp      //構建當前函數堆棧11     subl    $4, %esp        //棧頂加一,用以儲存變量傳遞給g函數12     movl    8(%ebp), %eax   //取得參數13     movl    %eax, (%esp)    //將參數傳入變量位置14     call    g               //調用g15     leave                   //清楚局部變量空間16     ret                     //返回17 main:18     pushl    %ebp19     movl    %esp, %ebp20     subl    $4, %esp        //空出局部變量空間21     movl    $8, (%esp)      //為變量賦值22     call    f               //調用f23     addl    $1, %eax        //完成+1操作24     leave                   //清理局部變量25     ret                     //返回

我們對f函數進行詳細的分析:

1. 首先進行enter指令:

此時,ebp當前所指向的位置存入棧頂,并且將ebp重定向指向esp:

2.棧頂加一并存入變量值:

3.調用g

4.從g返回后,返回值儲存在AX寄存器中,不用操作,調用leave,清理變量

5.最后ret,同時EIP被讀出恢復到原位置繼續執行,返回值在AX中傳遞給調用函數

3.個人的一點感悟:

程序的調用就是這樣嵌套的執行下去,每個函數都有自己的堆棧用以儲存當前變量以及環境值,并通過將父函數的EBP放入棧底用以恢復環境。

同時EIP存入父棧棧頂,便于恢復到原節點處繼續執行。

這樣,就可以有規律的一直嵌套下去。

如果使用遞歸函數,就是一個碼堆棧的過程,知道最頂部的堆棧返回,函數就像多米諾骨牌一樣收回所有的堆棧。

這也是遞歸函數占用空間比較多的原因之一。如果沒有很好地退出機制,有可能內存溢出。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91国内免费在线视频| 欧美特黄级在线| 国产日产亚洲精品| 69久久夜色精品国产69乱青草| 国产精品99一区| 国产91|九色| 亚洲xxxx做受欧美| 国产精品久久不能| 精品日本美女福利在线观看| 欧美美最猛性xxxxxx| 国产精品欧美一区二区| 亚洲人成77777在线观看网| 亚洲精品v天堂中文字幕| 日韩亚洲精品视频| 日韩欧美a级成人黄色| 亚洲精品视频播放| 国产精品一区专区欧美日韩| 国产一区二区美女视频| 亚洲色图色老头| 日韩美女视频中文字幕| 91精品视频观看| 精品国产视频在线| 日韩av电影院| 欧美人在线观看| 日韩欧美极品在线观看| 亚洲女同性videos| 一区二区三区美女xx视频| 少妇高潮 亚洲精品| 欧洲成人免费aa| 久久久久久中文字幕| 日韩在线不卡视频| xxav国产精品美女主播| 久精品免费视频| 久久久999国产精品| 国内精品久久影院| 97热在线精品视频在线观看| 91成人精品网站| 国产精品爽爽爽| 亚洲欧美日韩国产精品| 韩国福利视频一区| 色伦专区97中文字幕| 欧美精品久久久久久久久久| 国产精品免费小视频| 亚洲最大福利网站| 国产精品久久久久久五月尺| 日本三级韩国三级久久| 一区二区三区视频免费在线观看| 久久97精品久久久久久久不卡| 欧美日韩一区二区三区在线免费观看| 久久久久女教师免费一区| 亚洲精品视频网上网址在线观看| 亚洲国产成人久久| 国产国语videosex另类| 夜夜嗨av一区二区三区免费区| 成人看片人aa| 成人久久久久爱| 欧美性受xxx| 国产一区在线播放| 亚洲第一精品电影| 九九视频直播综合网| 国产精品国产自产拍高清av水多| 66m—66摸成人免费视频| 国产精品高潮在线| 中文字幕亚洲色图| 亚洲欧美另类在线观看| 亚洲国产精品人人爽夜夜爽| 欧美国产日本在线| 国产美女扒开尿口久久久| 国产精品成人在线| 欧美巨大黑人极品精男| 国产亚洲精品激情久久| 国产精品精品视频一区二区三区| 欧美亚洲国产日韩2020| 国产精品视频999| 亚洲国产精品美女| 日韩亚洲精品电影| 午夜精品久久久久久久白皮肤| 欧美成人一二三| 久久国产精品久久久久久久久久| 精品性高朝久久久久久久| 亚洲国模精品一区| 亚洲成人av在线| 欧美孕妇孕交黑巨大网站| 欧美wwwwww| 爽爽爽爽爽爽爽成人免费观看| 日韩av电影在线播放| 丰满岳妇乱一区二区三区| 中文字幕少妇一区二区三区| 亚洲人成电影网| 川上优av一区二区线观看| 精品福利一区二区| 亚洲欧美精品一区| 国产欧美日韩丝袜精品一区| 中文字幕精品久久久久| 亚洲国产精品久久久| 日韩有码在线电影| 国产精品亚洲аv天堂网| 久久国产精品久久久久| 97在线视频免费观看| 久久久久久18| 欧美日韩福利视频| 96精品久久久久中文字幕| 久久久www成人免费精品张筱雨| 日韩电影免费在线观看中文字幕| 正在播放欧美视频| 久久91亚洲精品中文字幕奶水| 久热在线中文字幕色999舞| 欧美精品videossex性护士| 91色视频在线导航| 亚洲在线观看视频| 成人有码视频在线播放| 日本精品va在线观看| 丝袜美腿精品国产二区| 一区二区三区无码高清视频| 国产成人精品一区二区| 国产成人精品视频在线观看| 欧美伊久线香蕉线新在线| 亚洲美女av网站| 日韩av网站大全| 亚洲综合中文字幕在线观看| 国产精品免费一区二区三区都可以| 久久精品99无色码中文字幕| 精品在线小视频| 国产精品视频午夜| 亚洲精品98久久久久久中文字幕| 国产亚洲人成网站在线观看| 激情懂色av一区av二区av| 国产精品一区二区久久| 欧美日韩国产二区| 26uuu亚洲伊人春色| 久久久久久久久久av| 国产99久久精品一区二区 夜夜躁日日躁| 久久久久国产精品免费网站| 国产精品欧美在线| 国产成人精品日本亚洲| 亚洲国产第一页| 国产欧美一区二区三区在线看| 亚洲国产精彩中文乱码av| 国模gogo一区二区大胆私拍| 亚洲成人动漫在线播放| 最新69国产成人精品视频免费| 日韩av在线免费观看一区| 久久免费视频网站| 欧美激情一级二级| 日本中文字幕成人| 中文字幕久久久| 日韩av在线影视| 国产男女猛烈无遮挡91| 日韩欧美在线视频| 日韩中文字幕精品视频| 国产一区二区在线免费视频| 国产在线观看精品一区二区三区| 欧美精品videosex性欧美| 青草青草久热精品视频在线观看| 97色伦亚洲国产| 国产精品自产拍高潮在线观看| 亚洲一区美女视频在线观看免费| 欧美日韩在线一区| 亚洲情综合五月天| 国产亚洲精品久久久优势| 久久久亚洲国产| 亚洲视频日韩精品| 亚洲乱码国产乱码精品精| 欧美一级高清免费|