Linux匯編實例講解(一)
來源:程序員人生 發布時間:2015-05-26 07:43:44 閱讀次數:2716次
我們使用的平臺是Linux系統,具體為CentOS⑹4位版。下面是第1個匯編程序的源碼:
# 目的:退出Linux內核并返回1個簡單的狀態碼
#
# 輸入:無
#
# 輸出:控制臺上沒有輸出,可以用echo $?來查看狀態碼
#
# 變量:
# %eax 保存系統調用號
# %ebx 保存返回狀態
#
.section .data
.section .text
.globl _start
_start:
movl $1, %eax #這是用于退出程序的Linux內核命令號(系統調用)
movl $8, %ebx #這是返回給操作系統的狀態碼
#改變這個數字,則返回到echo $?的值會不同
int $0x80 #將內核喚醒,以運行退出命令
匯編程序的匯編、鏈接及輸出結果是:

Linux系統中,shell命令echo $?表示打印上1個命令履行的結果,該結果值的范圍為0⑵55,1般將0作為命令成功履行的返回碼。在該例子中我們使用的是8,而不是0,作為演示使用。
下面我們分析1下程序中代碼的具體含義:
(1)以'#'號開頭的為程序的注釋,不會被編譯或履行;
(2)以'.'開頭的為匯編指令或偽操作,其實不會被翻譯成機器指令;
.section .data 定義了程序的數據段的開始。數據段列出程序數據所需要的所有內存存儲空間。
.section .text 定義了程序的文本段的開始。文本段是寄存程序指令的部份。
.globl _start _start是個特殊符號,總是使用.globl來標記,由于它標記了該程序的開始位置,即,程序的入口地址。
_start: 定義_start標簽的值。
(3)程序指令:
movl $1, %eax
將數字1移入eax寄存器。$1和%eax稱為指令movl的操作數。其中$1為尋址方式中的立即尋址,如果沒有$符號,則是直接尋址;%eax稱為寄存器,在x86系統中有以下幾個通用寄存器:
%eax
%ebx
%ecx
%edx
%edi
%esi
有以下幾個專用寄存器:
%ebp
%esp
%eip
%eflags
該指令中將1放入寄存器%eax中是由于在系統調用中1對應系統調用exit;
movl $8, %ebx
當程序履行結束時,程序退出的狀態碼保存在%ebx寄存器中,通過echo $?命令可以看到該值。
int $0x80
int代表中斷,0x80是要用到的中斷號,該中斷將會引發系統調用。該程序中即調用exit。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈