NASM提供了各种 define指令,用于为变量保留存储空间. define assembler指令用于分配存储空间.它可用于保留和初始化一个或多个字节.
为初始化数据分配存储空间
存储分配语句的语法初始化数据是 :
[variable-name] define-directive initial-value [,initial-value] ...
其中,变量名是每个存储空间的标识符.汇编程序为数据段中定义的每个变量名称关联一个偏移值.
define指令有五种基本形式 :
指令 | 目的 | 存储空间 |
---|---|---|
DB | 定义字节 | 分配1个字节 |
DW | 定义Word | 分配2个字节 |
DD | 定义双字 | 分配4个字节 |
DQ | 定义四字 | 分配8个字节 |
DT | 定义十个字节 | 分配10个字节 |
以下是使用define directives :
$的一些示例b $ b
choiceDB'y'numberDW12345neg_numberDW-12345big_numberDQ123456789real_number1DD1.234real_number2DQ123.456
请注意 :
字符的每个字节都以十六进制存储为ASCII值.
每个十进制值自动转换为16位二进制等效值并存储作为十六进制数.
处理器使用little-endian字节排序.
负数转换为2的补码表示.
短和长浮点数分别用32位或64位表示.
以下程序显示了使用define directive :
section .text global _start ;must be declared for linker (gcc)_start: ;tell linker entry point movedx,1 ;message length movecx,choice ;message to write movebx,1 ;file descriptor (stdout) moveax,4 ;system call number (sys_write) int0x80 ;call kernel moveax,1 ;system call number (sys_exit) int0x80 ;call kernelsection .datachoice DB 'y'
编译并执行上述代码时,它会生成foll欠结果 :
y
为未初始化数据分配存储空间
保留指令用于为未初始化数据保留空间.保留指令采用单个操作数,指定要保留的空间单元数.每个define指令都有一个相关的保留指令.
保留指令有五种基本形式 :
指令 | 目的 |
---|---|
RESB | 保留一个字节 |
RESW | 保留一个字 |
RESD | 预订双字 |
RESQ | 预订四字 |
REST | 预留10个字节 |
多个定义
您可以在程序中拥有多个数据定义语句.例如 :
choice DB 'Y' ;ASCII of y = 79Hnumber1 DW 12345 ;12345D = 3039Hnumber2 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 movedx,9;message length movecx, stars;message to write movebx,1;file descriptor (stdout) moveax,4;system call number (sys_write) int0x80;call kernel moveax,1;system call number (sys_exit) int0x80;call kernelsection.datastars times 9 db '*'
编译并执行上述代码时,会产生以下结果 :
*********