NASM提供各種定義變量預(yù)留存儲(chǔ)空間的指令。定義匯編指令用于分配的存儲(chǔ)空間。它可用于預(yù)定和初始化一個(gè)或多個(gè)字節(jié)。
初始化數(shù)據(jù)存儲(chǔ)分配語(yǔ)句的語(yǔ)法是:
[variable-name] define-directive initial-value [,initial-value]...
變量名是每個(gè)存儲(chǔ)空間的標(biāo)識(shí)符。匯編器在數(shù)據(jù)段中定義的每一個(gè)變量名的偏移值。
有五種基本形式定義指令:
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
請(qǐng)注意:
每個(gè)字節(jié)的字符以十六進(jìn)制的ASCII值存儲(chǔ)。
每個(gè)十進(jìn)制值會(huì)自動(dòng)轉(zhuǎn)換為十六進(jìn)制數(shù)16位二進(jìn)制存儲(chǔ)
處理器使用小尾數(shù)字節(jié)順序
負(fù)數(shù)轉(zhuǎn)換為2的補(bǔ)碼表示
短的和長(zhǎng)的浮點(diǎn)數(shù)使用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'
上面的代碼編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果:
y
儲(chǔ)備指令用于未初始化的數(shù)據(jù)預(yù)留空間。后備指令一個(gè)操作數(shù)指定要保留空間的單位數(shù)量。各自定義指令都有一個(gè)相關(guān)的后備指令。
有五種基本形式的后備指令:
Directive | Purpose |
---|---|
RESB | Reserve a Byte |
RESW | Reserve a Word |
RESD | Reserve a Doubleword |
RESQ | Reserve a Quadword |
REST | Reserve a Ten Bytes |
可以在程序有多個(gè)數(shù)據(jù)定義語(yǔ)句。例如:
choice DB 'Y' ;ASCII of y = 79H number1 DW 12345 ;12345D = 3039H number2 DD 12345679 ;123456789D = 75BCD15H
匯編程序內(nèi)存分配連續(xù)多個(gè)變量的定義。
TIMES指令允許多個(gè)初始化為相同的值。例如,一個(gè)名為標(biāo)記大小為9的數(shù)組可以被定義和初始化為零,使用下面的語(yǔ)句:
marks TIMES 9 DW 0
時(shí)代的指令是非常有用在定義數(shù)組和表格。下面的程序顯示在屏幕上的9星號(hào):
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 '*'
上面的代碼編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果:
*********