Assembly 常數


有幾個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 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

上面的程式碼編譯和執行時,它會產生以下結果:

Hello, programmers!
Welcome to the world of,
Linux assembly programming!

%assign 指令

%assign 指令可以使用像EQU指令定義數值常數。該指令允許重新定義。例如,您可以定義常數TOTAL :

%assign TOTAL 10

在後面的程式碼,可以重新定義為:

%assign  TOTAL  20

這個指令是區分大小寫的。

%define 指令

The %define 指令允許定義數值和字串常數。這個指令是相似 #define在C#中。例如,可以定義常數的PTR:

%define PTR [EBP+4]

上面的程式碼取代PTR by [EBP+4].

此指令還允許重新定義,它是區分大小寫。