Assembly 基本語法


組合程式可以分為三個部分:

  • 資料段

  • 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

Assembly組合語言語句

組合語言程式包括三個型別的語句:

  • 可執行指令或指令

  • 組合指令或偽操作

  • 巨集

可執行指令或簡單指示告訴的處理器該怎麼做。每個指令由操作碼(操作碼)可執行指令生成的機器語言指令。

組合指令或偽操作告訴組合有關組合過程的各個方面。這些都是非可執行檔案,並不會產生機器語言指令。

巨集基本上是一個文字替換機制。

組合語言語句的語法

組合語言語句輸入每行一個語句。每個語句如下的格式如下:

[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

Assembly Hello World程式

下面的組合語言程式碼顯示字串 'Hello World'在螢幕上: 

section	.text
    global _start   ;must be declared for linker (ld)
_start:	            ;tells linker entry yiibai
    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  ;our dear string
len equ $ - msg              ;length of our dear string

上面的程式碼編譯和執行時,它會產生以下結果:

Hello, world!

一個組合程式的編譯和連結在NASM

請確保已設定NASM和LD的二進位制檔案的路徑在PATH環境變數中。現在上述程式的編譯和連結採取以下步驟:

  • 使用文字編輯器,輸入上面的程式碼儲存為hello.asm。

  • 請確保hello.asm檔案儲存在同一目錄 

  • 要組合程式,請鍵入 nasm -f elf hello.asm

  • 如果有錯誤將提示。否則hello.o程式將建立一個物件檔案。

  • 要連結目標檔案,並建立一個可執行檔案名hello,請鍵入 ld -m elf_i386 -s -o hello hello.o

  • 通過輸入執行程式 ./hello

如果所做的一切都是正確的,它會顯示 Hello, world!在螢幕上。