彙編1 最簡單的彙編小程式

2021-05-27 09:12:41 字數 1843 閱讀 9407

.section .data

.sesion .text

.globl _start

_start

movl $1, %eax

movel $4 %ebx

int $0x80

解析:.section .data

.開頭的名稱並不是指令的助記符,不會被翻譯成機器指令,而是給彙編器一些特殊指示,稱為彙編指示(assembler directive)或偽操作(pseudo-operation),由於它不是真正的指令所以加個「偽」字。.section指示把**劃分成若干個段(section),程式被作業系統載入執行時,每個段被載入到不同的位址,作業系統對不同的頁面設定不同的讀、寫、執行許可權。.data段儲存程式的資料,是可讀可寫的,相當於c程式的全域性變數。本程式中沒有定義資料,所以.data段是空的。

.section .text

.text段儲存**,是唯讀和可執行的,後面那些指令都屬於.text段

.globl _start

.globl指示告訴彙編器,_start這個符號要被鏈結器用到,所以要在目標檔案的符號表中標記它是乙個全域性符號。_start就像c程式的main函式一樣特殊,是整個程式的入口,鏈結器在鏈結時會查詢目標檔案中的_start符號代表的位址,把它設定為整個程式的入口位址,所以每個匯程式設計序都要提供乙個_start符號並且用.globl宣告。如果乙個符號沒有用.globl宣告,就表示這個符號不會被鏈結器用到。

_start

這裡定義了_start符號,彙編器在翻譯匯程式設計序時會計算每個資料物件和每條指令的位址,當看到這樣乙個符號定義時,就把它後面一條指令的位址作為這個符號所代表的位址。而_start這個符號又比較特殊,它所代表的位址是整個程式的入口位址,所以下一條指令movl $1, %eax就成了程式中第一條被執行的指令。

movl $1, %eax

這是一條資料傳送指令,這條指令要求cpu內部產生乙個數字1並儲存到eax暫存器中。mov的字尾l表示long,說明是32位的傳送指令。這條指令不要求cpu讀記憶體,1這個數是在cpu內部產生的,稱為立即數(immediate)。在匯程式設計序中,立即數前面要加$,暫存器名前面要加%,以便跟符號名區分開。以後我們會看到mov指令還有另外幾種形式,但資料傳送方向都是一樣的,第乙個運算元總是源運算元,第二個運算元總是目標運算元。

movl $4, %ebx

與以上類似

int $0x80

前兩條指令都是為這條指令做準備的,執行這條指令時發生以下動作:

int指令稱為軟中斷指令,可以用這條指令故意產生乙個異常,上一章講過,異常的處理和中斷類似,cpu從使用者模式切換到特權模式,然後跳轉到核心**中執行異常處理程式。

int指令中的立即數0x80是乙個引數,在異常處理程式中要根據這個引數決定如何處理,在linux核心中int $0x80這種異常稱為系統呼叫(system call)。核心提供了很多系統服務供使用者程式使用,但這些系統服務不能像庫函式(比如printf)那樣呼叫,因為在執行使用者程式時cpu處於使用者模式,不能直接呼叫核心函式,所以需要通過系統呼叫切換cpu模式,經由異常處理程式進入核心,使用者程式只能通過暫存器傳幾個引數,之後就要按核心設計好的**路線走,而不能由使用者程式隨心所欲,想調哪個核心函式就調哪個核心函式,這樣可以保證系統服務被安全地呼叫。在呼叫結束之後,cpu再切換回使用者模式,繼續執行int $0x80的下一條指令,在使用者程式看來就像函式呼叫和返回一樣。

eax和ebx的值是傳遞給系統呼叫的兩個引數。eax的值是系統呼叫號,linux的各種系統呼叫都是由int $0x80指令引發的,核心需要通過eax判斷使用者要調哪個系統呼叫,_exit的系統呼叫號是1。ebx的值是傳給_exit的引數,表示退出狀態。大多數系統呼叫完成之後會返回使用者空間繼續執行後面的指令,而_exit系統呼叫比較特殊,它會終止掉當前程序,而不是返回使用者空間繼續執行。

最簡單的AT T匯程式設計序

把這個程式儲存成檔案start.s 匯程式設計序通常以.s作為檔名字尾 用彙編器 assembler as把匯程式設計序中的助記符翻譯成機器指令,生成目標檔案start.o as start.s o start.o 然後用鏈結器 linker,或link editor ld把目標檔案start.o鏈...

簡單C語言程式的彙編分析1

源程式如下 include int main 通過vc 6.0 的反彙編檢視,如下 1 include 2 int main 3 0040102a popedi 彈出值,放入 edi暫存器中,esp 4 0040102bpopesi 彈出值,放入 esi暫存器中,esp 4 0040102c pop...

兩個彙編小程式

開發環境為emu8086!1 begin name run nian project to check if it s run nian.propmt macro ppt 定義輸出巨集 mov dx,offset ppt mov ah,09h int 21h endm stack segment d...