当前位置: 首页 > 文档资料 > 汇编中文教程 >

变量

优质
小牛编辑
135浏览
2023-12-01

NASM提供了各种define directives用于为变量保留存储空间。 define assembler指令用于分配存储空间。 它可用于保留以及初始化一个或多个字节。

为初始化数据分配存储空间

初始化数据的存储分配语句的语法是 -

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

其中, variable-name是每个存储空间的标识符。 汇编程序为数据段中定义的每个变量名称关联一个偏移值。

define指令有五种基本形式 -

指示目的储存空间
DB定义字节分配1个字节
DW定义Word分配2个字节
DD定义双字分配4个字节
DQ定义四字分配8个字节
DT定义十个字节分配10个字节

以下是使用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位二进制等效值并存储为十六进制数。

  • 处理器使用little-endian字节排序。

  • 负数转换为2的补码表示。

  • 短和长浮点数分别使用32或64位表示。

以下程序显示了使用define指令 -

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

为未初始化数据分配存储空间

保留指令用于为未初始化数据保留空间。 保留指令采用单个操作数,指定要保留的空间单元数。 每个define指令都有一个相关的保留指令。

保留指令有五种基本形式 -

指示目的
RESB预留一个字节
RESWReserve a Word
RESDReserve a Doubleword
RESQReserve a Quadword
REST预留十个字节

多个定义

您可以在程序中拥有多个数据定义语句。 例如 -

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

汇编程序为多个变量定义分配连续内存。

多次初始化

TIMES指令允许多次初始化为相同的值。 例如,可以使用以下语句定义名为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 '*'

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

*********