汇编 - 变量
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 '*'
编译并执行上述代码后,会产生以下结果:
*********
广告