变量
优质
小牛编辑
131浏览
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 | 预留一个字节 |
RESW | Reserve a Word |
RESD | Reserve a Doubleword |
RESQ | Reserve 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 '*'
编译并执行上述代码时,会产生以下结果 -
*********