NASM提供各種定義變數預留儲存空間的指令。定義組合指令用於分配的儲存空間。它可用於預定和初始化一個或多個位元組。
初始化資料儲存分配語句的語法是:
[variable-name] define-directive initial-value [,initial-value]...
變數名是每個儲存空間的識別符號。組合器在資料段中定義的每一個變數名的偏移值。
有五種基本形式定義指令:
Directive | Purpose | Storage Space |
---|---|---|
DB | Define Byte | allocates 1 byte |
DW | Define Word | allocates 2 bytes |
DD | Define Doubleword | allocates 4 bytes |
DQ | Define Quadword | allocates 8 bytes |
DT | Define Ten Bytes | allocates 10 bytes |
以下是一些例子,使用define指令:
choice DB 'y' number DW 12345 neg_number DW -12345 big_number DQ 123456789 real_number1 DD 1.234 real_number2 DQ 123.456
請注意:
每個位元組的字元以十六進位制的ASCII值儲存。
每個十進位制值會自動轉換為十六進位制數16位元二進位制儲存
處理器使用小尾數位節順序
負數轉換為2的二補數表示
短的和長的浮點數使用32位元或64位元分別表示
下面的程式顯示了使用定義指令:
section .text global _start ;must be declared for linker (gcc) _start: ;tell linker entry yiibai mov edx,1 ;message length mov ecx,choice ;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 choice DB 'y'
上面的程式碼編譯和執行時,它會產生以下結果:
y
儲備指令用於未初始化的資料預留空間。後備指令一個運算元指定要保留空間的單位數量。各自定義指令都有一個相關的後備指令。
有五種基本形式的後備指令:
Directive | Purpose |
---|---|
RESB | Reserve a Byte |
RESW | Reserve a Word |
RESD | Reserve a Doubleword |
RESQ | Reserve a Quadword |
REST | Reserve a Ten Bytes |
可以在程式有多個資料定義語句。例如:
choice DB 'Y' ;ASCII of y = 79H number1 DW 12345 ;12345D = 3039H number2 DD 12345679 ;123456789D = 75BCD15H
組合程式記憶體分配連續多個變數的定義。
TIMES指令允許多個初始化為相同的值。例如,一個名為標記大小為9的陣列可以被定義和初始化為零,使用下面的語句:
marks TIMES 9 DW 0
時代的指令是非常有用在定義陣列和表格。下面的程式顯示在螢幕上的9星號:
section .text global _start ;must be declared for linker (ld) _start: ;tell linker entry yiibai mov edx,9 ;message length mov ecx, stars ;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 stars times 9 db '*'
上面的程式碼編譯和執行時,它會產生以下結果:
*********