汇编语言 变量
NASM 提供了各种 定义指令,用于为变量保留存储空间。define
汇编程序指令用于分配存储空间。它可以用于保留以及初始化一个或多个字节。
为初始化数据分配存储空间
初始化数据的存储分配语句的语法为:
[variable-name] define-directive initial-value [,initial-value]...
其中,变量名 是每个存储空间的标识符。汇编器为数据段中定义的每个变量名称关联一个偏移值。
define
指令有五种基本形式:
指令 | 作用 | 储存空间 |
---|---|---|
DB | 定义字节 | 分配 1 个字节 |
DW | 定义字 | 分配 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 位二进制数,并以十六进制数形式存储。
- 处理器使用小尾数字节顺序。
- 负数将转换为其 2 的补码表示形式。
- 短浮点数和长浮点数分别使用 32 位或 64 位表示。
以下程序演示了 define
指令的使用:
section .text
global _start ;必须声明链接器 (ld)
_start: ;告诉链接器入口点
mov edx,1 ;消息长度
mov ecx,choice ;消息内容
mov ebx,1 ;文件描述 (stdout)
mov eax,4 ;系统调用号 (sys_write)
int 0x80 ;调用内核
mov eax,1 ;系统调用号 (sys_exit)
int 0x80 ;调用内核
section .data
choice DB 'y'
结果如下:
y
为未初始化的数据分配存储空间
reserve
指令用于为未初始化的数据保留空间。reserve
指令采用单个操作数,该操作数指定要保留的空间单位数。每个 define
指令都有一个相关的 reserve
指令。
reserve
指令有五种基本形式:
指令 | 作用 |
---|---|
RESB | 保留 1 个字节 |
RESW | 保留字 |
RESD | 保留 1 个双字 |
RESQ | 保留 4 个字 |
REST | 保留 10 个字节 |
多种定义
一个程序中可以有多个数据定义语句。例如,
choice DB 'Y' ;ASCII of y = 79H
number1 DW 12345 ;12345D = 3039H
number2 DD 12345679 ;123456789D = 75BCD15H
汇编器为多个变量定义分配连续的内存。
多重初始化
TIMES
指令允许多次初始化为相同的值。例如,可以使用以下语句定义一个大小为 9 的标记的数组并将其初始化为 0:
section .text
global _start ;必须声明链接器 (ld)
_start: ;告诉链接器入口点
mov edx,9 ;消息长度
mov ecx, stars ;消息内容
mov ebx,1 ;文件描述 (stdout)
mov eax,4 ;系统调用号 (sys_write)
int 0x80 ;调用内核
mov eax,1 ;系统调用号 (sys_exit)
int 0x80 ;调用内核
section .data
stars times 9 db '*'
结果如下:
*********