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 1SYS_WRITE equ 4STDIN equ 0STDOUT equ 1section .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 kernelsection .datamsg1 db'Hello, programmers!',0xA,0xD len1 equ $ - msg1msg2 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 .
该指令还允许重新定义,并且区分大小写.