【轉】linux匯編.section .text .data 與.global


作者:Reesun

鏈接:http://blog.chinaunix.net/uid-20548989-id-1667484.html
來源:Chinaunix

 

感謝!

 

 

----------------------------------------------------------------------------------------------------------------------

 
.section .data

匯編程序中以.開頭的名稱並不是指令的助記符,不會被翻譯成機器指令,而是給匯編器一些特殊指示,稱為匯編指示(Assembler Directive)或偽操作(Pseudo-operation),由於它不是真正的指令所以加個“偽”字。.section指示把代碼划分成若干個段(Section),程序被操作系統加載執行時,每個段被加載到不同的地址,操作系統對不同的頁面設置不同的讀、寫、執行權限。.data段保存程序的數據,是可讀可寫的,相當於C程序的全局變量。本程序中沒有定義數據,所以.data段是空的。

 .section .text

.text段保存代碼,是只讀和可執行的,后面那些指令都屬於.text段。

 .globl _start

_start是一個符號(Symbol),符號在匯編程序中代表一個地址,可以用在指令中,匯編程序經過匯編器的處理之后,所有的符號都被替換成它所代表的地址值。在C語言中我們通過變量名訪問一個變量,其實就是讀寫某個地址的內存單元,我們通過函數名調用一個函數,其實就是跳轉到該函數第一條指令所在的地址,所以變量名和函數名都是符號,本質上是代表內存地址的。

.globl指示告訴匯編器,_start這個符號要被鏈接器用到,所以要在目標文件的符號表中標記它是一個全局符號(在第 5.1 節 “目標文件”詳細解釋)。_start就像C程序的main函數一樣特殊,是整個程序的入口,鏈接器在鏈接時會查找目標文件中的_start符號代表的地址,把它設置為整個程序的入口地址,所以每個匯編程序都要提供一個_start符號並且用.globl聲明。如果一個符號沒有用.globl聲明,就表示這個符號不會被鏈接器用到。

_start:

這里定義了_start符號,匯編器在翻譯匯編程序時會計算每個數據對象和每條指令的地址,當看到這樣一個符號定義時,就把它后面一條指令的地址作為這個符號所代表的地址。而_start這個符號又比較特殊,它所代表的地址是整個程序的入口地址,所以下一條指令movl $1, %eax就成了程序中第一條被執行的指令。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM