汇编 - 变量



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

编译并执行上述代码后,会产生以下结果:

*********
广告