Pengendalian alur program m erupakan bagian yang pent ing, Disini progr am kit a dapat m enent ukan keput usan berdasarkan kondisi.
• u n con dit ion a l j u m p
I nst ruksi dasarnya adalah bahwa m engendalikan t ransfer dari sat u t it ik ke t it ik painya didalam program yait u inst ruksi JM P, sint aknya :
JMP label
deklarasikan label dalam program , t ulis nam anya dan t am bahkan ":" set elah nam a label, label berupa kom pinasi karakt er alphanum erik yang t idak dim ulai dengan angka, cont oh:
label1: label2: a:
Label dapat dideklarasikan pada baris t erpisah at au sebelum inst ruksi lainnya, cont oh:
x1:
MOV AX, 1 x2: MOV AX, 2
cont oh inst ruksi JM P :
org 100h
mov ax, 5 ; set ax to 5.
mov bx, 2 ; set bx to 2.
jmp calc ; go to 'calc'.
back: jmp stop ; go to 'stop'.
calc:
add ax, bx ; add bx to ax.
37 stop:
ret ; return to operating system.
Tent u saj a ada cara m udah unt uk m engkalkulasi dua angka, t et api diat as m erupakan cont oh yang baik j uga m engenai penggunaan inst ruksi JM P . Sepert i t erlihat dari cont oh diat as JM P dapat m ent ransfer kendali baik secara forw ard dan backw ard. Dia dapat m elom pat kem anapun dalam code segm ent ( 65,535 byt es) .
• Sh or t Con dit ion a l Ju m ps
Tidak sepert i inst ruksi JM P, inst ruksi ini m engerj akan uncondit ional j um p, dim ana ada inst ruksi yang m enger j akan suat u condit ional j um ps ( j um p hanya j ika kondisinya t erpenuhi ) . I nst ruksi ini di bagi m enj adi t iga kelom pok , Pert am a hanya m enget est flag t unggal , Kedua m em bandingkan angka sebagai signed, dan Ket iga m em bandingkan angka sebagai unsigned.
I n st r u k si Ju m p da la m m e n g e - t e st f la g t u n gga l
Instruction Description Condition Opposite Instruction
JZ , JE Jump if Zero (Equal). ZF = 1 JNZ, JNE
JC , JB, JNAE
Jump if Carry (Below, Not
Above Equal). CF = 1 JNC, JNB, JAE
JS Jump if Sign. SF = 1 JNS
JO Jump if Overflow. OF = 1 JNO
JPE, JP Jump if Parity Even. PF = 1 JPO
JNZ , JNE Jump if Not Zero (Not Equal). ZF = 0 JZ, JE
JNC , JNB, JAE
Jump if Not Carry (Not Below,
38
JNS Jump if Not Sign. SF = 0 JS
JNO Jump if Not Overflow. OF = 0 JO
JPO, JNP Jump if Parity Odd (No Parity). PF = 0 JPE, JP
Sepert i t erlihat ada inst ruksi yang m engerj akan hal yang sam a, perlu diingat bahw a j ika kit a m engkom pile inst ruksi JE k it a a k a n
m e n da p a t k a n disassem bled sebagai: JZ, JC adalah assem bled
yang sam a dengan JB dan sebagainya, Perbedaan nam a digunakan unt uk m em buat program lebih m udah dim engert i, lebih m udah m eng- kode- kan dan yang paling pent ing adalah m udah unt uk diingat . Set iap offset yang di- dissem bler t idak m em punyai pet unj uk m engenai inst ruksi aslinya sepert i apa, oleh karena it ulah digunakan nam a yang um um . Jika kit a m eng- em ulat e kode ini kit a akan m elihat seluruh inst ruksi di- assem bled kedalam JN B, operat ional code ( opcode) unt uk inst ruksi ini adalah 7 3 h inst ruksi ini m em punyai panj ang t et ap dua byt e , byt e kedua m erupakan angka dari byt e t ersebut dit am bahkan ke regist er I P j ika kondisinya t erpenuhi. Karena inst ruksi ini hanya m em punyai 1 byt e unt uk m enyim pan offset yang t er bat as unt uk m engirim kan cont rol ke - 128 byt es ke belakang at au 127 byt es ke depan, nilai ini selalu signed. jnc a jnb a jae a movax, 4 a: movax, 5 ret
39 I n st r u k si j u m p u n t u k a n gk a Sign e d
Instruction Description Condition Opposite Instruction
JE , JZ Jump if Equal (=).
Jump if Zero. ZF = 1 JNE, JNZ
JNE , JNZ Jump if Not Equal (<>).
Jump if Not Zero. ZF = 0 JE, JZ
JG , JNLE
Jump if Greater (>).
Jump if Not Less or Equal (not <=). ZF = 0 and SF = OF JNG, JLE JL , JNGE Jump if Less (<).
Jump if Not Greater or Equal (not >=).
SF <>
OF JNL, JGE
JGE , JNL Jump if Greater or Equal (>=).
Jump if Not Less (not <). SF = OF JNGE, JL
JLE , JNG Jump if Less or Equal (<=). Jump if Not Greater (not >).
ZF = 1 or SF <> OF JNLE, JG I n st r u k si j u m p u n t u k a n gk a u n sign e d
Instruction Description Condition Opposite Instruction
JE , JZ Jump if Equal (=).
Jump if Zero. ZF = 1 JNE, JNZ
JNE , JNZ Jump if Not Equal (<>).
40 JA , JNBE
Jump if Above (>).
Jump if Not Below or Equal (not <=). CF = 0 and ZF = 0 JNA, JBE JB , JNAE, JC Jump if Below (<).
Jump if Not Above or Equal (not >=).
Jump if Carry.
CF = 1 JNB, JAE, JNC
JAE , JNB, JNC
Jump if Above or Equal (>=). Jump if Not Below (not <). Jump if Not Carry.
CF = 0 JNAE, JB
JBE , JNA Jump if Below or Equal (<=). Jump if Not Above (not >).
CF = 1 or ZF = 1
JNBE, JA
Um um nya, j ika diperlukan unt uk m em bandingkan nilai num eric inst ruksi CM P digunakan ( sam a dengan inst ruksi SU B ( subt ract ) , t et api t idak m enyim pan hasilnya, hanya ber pengaruh pada flagnya saj a) . Logikanya sederhana, cont oh : Bandingkan 5 dand 2, 5 - 2 = 3
hasilnya bukan nol ( zero flag diset ke 0) . cont oh lainnya:
bandingkan 7 dan 7, 7 - 7 = 0
hasilnya nol! ( Zero Flag diset ke 1 dan JZ at au JE t idak m elom pat ) . cont oh inst ruksi CM P dan condit ional j um p:
41 org 100h mov al, 25 ; set al to 25. mov bl, 10 ; set bl to 10. cmp al, bl ; compare al - bl. je equal ; jump if al = bl (zf = 1).
putc 'n' ; if it gets here, then al <> bl,
jmp stop ; so print 'n', and jump to stop.
equal: ; if gets here,
putc 'y' ; then al = bl, so print 'y'.
stop:
ret ; gets here no matter what.
Cobalah cont oh diat as dengan angka yang lain unt uk AL dan BL, buka flag dengan m eng- klik t om bol flag , gunakan single st ep dan lihat yang t erj adi. Kit a j uga dapat m em akai F5 unt uk m e- recom pile dan reload program ke em ulat or.
loops
instruction operation and jump condition opposite instruction
LOOP decrease cx, jump to label if cx not zero. DEC CX and JCXZ
LOOPE decrease cx, jump to label if cx not zero and
equal (zf = 1). LOOPNE
LOOPNE decrease cx, jump to label if cx not zero and
not equal (zf = 0). LOOPE
LOOPNZ decrease cx, jump to label if cx not zero and zf
= 0. LOOPZ
LOOPZ decrease cx, jump to label if cx not zero and zf
42 JCXZ jump to label if cx is zero. OR CX, CX and
JNZ
Pada dasarnya loop sam a dengan j um p, m ungkin saj a m engkodekan loop t anpa m enggunakan inst ruksi lo op dengan hanya m enggunakan j um p dan com pare dan sepert i inilah loop bekerj a . sem ua inst ruksi loop m enggunakan regist er CX unt uk m enghit ung langkah, sepert i diket ahui regist er CX m em iliki 16 bit dan nilai m aksim um dapat m enj angkau 65535 at au FFFF,bagaim anapun j uga dapat saj a m elet akkan loop dalam loop sehingga nilai j angkauannya dapat sebesar 65535 * 65535 * 65535 hingga bat as st ack ram penuh. Dim ungkinkan m enyim pan nilai asli pada regist er cx dengan inst ruksi pu sh cx dan m engem balikannya ke asalnya j ika int ernal loop berakhir dengan pop cx, cont oh :
org 100h
movbx, 0 ; total step counter.
movcx, 5 k1: addbx, 1 moval, '1' movah, 0eh int 10h pushcx movcx, 5 k2: addbx, 1 moval, '2' movah, 0eh int 10h pushcx movcx, 5 k3: addbx, 1 moval, '3' movah, 0eh int 10h
loop k3 ; internal in internal loop.
pop cx
loop k2 ; internal loop.
popcx
loop k1 ; external loop.
ret
Sem ua condit ional j um p m em iliki sat u bat asan yang besar, t idak sepert i inst ruksi JM P m ereka hanya j um p sebesar 1 2 7 byt es kedepan dan 1 2 8 byt es kebelakang. Kit a dapat m engat asi bat asan ini dengant rik :
43
o Am bil insruksi opposit e condit ional j um p dari t able diat as,
lalu j um p ke label_x.
o Guanakan inst ruksi JM P unt uk m elom pat ke lokasi yang
diinginkan.
o buat label_x : set elah inst ruksi JM P.
Cont oh : include"emu8086.inc" org 100h mov al, 5 mov bl, 5 cmp al, bl ; bandingkan al - bl. ; je equal ; hanya ada 1 byte
jne not_equal ; jump jika al <> bl (zf = 0).
jmp equal not_equal: add bl, al sub al, 10 xor al, bl jmp skip_data db 256 dup(0) ; 256 bytes skip_data:
putc 'n' ; jika disini ,maka al <> bl,
jmp stop ; cetak 'n', dan jump ke stop.
equal: ; jika disini,
putc 'y' ; maka al = bl, jadi cetak 'y'.
stop: ret
Cont oh lainnya, m enggunakan m et ode yang disediakan nilai t erdekat dalam label. Jika nilai t erdekat diaw ali $ m aka j um p dilakukan, kalau
44 t idak com piler m enghit ung inst ruksi dim ana j um p secar a langsung diberikan ke offset , cont oh :
org 100h
; unconditional jump forward: ; skip over next 3 bytes + itself
; the machine code of short jmp instruction takes 2 bytes.
jmp $3+2 a db 3 ; 1 byte.
b db 4 ; 1 byte.
c db 4 ; 1 byte.
; conditional jump back 5 bytes:
movbl,9
decbl ; 2 bytes.
cmpbl, 0 ; 3 bytes.
jne $-5 ; jump 5 bytes back
ret
45 BAGI AN 8