匯編程序可以分為三個部分-data?secttion,?bss?section以及text?section酪碘。
Data Section(數(shù)據(jù)段)
數(shù)據(jù)段用于聲明初始化的數(shù)據(jù)或常量仗考。 此數(shù)據(jù)在運(yùn)行時不會更改哮幢。 你可以可以在本節(jié)中聲明各種常量值桶雀,文件名或緩沖區(qū)大小等唠叛。
聲明數(shù)據(jù)部分的語法是
section.data
BSS Section(BSS段)
bss部分用于聲明變量瞎访,存放程序中未初始化的全局變量的一塊內(nèi)存區(qū)域,聲明bss部分的語法是
section.bss
Text Section(代碼段)
文本段用于保留實(shí)際代碼值朋。 此部分必須以全局聲明_start開頭叹侄,該聲明告訴內(nèi)核程序從何處開始執(zhí)行。
聲明文本部分的語法是
section.text
? global _start
_start:
注釋
匯編語言注釋以分號(;)開頭昨登。 它可以包含任何可打印字符趾代,包括空格。 它可以單獨(dú)出現(xiàn)在一條線上丰辣,例如
; 今天開始學(xué)匯編撒强,這是我的第一個程序
或者,與說明在同一行上笙什,例如
add eax, ebx? ? ; 把ebx寄存器上的數(shù)加到eax寄存器上
匯編語言聲明
匯編語言程序包含三種類型的語句
可執(zhí)行指令或說明尿褪,
匯編程序指令或偽操作
宏
可執(zhí)行指令或簡單的指令告訴處理器該怎么做。 每個指令由一個操作碼(操作碼)組成得湘。 每個可執(zhí)行指令生成一個機(jī)器語言指令杖玲。
匯編程序指令或偽操作將匯編程序的各個方面告知匯編程序。 這些是不可執(zhí)行的淘正,不會生成機(jī)器語言指令摆马。
宏基本上是一種文本替換機(jī)制。
匯編語言語句的語法
匯編語言語句每行輸入一個語句鸿吆。 每個語句遵循以下格式
[標(biāo)簽]助記符[操作數(shù)] [;注釋]
方括號中的字段是可選的囤采。 基本指令包括兩部分,第一部分是要執(zhí)行的指令(或助記符)的名稱惩淳,第二部分是命令的操作數(shù)或參數(shù)蕉毯。
以下是一些典型匯編語言語句的示例
INC COUNT? ? ? ? ; Increment the memory variable COUNT
MOV TOTAL, 48? ? ; Transfer the value 48 in the
? ? ? ? ? ? ? ? ; memory variable TOTAL
ADD AH, BH? ? ? ; Add the content of the
? ? ? ? ? ? ? ? ; BH register into the AH register
AND MASK1, 128? ; Perform AND operation on the
? ? ? ? ? ? ? ? ; variable MASK1 and 128
ADD MARKS, 10? ? ; Add 10 to the variable MARKS
MOV AL, 10? ? ? ; Transfer the value 10 to the AL register
神級程序Hello World
Live Demo
section .text
? global _start? ? ;must be declared for linker (ld)
_start: ? ? ? ? ? ? ;tells linker entry point
? mov edx,len? ? ;message length
? mov ecx,msg? ? ;message to write
? mov ebx,1? ? ? ;file descriptor (stdout)
? mov eax,4? ? ? ;system call number (sys_write)
? int 0x80? ? ? ? ;call kernel
? mov eax,1? ? ? ;system call number (sys_exit)
? int 0x80? ? ? ? ;call kernel
section .data
msg db 'Hello, world!', 0xa? ;string to be printed
len equ $ - msg? ? ;length of the string
當(dāng)你編譯并執(zhí)行上述程序之后乓搬,屏幕上會打印出
Hello world!
在NASM中編譯和鏈接匯編程序
確保已在PATH環(huán)境變量中設(shè)置了nasm和ld二進(jìn)制文件的路徑。 現(xiàn)在代虾,按照以下步驟編譯和鏈接上述程序(總之就是先把nasm裝上进肯,沒裝上的看上一篇文章)
使用文本編輯器輸入以上代碼,然后將其另存為hello.asm棉磨。
確保您與保存hello.asm的目錄位于同一目錄中江掩。
要組裝程序,請鍵入nasm -f elf hello.asm
如果有任何錯誤乘瓤,現(xiàn)階段將提示有關(guān)錯誤环形。 否則,將創(chuàng)建名為hello.o的程序的目標(biāo)文件衙傀。
要鏈接目標(biāo)文件并創(chuàng)建一個名為hello的可執(zhí)行文件抬吟,請鍵入ld -m elf_i386 -s -o hello hello.o
通過鍵入?./hello?執(zhí)行程序
如果您正確完成所有操作,則會在屏幕上顯示“Hello world!”.
如果你在編譯和鏈接時遇到什么問題统抬,我想這篇文章能夠幫助到你火本。
知青語:Linux 匯編語言學(xué)習(xí)--編譯和鏈接?zhuanlan.zhihu.com
大家把今天的課程稍微消化一下,貪多嚼不爛蓄喇。而且這兩天氣溫驟降发侵,打字久了交掏,手特別冷妆偏,今天更新兩篇,大家認(rèn)真看一下盅弛。