Instruksi Pengatur Program 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. NEXT
Usai mempelajari bab ini, anda akan mampu untuk : TUJUAN BAB Usai mempelajari bab ini, anda akan mampu untuk : 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) prosedur- prosedur 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. NEXT
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. NEXT
Opcode E B Disp Opcode E 9 Disp low Disp high Opcode E A IP Low IP High CS Low CS High GAMBAR 6-1 : Tiga bentuk utama instruksi JMP. Sebagai catatan, Disp adalah jarak atau nilai perpindahan bertanda (signad) 8-bit atau 16-bit. NEXT
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. NEXT
Gambar rangkaian short jump, near jump, dan far jump NEXT
TABEL 6-1 Instruksi Lompatan Bersyarat. Bahasa Assembley 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 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 NEXT
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 001A 001C 001D 001F 0020 0022 0023 0024 B9 0064 B0 0A FC F2/AE F9 E3 01 F8 C3 SCAN NOT _ PROC 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 NEXT
Pengaturan Bit Flag Carry 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 multiple-word, 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 Pentium 4, pin BUSY tidak ditemukan pada mikroprosesor jenis ini. NEXT
HLT Instruksi halt (HLT) menghentikan eksekusi perangkat lunak. Ada 3 cara untuk keluar dari halt : melalui sebuah instruksi dengan resep perangkat keras, atau dengan operasi DMA. Instruksi ini biasanya muncul pada program untuk menunggu interupsi. Seringkali dibuat sinkronisasi antara interupsi perangkat keras dengan sistem perangkat lunak. NOP Ketika mikroprosesor menjumpai instruksi no operation (NOP) maka hanya dibutuhkan sedikit waktu untuk melakukan eksekusi. Pada masa awal, sebelum perangkat pengembangan perangkat lunak ada, sebuah NOP yang menjalankan no operation sering dipakai untuk memberikan ruang dalam perangkat lunak bagi instruksi bahasa mesin mendatang. Jika anda mengembangkan bahasa mesin, yang sangat jarang sekali, direkomendasikan untuk menempatkan 10 atau juga NOP pada program anda dalam interval 50-byte. Hal ini akan berguna ketika anda membutuhkan penambahan instruksi pada tempat tersebut di masa yang akan datang. NOP juga digunakan untuk aplikasi waktu tunda (time delay), yaitu untuk menghabiskan waktu. Perlu disadari bahwa NOP yang digunakan untuk pewaktuan tidak terlalu akurat karena cache dan pipeline pada mikroprosesor modern. Prefiks LOCK Prefiks LOCK melampiri sebuah instruksi dan menyebabkan pin LOCK berlogika 0. Pin LOCK sering digunakan untuk menonaktifkan bus master eksternal atau komponen sistem. Prefiks LOCK menyebabkan pin LOCK diaktifkan selama selang waktu instruksi kuncian (locked). Jika terdapat lebih dari sebuah instruksi yang dikunci, pin LOCK akan tetap berada. Pada logika 0 selama selang waktu urutan intruksi LOCK:MOV AL,[SI] merupakan contoh instruksi kucian. NEXT
ESC Instruksi escape (ESC) menyalurkan informasi ke koprosesor numerik 8087-pentium 4. ketika instruksi ESC dieksekusi, mikroprosesor akan menyediakan alamat memori jika dibutuhkan, tetapi juga tetap melaksanakan NOP. Enam bitdalam instruksi ESC menyediakan opcode ke koprosesor dan mulai mengeksekusi instruksi. Opcode ESC tidak pernah terlihat dalam program sebagai ESC dan dianggap sebagai opcode yang usang. Sebagai penggantinya terdapat sekumpulan instruksi kopresesor (FLD,FST,FMUL dan lai-lain) yang di-assembly sebagai instruksi ESC untuk kopresesor. Penjelasan lebih lanjut ada pada Bab 13, yang menjelaskan koprosesor numerik 8087-pentium 4. BOUND Instruksi BOUND dibuat pertama kali untuk mikroprosesor 80186, merupakan instruksi perbandingan yang mungkin menyebabkan interupsi (tipe vector nomor 5). Instruksi ini membandingkan isi memori register 16-bit atau 32-bit dengan isi memori dua word atau double word: batas atas dan bawah. Jika nilai dalam register yang dibandingkan dengan memori tidak berada dalam batas atas dan bawah, interupsi tipe 5 terjadi. Akan tetapi, jika nilainya masih berada dalam batas maka instruksi berikutnay dalam program akan dieksekusi. Sebagai contoh, jika instruksi BOUND SI, DATA dieksekusi maka lokasi DATA berukuran word berisi batas bawah, dan lokasi DATA+2byte yang berukuran word berisi batas atas. Jika angka yang terdapat dalam SI lebih kecil dari lokasi memori DATA atau lebih besar dari lokasi memori DATA+2byte maka interupsi tipe 5 terjadi. Perlu diketahui bahwa insterupsi ini terjadi, alamat return menunjuk pada instruksi BOUND, bukan pada instruksi yang mengikuti BOUND. Ini berbeda dengan instruksi biasa, dimana alamat return menunjuk pada instruksi berikutnya dalam program. NEXT
ENTER dan LEAVE Instruksi enter dan leave, pertama dibuat untuk mikroprosesor 80186, digunakan dengan frame stack, dimana mekanismenya digunakan untuk mneneruskan parameter pada sebuah priosedur. Frame stack menyediakan area memori dinamis untuk prosedur dalam lingkungan multipengguna. Instruksi ENTER menciptakan sebuah frame stack dengan mem-push BP kedalam stack dan kemudian mengisi BP dengan alamat frame paling atas. Hal ini membuat frame menjadi variabel untuk di akses melalui register BP. Instruksi ENTER berisi dua operand; operand pertama menentukan jumlah byte yang dicadangkan untuk variabel pada frame stack dan operand kedua level prosedur. Misalkan instruksi ENTER 8,0 dieksekusi. Instruksi ini mengalokasikan 8 byte untuk frame stack dan angka 0 menentukan level 0. gambar 6-9 memperlihatkan frame stack yang dibuat oleh instruksi ini. Perlu diketahui bahwa instruksi ini menympan BP ke stack paling atas. Kemudian, instruksi itu mengurangi stack pointer dengan 8, meninggalkan 8 byte ruang memori untuk penyimpanan data temporer. Lokasi paling atas dari 8 byte area penyimpanan temporer ini dialamati oleh BP. Instruksi LEAVE mengembalikan proses ini dengan mengsi SP dan BP dengan nilai awal mereka. NEXT
Soal 1. Berikan contoh short jump, near jump, dan far jump dengan menggunakan gambar rangkaiannya! 2. Buatlah contoh dari instruksi bersyarat dan buatlah satu soal dari instruksi set bersyarat tersebut! 3. Apa perbedaan antara pengaturan bit Flag Carry, Wait, HLT, NOP, Prefiks Lock, ECS, Bound, enter dan leave dari materi pengaturan mesin serta instruksi miscellaneous! NEXT
TUTUP Terima Kasih