Montaj - Sabitler

Sabitleri tanımlayan NASM tarafından sağlanan birkaç yönerge vardır. EQU direktifini önceki bölümlerde zaten kullandık. Özellikle üç yönergeyi tartışacağız -

  • EQU
  • %assign
  • %define

EQU Direktifi

EQUyönergesi sabitleri tanımlamak için kullanılır. EQU direktifinin sözdizimi aşağıdaki gibidir -

CONSTANT_NAME EQU expression

Örneğin,

TOTAL_STUDENTS equ 50

Daha sonra bu sabit değeri kodunuzda kullanabilirsiniz, örneğin -

mov  ecx,  TOTAL_STUDENTS 
cmp  eax,  TOTAL_STUDENTS

Bir EQU ifadesinin işleneni bir ifade olabilir -

LENGTH equ 20
WIDTH  equ 10
AREA   equ length * width

Yukarıdaki kod segmenti AREA'yı 200 olarak tanımlar.

Misal

Aşağıdaki örnek, EQU direktifinin kullanımını göstermektedir -

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

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

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

% Atama Yönergesi

%assignYönerge, EQU yönergesi gibi sayısal sabitleri tanımlamak için kullanılabilir. Bu yönerge yeniden tanımlamaya izin verir. Örneğin, TOTAL sabitini şu şekilde tanımlayabilirsiniz:

%assign TOTAL 10

Kodun ilerleyen kısımlarında, bunu şu şekilde yeniden tanımlayabilirsiniz:

%assign  TOTAL  20

Bu yönerge büyük / küçük harfe duyarlıdır.

% Direktifi tanımlar

%defineyönerge hem sayısal hem de dizge sabitlerini tanımlamaya izin verir. Bu yönerge C'deki #define yönergesine benzer. Örneğin, sabit PTR'yi şu şekilde tanımlayabilirsiniz:

%define PTR [EBP+4]

Yukarıdaki kod, PTR'nin yerini [EBP + 4] ile değiştirir.

Bu yönerge ayrıca yeniden tanımlamaya izin verir ve büyük / küçük harfe duyarlıdır.