Perakitan - Prosedur
Prosedur atau subrutin sangat penting dalam bahasa assembly, karena program bahasa assembly cenderung berukuran besar. Prosedur diidentifikasi dengan nama. Mengikuti nama ini, bagian tubuh prosedur dijelaskan yang melakukan pekerjaan yang ditentukan dengan baik. Akhir prosedur ditunjukkan dengan pernyataan pengembalian.
Sintaksis
Berikut ini adalah sintaks untuk mendefinisikan prosedur -
proc_name:
procedure body
...
ret
Prosedur dipanggil dari fungsi lain dengan menggunakan instruksi CALL. Instruksi CALL harus memiliki nama dari prosedur yang dipanggil sebagai argumen seperti yang ditunjukkan di bawah ini -
CALL proc_name
Prosedur yang dipanggil mengembalikan kontrol ke prosedur pemanggilan dengan menggunakan instruksi RET.
Contoh
Mari kita tulis prosedur yang sangat sederhana bernama sum yang menambahkan variabel yang disimpan dalam register ECX dan EDX dan mengembalikan jumlah tersebut di register EAX -
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
Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -
The sum is:
9
Tumpukan Struktur Data
Tumpukan adalah struktur data seperti larik dalam memori tempat data dapat disimpan dan dihapus dari lokasi yang disebut 'atas' tumpukan. Data yang perlu disimpan 'didorong' ke dalam tumpukan dan data yang akan diambil 'dikeluarkan' dari tumpukan. Stack adalah struktur data LIFO, yaitu data yang disimpan pertama kali diambil terakhir.
Bahasa assembly menyediakan dua instruksi untuk operasi stack: PUSH dan POP. Instruksi ini memiliki sintaks seperti -
PUSH operand
POP address/register
Ruang memori yang dicadangkan di segmen tumpukan digunakan untuk mengimplementasikan tumpukan. Register SS dan ESP (atau SP) digunakan untuk mengimplementasikan stack. Bagian atas tumpukan, yang menunjuk ke item data terakhir yang dimasukkan ke dalam tumpukan ditunjukkan oleh register SS: ESP, di mana register SS menunjuk ke awal segmen tumpukan dan SP (atau ESP) memberikan offset ke segmen tumpukan.
Implementasi tumpukan memiliki karakteristik berikut -
Hanya words atau doublewords bisa disimpan ke dalam tumpukan, bukan satu byte.
Tumpukan tumbuh ke arah sebaliknya, yaitu menuju alamat memori yang lebih rendah
Bagian atas tumpukan menunjuk ke item terakhir yang dimasukkan ke dalam tumpukan; itu menunjuk ke byte bawah dari kata terakhir yang disisipkan.
Saat kita membahas tentang menyimpan nilai register di stack sebelum menggunakannya untuk suatu penggunaan; itu dapat dilakukan dengan cara berikut -
; 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
Contoh
Program berikut menampilkan seluruh himpunan karakter ASCII. Program utama memanggil prosedur bernama display , yang menampilkan set karakter ASCII.
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'
Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -
0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
...
...