新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 匯編技術內幕(3)

        匯編技術內幕(3)

        作者: 時間:2016-11-24 來源:網絡 收藏
        局部變量棧分配
        下面我們分析一下C編譯器如何處理局部變量的分配,為此先給出如下程序:
        #vi test2.c
        int main()
        {
        int i;
        int j=2;
        i=3;
        i=++i;
        return i+j;
        }
        編譯該程序,產生二進制文件,并利用mdb來觀察程序運行中的stack的狀態:
        #gcc test2.c -o test2
        #mdb test2
        Loading modules: [ libc.so.1 ]
        > main::dis
        main: pushl %ebp
        main+1: movl %esp,%ebp ; main至main+1,創建Stack Frame
        main+3: subl $8,%esp ; 為局部變量i,j分配??臻g,并保證棧16字節對齊
        main+6: andl $0xf0,%esp
        main+9: movl $0,%eax
        main+0xe: subl %eax,%esp ; main+6至main+0xe,再次保證棧16字節對齊
        main+0x10: movl $2,-8(%ebp) ; 初始化局部變量j的值為2
        main+0x17: movl $3,-4(%ebp) ; 給局部變量i賦值為3
        main+0x1e: leal -4(%ebp),%eax ; 將局部變量i的地址裝入到EAX寄存器中
        main+0x21: incl (%eax) ; i++
        main+0x23: movl -8(%ebp),%eax ; 將j的值裝入EAX
        main+0x26: addl -4(%ebp),%eax ; i+j并將結果存入EAX,作為返回值
        main+0x29: leave ; 撤銷Stack Frame
        main+0x2a: ret ; main函數返回
        >
        通過mdb對程序運行時的寄存器和棧的觀察和分析,可以得出局部變量在棧中的訪問和分配及釋放方式:
        1.局部變量的分配,可以通過esp減去所需字節數
        subl $8,%esp
        2.局部變量的釋放,可以通過leave指令
        leave
        3.局部變量的訪問,可以通過ebp減去偏移量
        movl -8(%ebp),%eax
        addl -4(%ebp),%eax
        問題:當存在2個以上的局部變量時,如何進行棧對齊?
        在上篇文章中,提到subl $8,%esp語句除了分配棧空間外,還有一個作用就是棧對齊。那么本例中,由于i和j正好是8字節,那么如果存在2個以上的局部變量時,如何同時滿足空間分配和棧對齊呢?


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 开阳县| 个旧市| 许昌县| 临安市| 嘉荫县| 曲松县| 安达市| 喜德县| 刚察县| 正蓝旗| 姜堰市| 云梦县| 海口市| 芒康县| 华宁县| 翁源县| 龙陵县| 年辖:市辖区| 资兴市| 余姚市| 武安市| 宽甸| 乡城县| 桦南县| 托克逊县| 叙永县| 承德县| 甘德县| 临朐县| 宁强县| 涡阳县| 内江市| 遵化市| 滕州市| 比如县| 安国市| 屯留县| 上杭县| 台州市| 长岛县| 克东县|