汇编 - 常量



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]

以上代码将 PTR 替换为 [EBP+4]。

此指令也允许重新定义,并且区分大小写。

广告