nasm汇编之变量 Variables
NASM提供了各种定义指令来为变量保留存储空间。 define assembler指令用于分配存储空间。它可以用于保留以及初始化一个或多个字节
为初始化数据分配存储空间
初始化数据的存储分配语句的语法为
[variable-name] define-directive initial-value [,initial-value]...
其中,变量名是每个存储空间的标识符。汇编器为数据段中定义的每个变量名称关联一个偏移值。
五种基本类型指令
指令 | 说明 | 存储空间 |
---|---|---|
DB | 定义字节 | 1 byte |
DW | 定义字 | 2 bytes |
DD | 定义双字 | 4 bytes |
DQ | 定义四字 | 8 bytes |
DT | 定义10字 | 10 bytes |
示例
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位表示。
Live Demo
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'
分配未初始化数据的存储空间
reserve指令用于为未初始化的数据保留空间。 reserve指令采用单个操作数,该操作数指定要保留的空间单位数。每个define指令都有一个相关的reserve指令
五种基本reserve指令
指令 | 说明 |
---|---|
RESB | 1 byte |
RESW | 2 bytes |
RESD | 4 bytes |
RESQ | 8 bytes |
REST | 10 bytes |
多重初始化
汇编器为多个变量定义分配连续的内存
TIMES指令允许多次初始化为相同的值。
例如,可以使用以下语句定义一个大小为9的标记的数组并将其初始化为零
marks TIMES 9 DW 0
TIMES指令在定义数组和表时很有用。下面的程序在屏幕上显示9个星号
Live Demo
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 '*'