📜  汇编-变量

📅  最后修改于: 2020-11-05 05:05:13             🧑  作者: Mango


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

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

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

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

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

define指令有五种基本形式-

Directive Purpose Storage Space
DB Define Byte allocates 1 byte
DW Define Word allocates 2 bytes
DD Define Doubleword allocates 4 bytes
DQ Define Quadword allocates 8 bytes
DT Define Ten Bytes allocates 10 bytes

以下是使用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          ;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

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

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

保留指令有五种基本形式-

Directive Purpose
RESB Reserve a Byte
RESW Reserve a Word
RESD Reserve a Doubleword
RESQ Reserve a Quadword
REST Reserve a Ten Bytes

多种定义

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

choice      DB     'Y'          ;ASCII of y = 79H
number1      DW     12345      ;12345D = 3039H
number2    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
   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 '*'

编译并执行上述代码后,将产生以下结果-

*********