(轉) 彙編.section和.text解釋

.section .data

彙編程序中以.開頭的名稱並非指令的助記符,不會被翻譯成機器指令,而是給彙編器一些特殊指示,稱爲彙編指示(Assembler Directive)或僞操做(Pseudo-operation),因爲它不是真正的指令因此加個「僞」字。.section指示把代碼劃分紅若干個段(Section),程序被操做系統加載執行時,每一個段被加載到不一樣的地址,操做系統對不一樣的頁面設置不一樣的讀、寫、執行權限。.data段保存程序的數據,是可讀可寫的,至關於C程序的全局變量。本程序中沒有定義數據,因此.data段是空的。編程

 .section .text

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

 .globl _start

_start是一個符號(Symbol),符號在彙編程序中表明一個地址,能夠用在指令中,彙編程序通過彙編器的處理以後,全部的符號都被替換成它所表明的地址值。在C語言中咱們經過變量名訪問一個變量,其實就是讀寫某個地址的內存單元,咱們經過函數名調用一個函數,其實就是跳轉到該函數第一條指令所在的地址,因此變量名和函數名都是符號,本質上是表明內存地址的。spa

.globl指示告訴彙編器,_start這個符號要被連接器用到,因此要在目標文件的符號表中標記它是一個全局符號。_start就像C程序的main函數同樣特殊,是整個程序的入口,連接器在連接時會查找目標文件中的_start符號表明的地址,把它設置爲整個程序的入口地址,因此每一個彙編程序都要提供一個_start符號而且用.globl聲明。若是一個符號沒有用.globl聲明,就表示這個符號不會被連接器用到。操作系統

_start:

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

相關文章
相關標籤/搜索