汇编语言 变量

NASM 提供了各种 定义指令,用于为变量保留存储空间。define 汇编程序指令用于分配存储空间。它可以用于保留以及初始化一个或多个字节。


为初始化数据分配存储空间

初始化数据的存储分配语句的语法为:

  1. [variable-name] define-directive initial-value [,initial-value]...

其中,变量名 是每个存储空间的标识符。汇编器为数据段中定义的每个变量名称关联一个偏移值。

define 指令有五种基本形式:

指令作用储存空间
DB定义字节分配 1 个字节
DW定义字分配 2 个字节
DD定义双字分配 4 个字节
DQ定义四字分配 8 个字节
DT定义十个字节分配 10 个字节

以下是一些使用 define 指令的实例:

  1. choice DB 'y'
  2. number DW 12345
  3. neg_number DW -12345
  4. big_number DQ 123456789
  5. real_number1 DD 1.234
  6. real_number2 DQ 123.456
请注意
  • 字符的每个字节均以十六进制形式存储为其 ASCII 值。
  • 每个十进制值都将自动转换为其等效的 16 位二进制数,并以十六进制数形式存储。
  • 处理器使用小尾数字节顺序。
  • 负数将转换为其 2 的补码表示形式。
  • 短浮点数和长浮点数分别使用 32 位或 64 位表示。

以下程序演示了 define 指令的使用:

  1. section .text
  2. global _start ;必须声明链接器 (ld)
  3. _start: ;告诉链接器入口点
  4. mov edx,1 ;消息长度
  5. mov ecx,choice ;消息内容
  6. mov ebx,1 ;文件描述 (stdout)
  7. mov eax,4 ;系统调用号 (sys_write)
  8. int 0x80 ;调用内核
  9. mov eax,1 ;系统调用号 (sys_exit)
  10. int 0x80 ;调用内核
  11. section .data
  12. choice DB 'y'

结果如下:

  1. y

为未初始化的数据分配存储空间

reserve 指令用于为未初始化的数据保留空间。reserve 指令采用单个操作数,该操作数指定要保留的空间单位数。每个 define 指令都有一个相关的 reserve 指令。

reserve 指令有五种基本形式:

指令作用
RESB保留 1 个字节
RESW保留字
RESD保留 1 个双字
RESQ保留 4 个字
REST保留 10 个字节

多种定义

一个程序中可以有多个数据定义语句。例如,

  1. choice DB 'Y' ;ASCII of y = 79H
  2. number1 DW 12345 ;12345D = 3039H
  3. number2 DD 12345679 ;123456789D = 75BCD15H

汇编器为多个变量定义分配连续的内存。


多重初始化

TIMES 指令允许多次初始化为相同的值。例如,可以使用以下语句定义一个大小为 9 的标记的数组并将其初始化为 0:

  1. section .text
  2. global _start ;必须声明链接器 (ld)
  3. _start: ;告诉链接器入口点
  4. mov edx,9 ;消息长度
  5. mov ecx, stars ;消息内容
  6. mov ebx,1 ;文件描述 (stdout)
  7. mov eax,4 ;系统调用号 (sys_write)
  8. int 0x80 ;调用内核
  9. mov eax,1 ;系统调用号 (sys_exit)
  10. int 0x80 ;调用内核
  11. section .data
  12. stars times 9 db '*'

结果如下:

  1. *********