1. PENDAHULUAN
Intruksi pengatur program berfungsi mengarahkan aliran program dan
membuat aliran tersebut daapat diubah. Perubahan aliran program biasanya
terjadi setelah pengambilan keputusan, seperti hasil intruksi CMP atau TEST
yang diikuti dengan intruksi pengatur program, termasuk intruksi jump, call,
return, interupsi dan intruksi.
Pada bab ini juga akan dipaparkan pernyataan relasional bahasa assembly
(.IF, .ELSE, .ELSEIF, .ENDIF, .WHILE, .REPEAT, .dan .UNTIL) yang ada
pada MASM atau TASM versi 6.X dan yang lebih tinggi, dengan set versi 5.X
untuk kompatibilitas MASM. Perintah relasional bahasa assembly ini membantu
programer membuat bagian aliran pengatur program dengan bahasa C/C++
secara efisien.
NEX
T
2. TUJUAN BAB
Usai mempelajari bab ini, anda akan mampu untuk :
1.
Menggunakan instruksi lompatan bersyarat dan tidak bersyarat untuk
mengatur
aliran program.
2. Menggunakan pernyataan rasional bahasa assembly .IF, .REPEAT, .WHILE, dan
keempatnya dalam program.
3. Menggunakan instruksi call dan returnuntuk memasukkan (push) prosedurprosedur dalam struktur program.
4. Menjelaskan sistem kerja interupsi dan intruksi pengatur inntrupsi.
5. Menggunakan instruksi pengatur mesin untuk mengubah bit flag.
6. Menggunakan ENTER dan LEAVE untuk masuk dan meninggalkan struktur
program.
NEX
T
3. KELOMPOK INSTRUKSI LOMPATAN (JUMP)
Instruksi pengatur program utama, jump (JMP), memungkinkan programer untuk
melompati sebuah bagian program dan bercabang ke suatu bagian memori lain menuju
instruksi selanjutnya. Sebuah lompatan bersyarat memungkinkan programer untuk membuat
keputusan berdasarkan pengetesan anggka. Hasil pengetesan angka ini disimpan dalam bit-bit
flig, yang kemudian dites sengan instruksi lompatan bersysarat. Instruksi lain yang mirip
dengan lompatan bersyarat adlah set bersyarat (Iconditional set), yang dijelaskan dengan
instruksi lompatan bersyarat pada bagian ini.
Pada bagian tulisan ini, semua instruksi lompatan digambarkan melalui penggunaannya pada
contoh program. Selain itu, akan dibahas kembali instruksi LOOP dan LOOP bersyarat, yang
telah diuraikan pada Bab 3, karena juga merupakan salah satu bentuk instruksi lompatan.
NEX
T
4. Opcode
Disp
EB
Opcode
Disp low
Disp high
E9
Opcode
IP Low
IP High
CS Low
CS High
EA
GAMBAR 6-1 : Tiga bentuk utama instruksi JMP. Sebagai
catatan, Disp adalah jarak atau nilai perpindahan bertanda
(signad) 8-bit atau 16-bit.
NEX
T
5. LOMPATAN TIDAK BERSYARAT (JMP)
Tiga jenis instruksi tidak ber syarat (lihat gambar 6-1) yang terdapat pada
mikroprosesor adalah short jump (lompatan pendek), near jump (lompatan dekat), dan far jump
(lompatan jauh).Short jump merupakan intruksi dua byte yang memungkinkan lompatan atau
percabangan atau lokasi memori yang terletak antara +127 da -128 dari alamat sumber ke
alamat yang dituju lompatan. Instruksi tiga byte near jump memungkinkan percabangan atau
lompatan dalam area ±32K byte (atau dimanasaja dibagian program) dari instruksi yang sedang
menjalankan kode program. Perlu diingat bahwa segmen secara alami bersifat siklus. Artinya,
satu lokasi diatas alamat offset FFFFH adalah alamat offset OOOOH. Dengan alasan ini, jika
anda melakukan lompatan dua nyte kedepan dalam memori dan pointer instruksi beralamat
offset FFFFH, aliran program akan berlanjut kealamat offset OOO1H. Oleh karena
itu,displacement ±32k byte memungkinkan sebuah lompatan kesembarang lokasi memori
didalam segman kode tersebut. Terakahir, adlah intruksilima byte far jump yang
memungkinkan sebuah lompatan kesembarang lokasi dalam sistem memori yang sebenarny.
Short jump dan near jump bisa disebut lompatan intrasegman , dan far jump disebut lompatan
intersegmen.
NEX
T
7. TABEL 6-1 Instruksi Lompatan Bersyarat.
Bahasa Assembley
Kondisi yang Dites
Operasi
JA
JAE
JB
JBE
JC
JE atau JZ
JG
JGE
JL
JLE
JNC
JNE atau JPO
JNO
JNS
JNP atau JPO
JO
JP atau JPE
JS
JCXZ
JECXZ
Z = 0 dan C = 0
C=0
C=1
Z = 1 atau C = 1
C =1
Z=1
Z = 0 dan S = O
S=O
S <> O
Z = 1 atau S <> O
C=0
Z=0
O=0
S=0
P=0
O=1
P=1
S=1
CX = 0
ECX = 0
Lompat jika di atas
Lompat jika diatas atau sama
Lompat jika di bawah
Lompat jika di bawah atau sama
Lompat jika carry melakukan set
Lompat jika sama atau lompat jika nol
Lompat jika lebih besar
Lompat jika lebih besar atau sama
Lompat jika lebih kecil
Lompat jika lebih kecil atau sama
Lompat jika tak ada carry
Lompat jika tak sama atau lompat jika tidak nol
Lompat jika tak ada overflow
Lompast jika tak ada sign
Lompat jika tak ada paritas atau lompat jika paritas ganjil
Lompat jika overflow melakukan set
Lompat jika paritas diset atau lompat jika paritas genap
Lompat jika sign diset
Lompast jika CX adalah nol
Lompat jika ECX adalah nol
NEX
T
8. Contoh 6-6
; A Procedure that searches a table of 100 bytes for 0AH.
;The address, TABLE, is transferred to the procedure
;thourgh the SI register.
;
0017
0017
001A
001C
001D
001F
0020
0022
0023
0023
0024
B9 0064
B0 0A
FC
F2/AE
F9
E3 01
F8
C3
SCAN
NOT _
SCAN
PROC
MOV
MOV
CLD
REPNE
STC
JCXZ
CLC
FOUND:
RET
ENDP
NEAR
CX. 100
AL. 0AH
SCASBE
NOT_FOUND
;load count of 100
;load AL with 0AH
;select increment
;test 100 bytes for 0AH
;set carry for not found
;if not found
;clear carry if found
;return from procedure
NEX
T
9. Pengaturan Bit Flag Carry
Flag carry (c)melambangkan carry atau borrow dalam penjumlahan dan penggurangan
multiple-word/double word. Flag ini juga menandakan kesalahan (error) dalam prosedur.
Ada tiga intruksi yang mengatur isi flag carry: STC (set carry), CLC(clear carry),dan CMC
(complement carry).
Karena flag carry jarang digunakan, kecuali pada penjumlahan dan penggurangan multipleword, maka flag tersebut digunakan untuk keperluan lain. Manfaat utama flag carry adalah
menandai kesalahan ketika kembali dari suatu prosedur.misalkan sebuah prosedur membaca
data dari file memori disk. Operasi ini dapat dilakukan dengan sukses, atau malah terjadi
kesalahan seperti file-not-found. Ketika kembali dari prosedur ini, jika C=1 maka terjadi
kesalahan; jika C=0 maka tidak terjadi kersalahan. Kebanyakan prosedur DOS dan BIOS
menggunakan flag carry untuk menandai kondisi kesalahan.
WAIT
Instruksi wait memonitor pin BUSY pada 8086 dan 80386 dan pin TEST pada 8086/8088.
nama pin ini pada mikroprosesor 8086 diubah dari TEST menjadi BUSY. Jika instruksi
WAIT dieksekusi ketika pin BUSY = 1 maka tidak terjadi apa-apa dan instruksi berikutnya
dijalankan. Jika pin BUSY = 0 ketika instruksi WAIT dieksekusi maka mikroprosesor akan
menunggu pin BUSY kembali ke logika 1. Pin ini menandakan keadaan sibuk (busy state)
ketika berada pada level logika 0.
Pin BUSY/TEST mikroprosesor biasanya dihubungkan dengan pin BUSY koprosesor
numerik 8087 sampai 80387. koneksi ini membuat mikroprosesor menunggu sampai
koprosesor menyelesaikan tugasnya. Karena koprosesor berada di dalam 80486 sampai
NEX
Pentium 4, pin BUSY tidak ditemukan pada mikroprosesor jenis ini.
T