汇编语言 变量

  • 变量

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

    初始化数据的存储分配语句的语法为-
    
    [variable-name]    define-directive    initial-value   [,initial-value]...
    
    其中,变量名是每个存储空间的标识符。汇编器为数据段中定义的每个变量名称关联一个偏移值。
    define指令有五种基本形式-
    指令 目的 储存空间
    DB 定义字节 分配1个字节
    DW 定义字 分配2个字节
    DD 定义双字 分配4个字节
    DQ 定义四字 分配8个字节
    DT 定义十个字节 分配10个字节
    以下是一些使用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指令。
    保留指令有五种基本形式-
    指令 目的
    RESB 保留一个字节
    RESW 保留字
    RESD 保留双字
    RESQ 保留四字
    REST 保留十个字节
  • 多种定义

    一个程序中可以有多个数据定义语句。例如-
    
    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 '*'
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    *********