'Omank dharmA' BaliRockers

Rabu, 06 April 2011

MAKRO

Makro (macro) adalah nama simbolik dari string teks atau satu blok kode yang akan digunakan berulang-ulang dalam program. Pada turbo assembler disediakan operator makro yang mudah dan fleksibel dengan kemampuan yang andal. Di samping itu juga terdapat fasilitas makro beberapa (multiline macros) baris dengan argumennya.

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 ; Planet = “Bumi” (Salah !)

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 ; ABC = “abc”

ABC2 EQU ABC ; ABC2= “ABC”

ABC EQU ; ABC = “def” (definisi ulang)

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