Rabu, 22 Juni 2011

PENGGUNAN MAKRO LEBIH LANJUT

Pendefinisian Blok Berulang
Satu atau lebih perintah dapat diulang menggunakan perintah REPT, IRP dan IRPC. Hal ini memungkinkan bagi sebuah makro untuk membuat struktur data yang besar.
Perintah REPT. Perintah REPT mengulang stu blok instruksi berdasarkan pencacah. Sintaknya sebagai berikut:

REPT ekspresi
Statemen
ENDM
Ekspresi menentukan jumlah pengulangan dan mengevaluasi bilangan tidak bertanda 16-bit. Misalkan, kita ingin menggunakan REPT untuk mendefinisikan ruang untuk table yang mengandung data 100 mahasiswa:
index label byte
rept 100
db ? dup (?)
db 20 dup (?)
dw ?
endm
kita bisa menggunakan cara yang sama untuk makro yang dapat menggeser operand ke kiri dengan jumlah tertentu. Contoh berikut, count menentukan jumlah instruksi SHL yang dibangkitkan oleh assembler:
mshl macro dest, count
rept count
shl dest, 1
endm
endm
Ini merupakan definisi makr bersarang. Kita dapat melihat bagaimana makro ini dipanggil dengan dua cara, seperti berikut ini:
mshl ax, 1
mshl bx, 4
kode yang diperluas
shl ax, 1
shl bx, 1
shl bx, 1
shl bx, 1
shl bx, 1
Perintah IRP. Perintah IRP membuat pengulangan blok jika setiap pengulangan mengandung nilai yang berbeda. Sintaknya sebagai berikut:
IRP parameter,
Statemen
ENDM
Blok diulang sekali untuk setiap argument. Begitu mengulang, nilai argument sekarang digantikan untuk parameter. Perintah ini berguna untuk menginisialisasi table atau blok data dimana terdapat nilainya yang bervariasi. Argument mungkin berupa nama symbol, string atau konstanta numeric.
Statemen sumber
irp parm, <10, 20, 30, 40>
dw parm, parm*2, parm*3, parm*4
endm
Dibangkitkan oleh assembler
dw 10, 10*2, 10*3, 10*4
dw 20, 20*2, 20*3, 20*4
dw 30, 30*2, 30*3, 30*4
dw 40, 40*2, 40*3, 40*4
IRP dapat menginialisai table offset prosedur. Ini membuktikan kegunaan jika kita ingin mengkodekan pencabangan dengan berbagai cara berdasarkan nilai index. Contoh:
mov bx, indexvalue ; memilih table entry
call proctable [bx] ; pemanggilan tidak langsung
Empat nama prosedur dikirim sebagai argument dalam contoh IRP berikut. Masing-masing disisipkan ketika procname tampil, menghasilkan dalam table yang mengandung offset prosedur:
proctable label word
irp procname,
dw procname
endm
perintah-perintah berikut akan dibangkitkan:
proctable label word
dw movup
dw movdn
dw movlft
dw movrt
Makro Jump Tambahan. Program yang menggunakan loncat kondisional atau loop memungkinkan masuk dalam masalah ketika keluar dari range yaitu 127 byte. Seperti dalam makro LLOOP yang telah dibuat, kta dapat membuat makro extended jump yang mengizinkan loncatkondisional ke label terdekat, sebagai berikut:
jxe macro dest
local L1, L2
je L1
jmp short L2
L1 : jmp dest
L2 :
endm
Dengan makro ini, kita dapat membuat instruksi sebagai berikut, dimana loopTop dapat berada di mana saja dalam program.
jxe loopTop
Masalahnya di sini kita harus membuat makro yang terpisah untuk masing-masing instruksi jump yang berbeda. Di sinilah kelebihan instruksi IRP yang hanya perlu satu blok instruksi saja untuk mengakomodasi seluruh kondisi jump, sebagai berikut:
irp cond,
jxe&cond macro dest
local L1, L2
j&cond L1
jmp short L2
L1 : jmp dest
L2 :
endm
endm
Berikut ini contoh pemanggilan yang dapat dilakukan:
jxa L1 ; jump extended if above
jxae L3 ; jump extended if above or equal
jxz L1 ; jump extended if zero
jxne L4 ; jump extended if not equal
jxg L2 ; jump extended if greater
jxo L1 ; jump extended on overflow
Makro Penggeseran Generik. Di atas telah dibuat makro MSHL yang dapat melakukan penggeseran operand ke kiri sejumlah yang kita inginkan. Dengan mengombinasikan perintah IRP dan makro tersebut, kita dapat membuat suatu prosedur penggeseran yang lebih andal, sebagai berikut:
irp styp,
m&styp macro dest, count
rept count
&styp dest, 1
endm
endm
endm
Contoh pemanggilan makro tersebut adalah :
mshl ax, 3
mrcl count, 2
mshr bx, 4
mror ax, 5
Instruksi yang dibangkitkan oleh assembler adalah sebagai berikut:
mshl ax, 3
shl ax, 1
slh ax, 1
slh ax, 1
mrcl count, 2
rcl count, 1
rcl count, 1
Perintah IRPC. Perintah IRPC pada dasarnya sama dengan IRP, kecuali jumlah karakter dalam string argument menentukan jumlah pengulangan.
Sintaknya sebagai berikut:
IRPC parameter, string
Statement
ENDM
String harus ditutup dengan kurung siku (<>) jika mengandung spasi, atau karakter khusus lainnya. Contoh berikut membangkitkan lima variable (value_A, value_B dan sebagainya) menggunakan karakter dalam string ABCD sebagai argument:
irpc parm, ABCDE
value_&parm db ‘&parm’
endm
Menghasilkan perintah sebagai berikut:
value_A db ‘A’
value_B db ‘B’
value_C db ‘C’
value_D db ‘D’
value_E db ‘E’

Tidak ada komentar:

Posting Komentar