匯程式設計序 退出

2021-07-03 19:16:20 字數 2383 閱讀 6043

作為第乙個匯程式設計序,本程式除了退出以外,並沒有執行其他的功能。

#目的: 退出並向linux核心返回乙個狀態碼的簡單程式

#輸入: 無

#輸出: 返回乙個狀態碼.在執行程式後可通過輸入echo $?來讀取狀態碼

#變數:

# %eax儲存系統呼叫號

# %ebx儲存返回狀態

#.section .data

.section .text

.globl _start

_start:

movl $1, %eax #這是用於退出程式的linux核心命令號(系統呼叫)

movl $40, %ebx #這是我們將返回給作業系統的狀態碼

#改變這個數字,則返回到echo $?的值會不同

int $0x80 #這將喚醒核心,以執行退出命令

as exit.s -o exit.o

其中as是執行匯程式設計序的命令,exit.s是儲存以上**的原始檔,-o exit.o是告訴匯程式設計序將輸出到目標檔案exit.o中,exit.o是用機器語言寫成的**。目標檔案的內容通常不完全放到乙個地方,許多大的程式有許多個原始檔,將每個原始檔轉化成乙個目標檔案,形成許多個目標檔案。這是就需要用鏈結器程式把多個目標檔案合二為一,並向其中新增資訊,使核心知道該如何載入和執行該程式,鏈結程式的命令為:

ld exit.o -o exit

其中,ld是執行鏈結器的命令,exit.o 是目標檔案,-o exit指示鏈結器輸出新程式到名為exit的檔案。對於檔案的副檔名來說,在liunx或者unix中,檔案的副檔名是可有可無的,unix的可執行檔案通常是沒有副檔名的。注意:對原始檔做任何修改之後,為在程式中實現這些更改,必須重新彙編和鏈結程式。接下來要執行程式,可以輸入如下命令:

./exit

其中,./用來告訴計算機,改程式並非位於常用目錄下,而是當前目錄下,.指系統當前目錄。

如果你在執行完改程式之後,立即輸入:

echo $?

螢幕上就會出現乙個40,因為每個程式退出的時候都會向linux返回乙個退出狀態碼,告訴系統一切執行是否正常,可以通過echo $?來檢視狀態碼。

下面開始介紹本程式的**的含義

在本程式中有很多以#開頭的行,這表示這一行是注釋,用來解釋說明程式。

.section .data
在匯程式設計序中,任何以小數點(.)開始的指令都不會被直接翻譯成機器指令,這些針對匯程式設計序本身的指令,由於是由匯程式設計序處理,實際上並不會由計算機執行,因此被稱為彙編指令或偽操作。本程式中.section指令將程式分成幾個部分。.section  .data命令是資料段的開始,資料段中要列出本程式所需要的記憶體的儲存空間。有該程式沒有使用任何的資料,所以可以不需要該指令,但是為了使程式具有完整性,我們保留了該指令。

int $0x80

.section .text
表示文字段開始,文字段用來存放程式的指令。

.globl _start
.globl表示匯程式設計序不應該在彙編之後廢棄這個符號,因為鏈結器需要它。_start 是乙個特殊的符號,總是用.globl來標記,它將在彙編或者鏈結過程中被其他的內容替換。符號一般用來程式或者資料的位置,所以你可以用名字來代替記憶體位址。

_start:
用來定義_start的標籤的值。標籤是乙個符號,後面跟乙個冒號。標籤定義乙個符號的值。當匯程式設計序對程式進行彙編的時候,必須為每個數值或者每條指令分配位址。標籤告訴匯程式設計序以該符號的值作為下一條指令或者下一條資料的位置。

movl $1, %eax
將數字1移入暫存器%eax,其中1前面的$表示要用立即定址方式定址。之所以將1移入暫存器%eax中,是因為我們需要進行系統呼叫exit。當我們進行系統呼叫的時候,必須將系統呼叫號載入到%eax中。

大多數的指令都有兩個運算元,第乙個運算元是源運算元,第二個運算元是目的運算元。在這種情況下,源運算元根本不會改變,結果存放到目的運算元中。

movl $40, %ebx
作業系統除了要知道要進行哪個呼叫,還需要知道其他的各種資訊,在進行exit呼叫的時候,作業系統需要將狀態碼載入到%ebx,這個值將被返回到作業系統。

linux只需要在系統呼叫之前將某些引數載入到某些暫存器中,通常我們需要將系統呼叫號載入到%eax中,而對於其他的暫存器,每個系統呼叫有不同的要求。

int $0x80
int代表中斷,0x80是用到的中斷號。中斷會中斷正常的程式流,把控制權從我們的手中轉移到作業系統,和執行乙個系統呼叫,當完成乙個系統呼叫之後,控制權再次回到程式中。本程式中要求linux退出程式,因此程式不會再獲得控制權。

微機匯程式設計序

又是自學的一學期,呵呵。學到最後也就知道零星半點指令吧,複雜的程式可能還是不怎麼會寫,熟練當然也不敵c了,但是彙編之於嵌入式,往上走肯定少不了遇到,學好還是必要的!此次僅作入門吧。今日所學,明日之用。1 統計正負零的個數 datas segment array db 1,2,1,0,2,0,2,4,...

匯程式設計序呼叫c程式

首先是匯程式設計序,還是前面的例子,只是加了2行程式 extern main 說明這個函式從外面程式獲得 section data charact db a section text global start start mov ecx,charact push ecx call usestack ...

unix 匯程式設計序入門

有兩種方式執行系統呼叫 使用c庫,或者直接系統呼叫。c庫的函式並不全部是系統呼叫外包,例如printf,malloc。直接的核心呼叫,更快速的獲得核心服務。linux下的使用方法,eax中放呼叫號,可以在asm unistd.h中查到。可傳遞6個引數,ebx,ecx,edx,esi,edi,ebp。...