作者: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
就成了程序中第一條被執行的指令。