彙編 - 變數



NASM 提供了各種定義指令來預留變數的儲存空間。定義彙編指令用於分配儲存空間。它可以用來預留和初始化一個或多個位元組。

為已初始化資料分配儲存空間

已初始化資料的儲存分配語句語法如下:

[variable-name]    define-directive    initial-value   [,initial-value]...

其中,變數名是每個儲存空間的識別符號。彙編程式為資料段中定義的每個變數名關聯一個偏移值。

定義指令有五種基本形式:

指令 用途 儲存空間
DB 定義位元組 分配 1 位元組
DW 定義字 分配 2 位元組
DD 定義雙字 分配 4 位元組
DQ 定義四字 分配 8 位元組
DT 定義十位元組 分配 10 位元組

以下是一些使用定義指令的示例:

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 位二進位制等效值並存儲為十六進位制數。

  • 處理器使用小端位元組序。

  • 負數轉換為其二進位制補碼錶示。

  • 短浮點數和長浮點數分別使用 32 位或 64 位表示。

以下程式顯示了定義指令的使用:

section .text
   global _start          ;must be declared for linker (gcc)
	
_start:                   ;tell linker entry point
   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

為未初始化資料分配儲存空間

保留指令用於預留未初始化資料的空間。保留指令採用單個運算元,該運算元指定要預留的空間單位數。每個定義指令都有一個相關的保留指令。

保留指令有五種基本形式:

指令 用途
RESB 保留一個位元組
RESW 保留一個字
RESD 保留一個雙字
RESQ 保留一個四字
REST 保留十個位元組

多個定義

程式中可以有多個數據定義語句。例如:

choice	  DB 	'Y' 		 ;ASCII of y = 79H
number1	  DW 	12345 	 ;12345D = 3039H
number2    DD  12345679  ;123456789D = 75BCD15H

彙編程式為多個變數定義分配連續記憶體。

多次初始化

TIMES 指令允許對同一值進行多次初始化。例如,可以使用以下語句定義名為 marks 的大小為 9 的陣列並將其初始化為零:

marks  TIMES  9  DW  0

TIMES 指令在定義陣列和表格時很有用。以下程式在螢幕上顯示 9 個星號:

section	.text
   global _start        ;must be declared for linker (ld)
	
_start:                 ;tell linker entry point
   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 '*'

編譯並執行上述程式碼後,會產生以下結果:

*********
廣告