汇编语言 常量

  • 常量

    NASM提供了几个定义常量的指令。在前面的章节中,我们已经使用过EQU指令。我们将特别讨论三个指令-
    • EQU
    • %assign
    • %define
  • EQU指令

    EQU指令用于定义常量。EQU指令的语法如下-
    
    CONSTANT_NAME EQU expression
    
    例如,
    
    TOTAL_STUDENTS equ 50
    
    然后,您可以在代码中使用此常量值,例如-
    
    mov  ecx,  TOTAL_STUDENTS 
    cmp  eax,  TOTAL_STUDENTS
    
    EQU语句的操作数可以是表达式-
    
    LENGTH equ 20
    WIDTH  equ 10
    AREA   equ length * width
    
    以上代码段将AREA定义为200。
    以下示例说明了EQU指令的使用-
    
    SYS_EXIT  equ 1
    SYS_WRITE equ 4
    STDIN     equ 0
    STDOUT    equ 1
    section  .text
       global _start    ;must be declared for using gcc
            
    _start:             ;tell linker entry point
       mov eax, SYS_WRITE         
       mov ebx, STDOUT         
       mov ecx, msg1         
       mov edx, len1 
       int 0x80                
            
       mov eax, SYS_WRITE         
       mov ebx, STDOUT         
       mov ecx, msg2         
       mov edx, len2 
       int 0x80 
            
       mov eax, SYS_WRITE         
       mov ebx, STDOUT         
       mov ecx, msg3         
       mov edx, len3 
       int 0x80
       
       mov eax,SYS_EXIT    ;system call number (sys_exit)
       int 0x80            ;call kernel
    
    section  .data
    msg1 db 'Hello, programmers!',0xA,0xD   
    len1 equ $ - msg1                       
    
    msg2 db 'Welcome to the world of,', 0xA,0xD 
    len2 equ $ - msg2 
    
    msg3 db 'Linux assembly programming! '
    len3 equ $- msg3
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Hello, programmers!
    Welcome to the world of,
    Linux assembly programming!
    
  • %assign 指令

    %assign 指令可以用来定义数字常量像EQU指令。该指令允许重新定义。例如,您可以将常量TOTAL定义为-
    
    %assign TOTAL 10
    
    在代码的后面,您可以将其重新定义为-
    
    %assign  TOTAL  20
    
    注意 - 指令区分大小写。
  • %define指令

    %define 指令允许定义数值和字符串常量。该指令类似于C中的#define。例如,您可以将常量PTR定义为-
    
    %define PTR [EBP+4]
    
    上面的代码用[EBP + 4]替换了PTR。
    该指令还允许重新定义,并且区分大小写。