有幾個(gè)NASM定義常量的指令。我們?cè)谇懊娴恼鹿?jié)中已經(jīng)使用EQU指令。我們將特別討論了三個(gè)指令:
EQU
%assign
%define
EQU指令用于定義常量。 EQU偽指令的語(yǔ)法如下:
CONSTANT_NAME EQU expression
例如,
TOTAL_STUDENTS equ 50
可以在代碼中使用這個(gè)常量值,如:
mov ecx, TOTAL_STUDENTS cmp eax, TOTAL_STUDENTS
EQU語(yǔ)句的操作數(shù)可以是一個(gè)表達(dá)式:
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 yiibai 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
上面的代碼編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果:
Hello, programmers! Welcome to the world of, Linux assembly programming!
%assign 指令可以使用像EQU指令定義數(shù)值常量。該指令允許重新定義。例如,您可以定義常量TOTAL :
%assign TOTAL 10
在后面的代碼,可以重新定義為:
%assign TOTAL 20
這個(gè)指令是區(qū)分大小寫(xiě)的。
The %define 指令允許定義數(shù)值和字符串常量。這個(gè)指令是相似 #define在C#中。例如,可以定義常量的PTR:
%define PTR [EBP+4]
上面的代碼取代PTR by [EBP+4].
此指令還允許重新定義,它是區(qū)分大小寫(xiě)。