位置:首页 > > 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 '*'

上面的代码编译和执行时,它会产生以下结果:

*********