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