彙編 - 基本語法
一個彙編程式可以分為三個部分:
資料段,
bss段,以及
文字段。
資料段
資料段用於宣告初始化資料或常量。這些資料在執行時不會改變。您可以在此部分宣告各種常數值、檔名或緩衝區大小等。
宣告資料段的語法如下:
section.data
bss段
bss段用於宣告變數。宣告bss段的語法如下:
section.bss
文字段
文字段用於存放實際程式碼。此段必須以宣告global _start開頭,這告訴核心程式執行從哪裡開始。
宣告文字段的語法如下:
section.text global _start _start:
註釋
組合語言註釋以分號 (;) 開頭。它可以包含任何可列印字元,包括空格。它可以單獨出現在一行上,例如:
; This program displays a message on screen
或者,與指令在同一行上,例如:
add eax, ebx ; adds ebx to eax
組合語言語句
組合語言程式由三種類型的語句組成:
- 可執行指令或指令,
- 彙編指令或偽操作,以及
- 宏。
可執行指令或簡稱指令告訴處理器做什麼。每個指令都包含一個操作碼(操作碼)。每個可執行指令都會生成一條機器語言指令。
彙編指令或偽操作告訴彙編器有關彙編過程的各個方面。這些指令不可執行,也不會生成機器語言指令。
宏基本上是一種文字替換機制。
組合語言語句的語法
組合語言語句一行輸入一條語句。每個語句都遵循以下格式:
[label] mnemonic [operands] [;comment]
方括號中的欄位是可選的。一條基本指令有兩個部分,第一個是指令的名稱(或助記符),即將執行的指令,第二個是運算元或命令的引數。
以下是一些典型組合語言語句的示例:
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”程式
以下組合語言程式碼在螢幕上顯示字串“Hello World”:
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
編譯並執行上述程式碼後,將產生以下結果:
Hello, world!
在 NASM 中編譯和連結彙編程式
確保您已在 PATH 環境變數中設定了nasm和ld二進位制檔案的路徑。現在,請按照以下步驟編譯和連結上述程式:
使用文字編輯器輸入上述程式碼,並將其儲存為 hello.asm。
確保您位於儲存hello.asm的同一目錄中。
要彙編程式,請鍵入nasm -f elf hello.asm
如果存在任何錯誤,您將在此階段收到提示。否則,將建立程式的命名為hello.o的物件檔案。
要連結物件檔案並建立名為 hello 的可執行檔案,請鍵入ld -m elf_i386 -s -o hello hello.o
透過鍵入./hello執行程式
如果一切正確,它將在螢幕上顯示“Hello, world!”。