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