Makro teks adalah symbol yang mewakili karakter-karakter teks. Ketika turbo assembler menemukan symbol dalam ekspresi (atau situasi lain) maka assembler akan menggantikan dengan karakter teks symbol tersebut. Contoh, jika DoneMsg adalah teks makro yang mempunyai nilai “Returning to DOS” maka statemen berikut:
GoodBye DB DoneMsg
Menghasilkan
GoodBye DB ‘Returning to DOS’
EQU
Perintah EQU digunakan untuk mendefinisikan makro. Berikut ini sintaks untuk mendefinisikan makro:
Name EQU text_string
Text_string berhubungan dengan makro teks yang bernama Name.
Text_string ditulis di dalam notasi tanda<>, contoh:
DoneMsg EQU <’Returning to DOS’>
Berikut ini kemungkinan bias terjadi kesalahan pada pendefinisian makro, contoh:
Bumi EQU tanah ; Bumi = “tanah”
Planet EQU Bumi ; Planet = “tanah” (Salah !)
Planet EQU
CASTER
Perintah ini mendefinisikan makro teks baru dengan menggabungkan beberapa string secara bersamaan. CASTER mempunyai sintak sebagai berikut:
Name CASTER string[,string]…
CASTER menggabungkan string dari kiri ke kanan. Turbo assembler membuat makro teks baru dengan nama name.
SUBSTER
Perintah ini mendefinisikan makro teks baru yang merupakan sebagian string dari sebuah string. Sintaknya sebagai berikut:
Name SUBSTER string, position_expression[,size_expression]
Makro teks yang baru, Name terdiri dari bagian string yang dimulai dari karakter position_expression, dengan panjang sebanyak size_expression karakter. Jika size_expression tidak dituliskan maka secara otomatis seluruh sisa karakter dari mulai position_expression akan dimasukkan ke dalam makro teks name. turbo assembler menganggap karakter pertama string sebagai posisi 1.
INSTR
Perintah ini mengembalikan posisi suatu string di dalam string yang lain. Sintaknya sebagai berikut:
Name INSTR [start_expression,]string1,string2
Turbo assembler memberikan name nilai numeric posisi string2 dalam string1. Karakter pertama pada string1 mempunyai posisi 1. Jika string2 tidak ada dalam string1 maka nilai posisinya 0. Jika start_expression dituliskan maka pencarian dimulai dari karakter start_exspression tersebut dan karakter pertama string adalah 1.
SIZESTR
Perintah ini mengembalikan nilai banyaknya karakter dalam sebuah makro teks (jumlah karakter dalam string). Sintaknya sebagai berikut:
Name SIZESTR string
Name diberi nilai numeric panjang dan string. String null <> mempunyai panjang nol.
Contoh manipulasi makro teks:
VERSION T300
ABC EQU
ABC2 EQU ABC ; ABC2= “ABC”
ABC EQU
ABC3 CATSTR ABC2,<,>,ABC,<,>,ABC2 ; ABC3= “ABC,DEF,ABC”
ABCLEN SIZESTR ABC ; ABCLEN = 3
ABC3LEN SIZESTR ABC3 ; ABC3STR = 11
COMMA1 INSTR ABC3,<,> ; COMMA1 = 4
COMMA2 INSTR COMMA1+1,ABC3,<,> ; COMMA2 = 8
ABC4 SUBSTR ABC3,5 ; ABC4 = “def,ABC”
ABC5 SUBSTR ABC3,5,3 ; ABC5 = “def”
ABC6 EQU 3+2+1 ; ABC6 = 6
ABC7 EQU %3+2+1 ; ABC7 = “6”
ABC8 EQU %COMMA1 ; ABC8 = “4”
MAKRO BANYAK BARIS
Fasilitas makro banyak baris digunakan untuk mendefinisikan batang tubuh intruksi, perintah, atau macro lain yang disertakan ke dalam program, di mana saja ,akro tersebut di tempatkan. Argument diberikan dalam makro dan turbo assembler akan menggantikan batang tubuh macro dalam module jika disertakan di dalamnya.
Sintak untuk mendefinisikan makro banyak baris secara umum:
Name MACRO parameter_list
Macro_body
ENDM
Name adalah nama makro banyak baris yang didefinisikan. Macro_body mengandung statemen-statemen yang membangun batang tubuh makro. Kita dapat menempatkan berbagi statemen valid turbo assembler dalam makro. ENDM adalah kata kunci untuk menutup makro.
Contoh berikut makro yang diberi nama PUSHALL, ketika dimasukkan ke dalam program, maka akan disertakan semua perintah yang ada di dalamnya.
PUSHALL MACRO
PUSH AX BX CX DX
PUSH DS SI
PUSH ES DI
ENDM
Parameter_list adalah symbol argument dami (dummy) untuk macro.
Sintaknya sebagai berikut:
[argument_dami[,argument_dami…]]
Kita bisa membuat argumen dami sepanjang baris atau dengan menggunakan karakter \ dapat meneruskan pada baris berikutnya.
Contoh:
ADDUP MACRO dest,
s1, s2
MOV dest, s1
ADD dest,s2
ENDM
Setiap argument dami mempunyai sintak:
Nama_dami [:tipe_dami]
Nama_dami adalah nama simbolik yang digunakan untuk tempat menyimpan argument actual yang ditransfer ke dalam makro pada saat d panggil. Tipe_dami adalah pilihan yang menspesifikasikan sesuatu bentuk di mana argument actual harus mengambilnya ketika makro disisipkan.
Makro adalah nama symbol yang diberikan terhadap satu atau banyak perintah bahasa assembly. Ketika dibuat, makro mungkin digunakan dalam program berulangkali sesuai dengan keperluan. Keuntungan mendefinisikan makro adalah perintah ini hanya dibuat sekali: setiap kali makro dipanggil, assembler membangkitkan perintah di dalamnya. Misalkan kita akan menuliskan instruksi berikut untuk menampilkan isi DL berkaliikali dalam program:
Mov ah, 2
Int 21 h
Kita bisa menyimpan intruksi-intruksi tersebut dalam prosedur dan memanggilnya setiap kali diperlukan. Namun, cara ini memerlukan intruksi tambahan yaitu CALL dan RET, yang menyebabkan program menjadi lambat. Cara yang lebih baik adalah membuat makro, misalnya diberi nama PUTCHAR.
Sekali PUTCHAR didefinisikan, dia dapat dipanggil dari mana saja dalam program. Memanggil makro berbeda dengan memanggil prosedur—ini berarti perintah-perintah dalam makro disisipkan dalam program di mana dia dipanggil. Misalkan, kita definisikan makro bernama PUTCHAR.
Putchar macro ; mulai pendefinisian makro
mov ah, 2
int 21 h
endm ; akhir pendefinisian makro
Dalam segmen kode kita dapat memanggil PUTCHAR hanya menggunakan namanya. Setiap kali makro dipanggil, assembler menyisipkan intruksi-intruksi yang ada dalam definisi makro ke dalam kode program:
Kode Sumber
.code
main proc
…
…
mov dl, ‘A’
putchar
…
…
…
mov dl, ‘*’
putchar
…
…
Kode yang Diperluas
.code
main proc
…
…
mov dl, ‘A’
mov ah, 2
int 21h
…
…
mov dl, ‘*’
mov ah, 2
int 21h
…
Perluasan tersebut dilaksanakan oleh assembler selama pembacaan pertama terhadap file sumber dan hasilnya ditunjukkan dalam file listing (.LST).
Makro dieksekusikan lebih cepat daripada prosedur karena tidak membutuhkan intruksi CALL dan RET sepert pada prosedur.
Melewatkan parameter. Satu fitur utama makro adalah kemampuannya untuk menangani parameter yang dikirim. Ketika memanggil PUTCHAR, misalnya kita akan memberikan nilai DL dengan karakter yang akan ditampilkan sebelum memanggil makro. Akan tetapi, jika kita menambah parameter pada definisi makro (char), kita dapat melewatkan karakter pada baris yang sama pada saat memanggil makro:
putchar makro char
mov ah, 2
mov dl, char
int 21h
endm
.code
…
…
putchar ‘A’
Pengiriman parameter dalam makro membuatnya lebih fleksibel dan baik serta dapat digunakan kapan saja.
Makro untuk membuat data. Makro mungkin dipanggil dari segmen data. Misalkan, makro dapat digunakan untuk mengalokasikan ruang untuk variable. Pada contoh berikut, setiap isi table dibuat oleh makro ALLOC yang derifi dari empat ruang dan empat byte nol:
alloc macro varname, numbyte
varnamedb numbyte dup (‘ ’, 0, 0, 0, 0)
endm
…
…
.data
alloc value1, 20
alloc value2, 50
kode yang diperluas:
value1 db 20 dup(‘ ’, 0, 0, 0, 0)
value2 db 50 dup(‘ ’, 0, 0, 0, 0)
Perlu diketahui, varname dan numbytes adalah parameter yang diperoleh dari argument yang dikirim pada saat makro dipanggil.
Sumber : Abdurohman, Maman. "Buku Pemrograman Bahasa Assembly". 2010
Tidak ada komentar:
Posting Komentar