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{|}
...
...