Rabu, 22 Juni 2011

TIP-TIP TAMBAHAN MAKRO

Menyimpan Makro dalam File Include. Setelah membuat kumpulan makro, akan menjadi tidak baik kalau harus menyalin semuanya pada setiap program baru. Terdapat cara lebih baik, dengan membuat file yang berisi makro dan dengan menggunakan perintah INCLUDE untuk menyalinnya pada waktu assembly. Hanya makro yang digunakan yang menjadi bagan dari program akhir. Jika kita menggunakan two-pass assembler seperti Microsof Assembler, akan lebih baik untuk menyimpan perintah INCLUDE dalam lingkungan pengecekan kondisi IF1, yang memerintah assembler untuk melibatkan makro hanya pada saat pertama kali:



if1

include lib1.mac

endift

Berikut contoh file makro yang dapat digunakan pada aplikasi yang memerlukan salah satu makro yang ada didalamnya:

; Macro.Inc


; File ini harus di-include pada setiap program sumber yang memerlukan. Program juga harus di-link ke CONSOLE.LIB



call_WritInt locate

cCall mDisplay

cmpj mMove

display_at mshl

exit mult

getYN putchar

inputInt repeat


inputStr startup

jx_ write

1Loop

Extern ReadInt : proc, ReadString : proc

; menulis integer ke konsol

call_WriteInt macro value, radix

push ax


push bx

mov ax, value

mov bx, value

call writeint

pop bx

pop ax


endm

; pemanggilan prosedur kondisional

cCall macro cond, procname

local L1, L2

j&cond L1

jmp L2


L1 : call procname

L2 : exitm

endm



; membandingkan dua operand dan loncat ke

; berdasarkan flag




cmpj macro dest, flag, source, label

cmp dest, source

j&flag label

endm

; menampilkan string pada baris, kolom dalam konsol


display_at macro row, col, string

locate row, col

mDisplay string

endm



; keluar ke Dos dan mengembalikan kode

exitm macro ecode


mov ah, 4Ch

mov al, ecode

int 21h

endm



; mengambil respons Y/N (y/n). Argument harus huruf kapital yang akan


menset ZF

GetYN macro prompt, exact

write prompt

mov ah, 1

int 21h

sub al, 32


cmp al, exact

endm



; menampilkan prompt huruf pada , dan meng-input integer dan menyimpannya pada

inputInt macro row, col, prompt, dest

locate row, col

write prompt


call ReadInt

mov dest, ax

endm



; menampilkan prompt huruf pada , . Kemudian, memasukkan string ASCIIZ dan menyimpannya ke . Maksimum karakter =

inputStr macro row, col, prompt, dest, max

locate row, col


write prompt

push cx

push dx

mov dx, pffset dest

mov cx, max

call ReadString


pop dx

pop cx

endm



; jump eXtented (JX_) ; loncat kondisional ke label NEAR (di mana saja dalam segmen)



irp cond,

jxe&cond macro dest


local L1, L2

j&cond L1

jmp short L2

L1 : jmp dest

L2 :

endm


endm



; Loop ke label NEAR (dimana saja dalam segmen)

1Loop macro dest

local A1, A2

loop A1

jmp A2

A1 : jmp dest


A2 :

endm





; meletakkan kursor pada , pada video halaman 0.

locate macro ro, column

push ax


push bx

push dx

mov bx, 0

mov ah, 2

mov dh, row

mov dl, column


int 10h

pop dx

pop bx

pop ax

endm



; menampilkan $-terminated string

mDisplay macro string

push ax


push dx

push ah, 9

mov dx, offset string

int 21h

pop dx

endm



; memindahkan word atau byte dari memori ke memori

mmove macro dest, source


push ax

if (type dest) EQ 1

mov al, source

mov dest, al

else

if (type dest) EQ 2


mov ax, source

mov dest, ax

endif

endif

pop ax

endm




; menggeser ke kiri, kali dengan melakukan instruksi penggeseran tunggal

mshl macro dest, count

rept count

shl dest, 1

endm


endm

; mengalikan dua operand

mult macro dest, source

push ax

push bx

mov ax, dest

mov bx, source

mul bx


mov dest, ax

pop bx

pop ax

endm

; mengeluluarkan karakter ke konsol

putchar macro char

mov ah, 2


mov dl, char

int 21h

endm

; mengeluarkan karakter kali

repeat macro char, count

local L1


mov cx, count

L1 : mov ah, 2

mov dl, char

int 21h

loop L1

endm




; set DS dan ES ke segmen data. Menyimpan alamat segmen PSP dalam variable

startup macro pspSeg

push ds

mov ax, @data

mov ds, ax

mov es, ax

pop pspSeg


endm



; makro WRITE menulis huruf ke output standar. adalah string yang berada antara tanda kutip. Jika tidak kosong, mengindikasikan bahwa carriage return ditampilkan.

write macro text, creturn

local string, crlf

push ax


push dx

mov ah, 9

int 21h



infb

mov dx, offset crlf

int 21h

endif


pop dx

pop ax

.data

string db text, ‘$’

crlf db 0Dh, 0Ah, ‘$’

.code

endm



; makro berikut menghasilkan delapan makro, yang bernama MSHL, MSHR, MSAR, MROL, MROR, MRCL, dan MRCR.


irp styp,

m&styp macro dest, count

rept count

&styp dest, 1

endm

endm


endm

Tidak ada komentar:

Posting Komentar