Procedure m erupakan bagian dari kode yang dapat dipanggil dari program dalam rangka t ugas t ert ent u. Prosedur m em buat program lebih t erst rukt ur dan m udah dim engert i. Um um nya prosedur m engem balikan t it ik dim ana dia dipanggil, sint aknya : name PROC
; kode dituliskan disini ; dalam badan prosedur ... RET
name ENDP
nam e – nam a prosedur, nam a ini harus sam a dia awal dan akhir prosedur.
RET m enyat akan kem bali ke OS set elah pem anggilan prosedur. PROC dan EN D P m erupakan direkt iv com piler ,j adi t idak di- assem bled ke dalam kode m esin. Kom piler hanya m engingat
alam at dari prosedur.
I nst ruksi CALL digunakan unt uk m em anggil prosedur.
Cont oh:
ORG 100h CALL m1 MOV AX, 2
RET ; kembali ke OS. m1 PROC
MOV BX, 5
RET ; kembali ke pemanggilnya m1 ENDP
END
cont oh diat as m em anggil prosedur m 1, yang m engerj akan M OV BX , 5, dan kem bali ke inst ruksi selanj ut nya set elah CALL: M OV AX , 2.
46 Ada beberapa cara unt uk m engirim param et er ke prosedur, yang paling m udah adalah m engirim kan param et er m enggunakan regist er, disini cont oh lainnya dari prosedur yang m enerim a dua param et er dalam regist er AL dan BL , kalikan kedua param et er dan kirim hasilnya ke regist er AX:
ORG 100h MOV AL, 1 MOV BL, 2 CALL m2 CALL m2 CALL m2 CALL m2
RET ; kembali ke OS. m2 PROC
MUL BL ; AX = AL * BL. RET ; kembali ke pemanggil. m2 ENDP
END
cont oh dalam diat as nilai regist er AL di updat e set iap saat prosedur di panggil, regist er BL t et ap t idak berubah, j adi algorit m a ini m enghit ung 2 pangkat 4, hasil akhirnya di regist er AX adalah 1 6 ( or 10h) .
Cot oh lainnya, prosedur m encet ak pesan Hello World! :
ORG 100h
LEA SI, msg ; load address msg ke SI. CALL print_me
RET ; ke OS. ;
========================================================== ; prosedur ini mencetak string,stringy harus null
; terminated (ada nol diakhir string), ; alamat string hrs berada di register SI : print_me PROC
47 next_char:
CMP b.[SI], 0 ; check jika nol ke stop JE stop ;
MOV AL, [SI] ; selanjutnya ambil karakter ASCII . MOV AH, 0Eh ; teletype nomer function.
INT 10h ; gunakan interrupt utk mencetak karakter di AL. ADD SI, 1 ; advance index dari string array.
JMP next_char ; kembali dan cetak karakter lainnya. stop:
RET ; kembali ke pemangil proc. print_me ENDP
;
========================================================== msg DB 'Hello World!', 0 ; null terminated string.
END
prefix "b." sebelum [ SI ] berart i bahwa kit a perlu
m em bandingkan byt e, bukan word. Jika kit a perlu m em bandingkan word t am bahkan prefix "w ." . Jika salah sat u operand pem bandingnya berupa regist er, hal t ersebut t idak diperlukan karena com piler t ahu ukuran t iap regist er .
48 BAGI AN 9
STACK
St ack adalah suat u area di m em ori yang m enyim pan dat a
sem ent ara. St ack digunakan dengan inst ruksi CALL unt uk
m enyim pan alam at yang dikem balikan pada prosedur ,inst ruksi
RET m engam bil nilai ini dari st ack dan m engem balikannya ke
offset . Ham pir sam a kej adiannya j ika inst ruksi I N T m em anggil int errupt , dia m enyim pan regist er sflag st ack, code segm ent dan offset . inst ruksi I RET digunakan unt uk m engem balikan dari pem anggilan int errupt . Kit a j uga dapat m enggunakan st ack unt uk m enyim pan dat a lainnya, ada dua inst ruksi yang bekerj a dengan st ack :
PUSH - m enyim pan nilai 16 bit dalam st ack.
POP – m engam bil nilai 16 bit dari st ack. Synt ax for PUSH inst r uct ion:
PUSH REG PUSH SREG PUSH memory PUSH immediate REG: AX, BX, CX, DX, DI , SI , BP, SP. SREG: DS, ES, SS, CS. m e m or y: [ BX] , [ BX+ SI + 7] , 16 bit variable, et c... im m e dia t e: 5, - 24, 3Fh, 10001101b, et c...
Synt ax for POP inst ruct ion: POP REG
POP SREG POP memory
REG: AX, BX, CX, DX, DI , SI , BP, SP. SREG: DS, ES, SS, ( except CS) .
49 Cat at an:
• PUSH dan POP bekerj a dengan nilai 16 bit saj a !
• PUSH im m e dia t e bekerj a hanya pada CPU 80186 dan sesudahnya!
St ack m enggunakan algorit m a LI FO ( Last I n First Out ) , art inya j ika kit a push nilai sat u per sat u ke dalam st ack : 1 , 2 , 3 , 4 , 5
nilai pert am a yang dapat kit a pop adalah 5, lalu 4, 3, 2, dan t erakhir 1.
Jum lah yang di PUSH dan di POP ha r u s sa m a, j ika t idak st ack akan corrupt ed dan t idak dapat kem bali ke OS . Kit a gunakan inst ruksi RET unt uk kem bali ke OS, j adi j ika program m ulai ada alam at yang dikem balikan di st ack ( um um nya 0000h) . I nst ruksi
PUSH dan POP berguna karena kit a t idak m em iliki cukup
regist er unt uk dioperasikan, t riknya adalah :
• Sim pan nilai original dari regist er dalam st ack ( dg PUSH) . • Pakai regist er unt uk t uj uan apapun.
50 cont oh:
ORG 100h MOV AX, 1234h
PUSH AX ; simpan nilai AX di stack. MOV AX, 5678h ; modify nilai AX . POP AX ; kembalikan nilai original AX RET
END
Cont oh lainnya kegunaan st ack dalam pert ukaran nilai :
ORG 100h
MOV AX, 1212h ; simpan 1212h di AX. MOV BX, 3434h ; simpan 3434h di BX
PUSH AX ; simpan nilai AX di stack. PUSH BX ; simpan nilai BX di stack. POP AX ; set AX ke nilai original BX. POP BX ; BX ke nilai original AX RET
END
Pert ukaran t erj adi karena st ak m em akai algorit m a LI FO ( Last I n First Out ) , j adi saat kit a push 1 2 1 2 h dan kem udian 3 4 3 4 h,
pada saat pop kit a m endapat kan yang pert am a 3 4 3 4 h
kem udian 1 2 1 2 h. Area m em ori st ack di set oleh regist er SS ( St ack Segm ent ) , dan regist er SP ( St ack Point er) . Um um nya OS m engeset nilai regist er ini saat program m ulai . "PU SH so u r ce" inst ruksi ini m engerj akan:
• Kurangi 2 dari regist er SP .
51 "POP d e st in a t io n" inst ruksi ini m engerj akan :
• Tulis nilai alam at SS:SP ke d e st in a t ion. • t am bahkan 2 ke regist er SP.
Alam at sekarang dit unj uk oleh SS:SP yang dinam akan t he t op of t h e st a ck. Unt uk file .COM st ack segm ent pada um um nya berada di code segm ent , dan st ack point er diset pada nilai 0 FFFEh. Pada alam at SS:0 FFFEh disim pan alam at kem balian unt uk inst ruksi RET yang dieksekusi pada akhir program . Klik t om bol [St a ck] pada em ulat or window. The t op of t he st ack dit andai dengan "<" .
52 BAGI AN 1 0
M AKRO
Macros ham pir m irip prosedur, t et api set idaknya dia hanya ada hingga kode dikom pilasi, set elah kom pilasi dialkukan sem ua m akro akan dig ant i dengan inst ruksi m esin . Jika kit a m endeklarasikan m akro dan t idak pernah m enggunakannya dalam kode, com piler akan m engabaikannya. e m u8 0 8 6 .in c m erupakan cont oh bagaim ana m akro dapat dipakai, file ini berisi beberapa m akro unt uk m em perm udah pengkodean kit a.
Macro definit ion:
name MACRO [parameters,...] <instructions>
ENDM
Tidak sepert i prosedur m akro harus didefinisikan diat as kode yang akan m em akainya, cont oh :
MyMacro MACRO p1, p2, p3 MOV AX, p1 MOV BX, p2 MOV CX, p3 ENDM ORG 100h MyMacro 1, 2, 3 MyMacro 4, 5, DX RET
Kode diat as diperluas m enj adi: MOV AX, 00001h
MOV BX, 00002h MOV CX, 00003h
53 MOV AX, 00004h
MOV BX, 00005h MOV CX, DX
Pebedaan m a cr os dan pr oce du r e s:
• prosedur dipakai dengan inst ruksi CALL, cont oh: CALL MyProc
• Makro hanya m enuliskan nam anya saj a, cont oh: MyMacro
• Prosedure t erlet ak pada alam at yang spesifik di m em ori, dan j ika kit a m enggunakan procedur e yang sam a sebanyak 100 kali, CPU hanya m ent ransfer cont rol ke bagian m em ori. Kont rol akan dikem balikan dengan inst ruksi RET. St a ck yang digunakan unt uk m enyim pan alam at pengem balian. I nst ruksi CALL m em erlukan set idaknya 3 byt es, j adi ukuran out put execut able file- nya t idak besar ,t idak m asalah seberapa banyak pem anggilan pr osedur dilakukan.
• Macro akan m enam bah secara langsung dalam kode program . Jadi j ika k it a m em akai 100 kali m akrokom piler akan m enam bah sebanyak 100 kali pada out put exe filnya set iap kali m akro t ersebut di pakai. • St ack at au general pur pose regist er har us digunakan unt uk m engirim
param et er dalam prosedur.
• Unt uk m engirim kan param et er ke m akro kit a dapat m enget ikkannya set elah nam a m akronya, cont oh:
MyMacro 1, 2, 3
• Unt uk m enandai akhir m akro gunakan direkt iv EN D M sudah cukup. • Unt uk m em andai akhir procedure harus m enget ikan nam a prosedur
sebelum dir ekt ive EN D P.
Makro akan diperluas secara langsug dalam kode, sehingga j ika ada label didalam definisi m akro kit a akan
m endapat kan pesan error " Duplicat e declarat ion" saat m akro dipakai dua kali at au lebih. Unt uk m enghindari ini gunakan direct ive LOCAL diikut i nam a variabelnya , nam a label at au procedure, cont oh:
54 MyMacro2 MACRO
LOCAL label1, label2 CMP AX, 2 JE label1 CMP AX, 3 JE label2 label1: INC AX label2: ADD AX, 2 ENDM ORG 100h MyMacro2 MyMacro2 RET
Jika kit a akan m erencanakan m engunakan m akro pada program , m ungkin lebih baik m enem pat ka m akro pada file yang berbeda. Tem pat kan di folder I nc dan gunakandirekt ive I N CLUD E f ile - n a m e unt uk m enggunakan m akro.
55 BAGI AN 1 1