位置:首頁 > 高級語言 > Assembly彙編 > Assembly 變量聲明

Assembly 變量聲明

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 '*'

上麵的代碼編譯和執行時,它會產生以下結果:

*********