Rabu, 22 Juni 2011

LIBRARY MAKRO

Makro CCALL. Salah satu penggunaan makro yang sangat baik adalah meningkatkan set intsruksi Intel—ini akan memudahkan program untuk ditulis. Makro CCALL (condition call) memungkinkan untuk memanggil prosedur berdasarkan flag, menggunakan instruksi tunggal:
Ccall macro con, procname
local L1, L2
j&cond L1
jmp L2
L1 : call procname
L2 : exitm
endm
Makro dapat berdasarkan kondisi flag tertentu. Contoh, kita dapat memanggil prosedur DOS_ERROR ketika CF diset. Misalkan sebagai berikut:
Ccall c, DOS_error
Atau, kita memanggil LOWER jika value 1 kurang dari atau sama dengan AX:
Asal Kode yang dibangkitkan
cmp value 1, ax cmp value1, ax
Ccall le, lower jle ??0002
jmp ??0003
??0002 : call lower
??0003 :
Kita dapat memanggil NOT_EQUAL jika AX tidak sama dengan BX :
cmp ax, bx
Ccall ne, not_equal
Setelah membandingkan dua string, kita dapat memanggil EXCHANGE :
call compare
Ccall a, exchange
Makro CMPJ. Makro CMPJ (compare and jump) membandingkan dua operand dan loncat ke kabel berdasarkan flag:
cmpj macro dest, flag, source, label
cmp dest, source
j&flag label
endm
Contoh Pemanggilan
cmpj ax, le, bx, labell ; jika AX <= BX, loncat ke labell
cmpj cx, e, count, exit ; jika CX = count, loncat ke exit
Makro MULT. Seperti kita ketahui, instruksi MUL menyebabkan keterbatasan tertentu; AL atau AX merupakan operand tujuan otomatis, dan operand sumber immediate tidak diperbolehkan. Makro MULT pada contoh berikut melalkukan perkalian operand 16-bit oleh register, operand memori, atau operand immediate:
mult macro dest, source
push ax
push bx
mov ax, dest
mov bx, source
mul bx
mov dest, ax
pop bx
pop ax
endm
Makro MULT mengalikan dest dengan source, menempatkan hasilnya dalam dest. Jika hasilnya lebih besar dari 16 bit, maka CF diset dan bagian atas hasinya disimpan dalam DX.
Contoh berikut memenggil MULT mendemontrasikan fleksibilitas dalam perkalian operand berbagai tipe:
mov cx, value 1
mult cx, 5
mult value1, value2
mult value2, 5


value 1 dw 100h
value2 dw 2
Makro MMOVE. Set intruksi Intel tidak mempunyai instruksi pemindahan dari memor ke memori. Makro MMOVE dapat melakukan hal ini, seperti contoh berikut:
mmove macro dest, source
push ax
if (type dest) EQ 1
mov a1, source
mov dest, al
else
if (type dest) EQ 2
mov ax, source
mov dest, ax
endif
endif
pop ax
endm
Contoh Pemanggilan
mmove word2, word1 ; 16-bit move
mmove byte2, byte1 ; 8-bit move
Oleh karena operator TYPE digunakan pada makro ini maka pesan kesalahan akan ditampilkan jika tdak terdapat perintah. DATA pada file sumber sebelum definisi makro. Hal ini terjadi karena assembler memerlukan untuk meletakkan variable sebelum dapat mengevaluasi tipenya. Segmen berikut mungkin bisa digunakan:
.stack 100h
.data
(variabel)
(definisi makro)
.code
(intruksi)
Loncat Kondisioanal dan Liupan (Conditional Jumps and Loops). Set instruksi Intel mempunyai batasan jangkauan instruksi loncat kondisional—termasuk LOOP—sampai 127 ke depan atau 128 byte ke belakang. Khususnya, ketika program mempunyai sejumlah pemanggilan makro dalam jangkauan loncat kondisional atau liupan, ini mungkin menyebabkan keluar dari range. Misalkan, kita akan mengonversi prosedur WRITESTRNG, READSTRING dan WRITEIN menjadi makro dan menggunakannya dalam program:
Mov cx, 10
L1 : writestring promt
readstring buffer
writein 1000h, 10
loop L1
Contoh ini akan menyebabkan kesalahan sintak karena kode menghasilkan dengan makro di dalamnya, liupan yang lebih dari 127 byte sehingga LOOP akan keluar range.
Makro LLOOP. Makro LLOOP (long loop) mengizinkan kita untuk meliup ke suatu label dalam segment sekarang. Dia melakukan in dengan meliup ke instruksi JMP yang meloncat ke tujuan. JMP, tidak seperti LOOP, dapat menjangkau suatu label dalam segmen:
LLoop macro dest
local A1, A2
loop A1
jmp A2
A1 : jmp dest
A2 :
endm
Makro menggunakan instruksi LOOP tidak seperti biasanya. Dia meloncat ke depan kelabel A1. Pada lokasi ini, instruksi JMP kembali loncat ke dest. Ketika CX = 0, LOOP terjadi dan loncat ke A2, yaitu lokasi instruksi berikutnya.

Tidak ada komentar:

Posting Komentar