汇编 - 常量

NASM提供了几个定义常量的指令.我们在前面的章节中已经使用了EQU指令.我们将特别讨论三个指令 :

  • EQU

  • %assign

  • %define

EQU指令

EQU 指令用于定义常量. EQU指令的语法如下 :

 
 CONSTANT_NAME EQU表达式

例如,

 
 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 Directive

%assign 指令可用于定义数字常数类似于EQU指令.该指令允许重新定义.例如,您可以将常量TOTAL定义为 :

 
%assign TOTAL 10

稍后在代码中,您可以将其重新定义为 :

 
%assign TOTAL 20

此指令区分大小写.

%define Directive

%define 指令允许定义数字和字符串常量.该指令类似于C中的#define.例如,您可以将常量PTR定义为 :

%define PTR [EBP+4]

上述代码用[EBP + 4]替换 PTR .

该指令还允许重新定义,并且区分大小写.