Montaj - Prosedürler

Assembly dili programları boyut olarak büyük olma eğiliminde olduğundan, prosedürler veya alt yordamlar assembly dilinde çok önemlidir. Prosedürler bir adla tanımlanır. Bu ismin ardından, iyi tanımlanmış bir işi gerçekleştiren prosedürün gövdesi açıklanmaktadır. Prosedürün sonu bir dönüş ifadesiyle belirtilir.

Sözdizimi

Bir prosedürü tanımlamak için sözdizimi aşağıdadır -

proc_name:
   procedure body
   ...
   ret

Prosedür, CALL komutu kullanılarak başka bir işlevden çağrılır. CALL talimatı, çağrılan prosedürün adını aşağıda gösterildiği gibi bir argüman olarak içermelidir -

CALL proc_name

Çağrılan prosedür, RET komutunu kullanarak kontrolü çağırma prosedürüne döndürür.

Misal

Bize çok basit bir işlem adında yazalım toplamı ECX ve EDX saklanan değişkenler kayıt ve EAX kayıt döner toplamı ekler -

section	.text
   global _start        ;must be declared for using gcc
	
_start:	                ;tell linker entry point
   mov	ecx,'4'
   sub     ecx, '0'
	
   mov 	edx, '5'
   sub     edx, '0'
	
   call    sum          ;call sum procedure
   mov 	[res], eax
   mov	ecx, msg	
   mov	edx, len
   mov	ebx,1	        ;file descriptor (stdout)
   mov	eax,4	        ;system call number (sys_write)
   int	0x80	        ;call kernel
	
   mov	ecx, res
   mov	edx, 1
   mov	ebx, 1	        ;file descriptor (stdout)
   mov	eax, 4	        ;system call number (sys_write)
   int	0x80	        ;call kernel
	
   mov	eax,1	        ;system call number (sys_exit)
   int	0x80	        ;call kernel
sum:
   mov     eax, ecx
   add     eax, edx
   add     eax, '0'
   ret
	
section .data
msg db "The sum is:", 0xA,0xD 
len equ $- msg   

segment .bss
res resb 1

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

The sum is:
9

Veri Yapısını Yığınlar

Yığın, bellekte verilerin depolanabildiği ve yığının 'üstü' olarak adlandırılan bir konumdan kaldırılabildiği dizi benzeri bir veri yapısıdır. Depolanması gereken veriler yığına 'itilir' ve alınacak veriler yığından dışarı çıkarılır. Yığın bir LIFO veri yapısıdır, yani ilk depolanan veri en son alınır.

Assembly dili, yığın işlemleri için iki talimat sağlar: PUSH ve POP. Bu talimatların sözdizimleri var -

PUSH    operand
POP     address/register

Yığın segmentinde ayrılan bellek alanı, yığını uygulamak için kullanılır. SS ve ESP kayıtları (veya SP) yığını uygulamak için kullanılır. Yığına eklenen son veri öğesini gösteren yığının tepesine SS: ESP yazmacı işaret edilir, burada SS yazmacı yığın segmentinin başlangıcına işaret eder ve SP (veya ESP) ofseti yığın segmenti.

Yığın uygulaması aşağıdaki özelliklere sahiptir -

  • Sadece words veya doublewords bayt yerine yığına kaydedilebilir.

  • Yığın ters yönde, yani alt bellek adresine doğru büyür

  • Yığının tepesi, yığına eklenen son öğeyi gösterir; eklenen son kelimenin alt baytını gösterir.

Kayıtların değerlerini bir miktar kullanım için kullanmadan önce yığında depolamayı tartıştığımız gibi; şu şekilde yapılabilir -

; Save the AX and BX registers in the stack
PUSH    AX
PUSH    BX

; Use the registers for other purpose
MOV	AX, VALUE1
MOV 	BX, VALUE2
...
MOV 	VALUE1, AX
MOV	VALUE2, BX

; Restore the original values
POP	BX
POP	AX

Misal

Aşağıdaki program tüm ASCII karakter setini görüntüler. Ana program , ASCII karakter setini görüntüleyen display adlı bir prosedürü çağırır .

section	.text
   global _start        ;must be declared for using gcc
	
_start:	                ;tell linker entry point
   call    display
   mov	eax,1	        ;system call number (sys_exit)
   int	0x80	        ;call kernel
	
display:
   mov    ecx, 256
	
next:
   push    ecx
   mov     eax, 4
   mov     ebx, 1
   mov     ecx, achar
   mov     edx, 1
   int     80h
	
   pop     ecx	
   mov	dx, [achar]
   cmp	byte [achar], 0dh
   inc	byte [achar]
   loop    next
   ret
	
section .data
achar db '0'

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

0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
...
...