CHAPTER 6 : PROGRAM CONTROL INTRUCTIONS
1. Pengenalan
Program control intrustions mengarahkan aliran program dan memungkinkan aliran tersebut berubah. Perubahan aliran sering terjadi setelah keputusan yang dibuat dengan perintah CMP atau TEST diikuti oleh perintah lompatan bersyarat. Bab ini menjelaskan instruksi pengendalian program, termasuk lompatan, panggilan, kembalian, interupsi, dan instruksi pengendalian mesin. Bab ini juga memperkenalkan pernyataan bahasa perakitan relasional (.IF, .ELSE, .ELSEIF, .ENDIF, .WHILE, .ENDW, .REPEAT, dan .UNTIL) yang tersedia dalam versi 6.xx dan di atasnya dari MASM atau TASM, dengan versi 5.xx disesuaikan untuk kompatibilitas MASM. Perintah bahasa perakitan relasional ini memungkinkan programmer untuk mengembangkan bagian aliran kontrol program dengan efisiensi bahasa C/C++
2. The Jump Ground
Perintah kontrol program utama, lompatan (JMP), memungkinkan programmer untuk melewati bagian program dan melompat ke bagian mana pun di memori untuk instruksi berikutnya. Perintah lompatan bersyarat memungkinkan programmer untuk membuat keputusan berdasarkan uji numerik. Hasil uji numerik disimpan dalam bit bendera, yang kemudian diuji oleh perintah lompatan bersyarat. Perintah lain yang serupa dengan lompatan bersyarat, yaitu perintah set bersyarat, dijelaskan bersama dengan perintah lompatan bersyarat dalam bagian ini.
PERINTAH KONTROL PROGRAM
Dalam bagian teks ini, semua perintah lompatan diilustrasikan dengan penggunaannya dalam program contoh. Juga dibahas kembali perintah LOOP dan LOOP bersyarat, yang pertama kali diperkenalkan dalam. Bab 3 juga dibahas kembali karena keduanya merupakan bentuk dari perintah lompat.
3. Unconditional Jump (JMP)
Tiga jenis instruksi lompatan tanpa syarat : lompat pendek, lompat dekat, dan lompat jauh (short jump, near jump, and far jump).
- Lompatan pendek (SHORT JUMP) adalah instruksi 2-byte yangmemungkinkan lompatan atau percabangan ke lokasi memori dalam +127 dan –128 byte dari alamat setelah lompatan.
- Lompatan dekat (NEAR JUMP) 3-byte memungkinkan percabangan atau lompatan dalam ±32K byte (atau di mana pundi segmen kode saat ini) dari instruksi di segmen kode saat ini.
- Lompatan jauh (FAR JUMP) 5-byte memungkinkan lompatan ke lokasi memori mana pun dalam sistem memori yang sebenarnya.
Lompatan pendek dan dekat sering disebut lompatan intrasegmen, dan lompatan jauh sering disebut lompatan intersegmen.
| Alamat | Isi Memori | Keterangan |
|---|
| 10000H | JMP | Opcode EB (short jump) — diasumsikan JMP singkatan dari EB |
| 10001H | 04 | Displacement 4 (offset) |
| 10002H - 10005H | - | Instruksi yang akan dilewati |
| 10006H | Target | Lokasi tujuan lompatan
|
| Alamat | Isi Memori | Keterangan |
|---|
10000H | JMP | Opcode E9 untuk near jump |
10001H | 02 | Displacement low byte |
10002H | 00 | Displacement high byte |
10003H+ | ... | Instruksi yang akan dilewati |
10005H | Target | Lokasi tujuan lompat
|
| Alamat | Isi Memori | Keterangan |
|---|
10000H | JMP | Opcode EA untuk far jump |
10001H | 27 | IP Low (byte rendah) = 0027H |
10002H | 01 | IP High |
10003H | 00 | CS Low (byte rendah) = 00A3H |
10004H | A3 | CS High
|
4. Conditional Jump dan Conditional Sets
| Topik | Penjelasan | Contoh Instruksi |
|---|
| Conditional Jumps | Instruksi yang melompat ke alamat lain jika kondisi tertentu terpenuhi (misalnya, flag tertentu). | JE (Jump if Equal), JNE (Jump if Not Equal) |
| Menggunakan flag CPU seperti Zero Flag (ZF), Carry Flag (CF), Sign Flag (SF), Overflow Flag (OF). | JG (Jump if Greater), JL (Jump if Less) |
| Contoh Penggunaan Jumps | Digunakan untuk kontrol alur program seperti pengkondisian dan perulangan. | JZ LABEL (lompat jika nol) |
| Conditional Sets | Instruksi yang mengatur nilai byte menjadi 1 atau 0 tergantung kondisi tertentu. | SETZ (Set byte if Zero), SETC (Set byte if Carry) |
| Mengubah nilai memori/registri menjadi 01H jika kondisi benar, atau 00H jika salah. | SETG (Set if Greater), SETL (Set if Less) |
| Contoh Penggunaan Sets | Digunakan untuk menyimpan hasil kondisi ke variabel, misalnya menandai apakah carry sudah di-clear. | SETNC AL (set AL jika carry tidak ada) |
TABLE 6–1 Conditional jump instructions.
Gambar tersebut merupakan tabel instruksi conditional jump pada bahasa assembly yang menunjukkan bagaimana program dapat melakukan lompatan berdasarkan kondisi tertentu dari flag register prosesor. Setiap instruksi memiliki kondisi yang diuji, misalnya flag Zero (Z), Carry (C), Sign (S), Overflow (O), atau Parity (P), serta operasi yang dilakukan bila kondisi tersebut terpenuhi. Contohnya, JA melompat jika lebih besar (Z=0 dan C=0), JE/JZ melompat jika sama atau nol (Z=1), JL melompat jika lebih kecil (S≠O), dan JNE/JNZ melompat jika tidak sama atau tidak nol (Z=0). Instruksi juga dapat menguji register tertentu, seperti JCXZ, JECXZ, dan JRCXZ, yang melompat bila register CX, ECX, atau RCX bernilai nol.
TABLE 6–2 Conditional set instructions.
Gambar tersebut adalah tabel instruksi conditional set dalam bahasa assembly, yaitu instruksi yang mengatur nilai suatu byte (umumnya ke 1) jika kondisi tertentu pada flag prosesor terpenuhi. Sama seperti conditional jump, instruksi ini memeriksa flag seperti Zero (Z), Carry (C), Sign (S), Overflow (O), dan Parity (P). Misalnya, SETA akan menyet byte jika lebih besar (Z=0 dan C=0), SETE/SETZ menyet jika sama atau nol (Z=1), SETL menyet jika lebih kecil (S≠O), SETNE/SETNZ menyet jika tidak sama atau tidak nol (Z=0), dan SETO menyet jika terjadi overflow (O=1). Instruksi ini berguna untuk menghasilkan nilai logika (0 atau 1) berdasarkan hasil perbandingan atau kondisi tertentu, sehingga mempermudah implementasi operasi logika dan percabangan dalam pemrograman assembly.
5. Loop
Instruksi LOOP merupakan kombinasi antara pengurangan CX dan lompatan bersyarat JNZ. Pada prosesor 8086 hingga 80286, LOOP mengurangi CX; jika CX != 0, ia melompat ke alamat yang ditunjukkan oleh label. Jika CX menjadi 0, instruksi berikutnya dieksekusi. Pada prosesor 80386 dan di atasnya, LOOP mengurangi CX atau ECX, tergantung pada mode instruksi. Jika prosesor 80386 dan di atasnya beroperasi dalam mode instruksi 16-bit, LOOP menggunakan CX; jika beroperasi dalam mode instruksi 32-bit, LOOP menggunakan ECX. Pengaturan default ini diubah oleh instruksi LOOPW (menggunakan CX) dan LOOPD (menggunakan ECX) pada 80386 hingga Core2. Pada mode 64-bit, counter loop berada di RCX dan memiliki lebar 64 bit.
TABLE 6–3 Relational operators used with the.IF statement in assembly language.
Gambar tersebut menunjukkan tabel operator relasional yang digunakan dengan pernyataan IF dalam bahasa assembly. Operator ini memungkinkan perbandingan dan operasi logika, mirip dengan bahasa pemrograman tingkat tinggi. Misalnya, = = digunakan untuk memeriksa kesamaan, != untuk ketidaksamaan, > dan < untuk perbandingan lebih besar atau lebih kecil, serta >= dan <= untuk lebih besar sama dengan atau lebih kecil sama dengan. Selain itu, terdapat operator logika seperti & untuk uji bit, ! untuk inversi logika (NOT), && untuk AND logis, || untuk OR logis, dan | untuk operasi OR bit. Dengan adanya operator ini, programmer dapat membuat kondisi bercabang yang fleksibel dan mendukung pengendalian alur program di assembly.
6. Procedures
Prosedur (subrutin, metode, atau fungsi) merupakan bagian penting dari arsitektur sistem komputer. Prosedur adalah kumpulan instruksi yang biasanya melakukan satu tugas. Prosedur adalah bagian perangkat lunak yang dapat digunakan ulang, disimpan sekali di memori, tetapi dapat digunakan sesering yang diperlukan. Hal ini menghemat ruang memori dan memudahkan pengembangan perangkat lunak. Satu-satunya kelemahan prosedur adalah komputer membutuhkan waktu singkat untuk mengakses prosedur dan kembali darinya. Instruksi CALL menghubungkan ke prosedur, dan instruksi RET (kembali) kembali dari prosedur.
7. Call
Perintah CALL mengalihkan aliran program ke prosedur. Perintah CALL berbeda dengan perintah jump karena perintah CALL menyimpan alamat kembalian di tumpukan. Alamat kembalian
mengembalikan kendali ke instruksi yang langsung mengikuti perintah CALL dalam program saat perintah RET dieksekusi.
FIGURE 6–6 The effect of a near CALL on the stack and the instruction pointer.
Gambar tersebut menunjukkan efek instruksi near CALL terhadap stack dan instruction pointer (IP) pada bahasa assembly. Saat CALL dieksekusi, alamat instruksi berikutnya (IP sebelum CALL = 0003) disimpan ke dalam stack, sehingga stack pointer (SP) yang semula FFFF berkurang untuk menampung nilai tersebut. Nilai 0003 kemudian dimasukkan ke alamat stack (AFFFExx), dan eksekusi dialihkan ke alamat prosedur baru (11002). Dengan cara ini, prosesor dapat melompat ke prosedur tertentu sambil tetap menyimpan alamat kembali, sehingga memungkinkan eksekusi program dilanjutkan ke instruksi semula setelah prosedur selesai dengan instruksi RET.
8. Ret
Perintah kembali (RET) menghapus angka 16-bit (kembali dekat) dari tumpukan dan menempatkannya ke dalam IP, atau menghapus angka 32-bit (kembali jauh) dan menempatkannya ke dalam IP dan CS. Perintah kembali dekat dan jauh keduanya didefinisikan dalam direktif PROC prosedur, yang secara otomatis memilih perintah kembali yang tepat. Pada prosesor 80386 hingga Pentium 4 yang beroperasi dalam mode terlindungi, instruksi far return menghapus 6 byte dari tumpukan. Empat byte pertama berisi nilai baru untuk EIP, dan dua byte terakhir berisi nilai baru untuk CS. Pada 80386 dan di atasnya, instruksi near return dalam mode terlindungi menghapus 4 byte dari tumpukan dan menempatkannya ke dalam EIP.

FIGURE 6–8 The effect of a near return instruction on the stack and instruction pointer.
Gambar tersebut menjelaskan efek instruksi near RET (return) terhadap stack dan instruction pointer (IP) pada assembly. Setelah sebuah prosedur selesai dieksekusi, instruksi RET akan mengambil alamat pengembalian yang sebelumnya disimpan di stack oleh instruksi CALL. Pada contoh ini, sebelum RET dijalankan, stack pointer (SP) berada di FFFD, stack segment (SS) = A000, dan instruction pointer (IP) = 1004. Saat RET dieksekusi, nilai alamat kembali (0003) yang tersimpan di stack diambil dan dimasukkan kembali ke IP, sehingga eksekusi program dilanjutkan pada instruksi berikutnya di alamat 10003. Proses ini menunjukkan mekanisme panggil dan kembali prosedur: CALL menyimpan alamat kembali ke stack, sedangkan RET mengembalikannya untuk melanjutkan eksekusi utama.
9. Interrupt Vectors
Vektor interupsi adalah angka 4 byte yang disimpan dalam 1024 byte pertama memori (00000H–003FFH) saat mikrokontroler beroperasi dalam mode nyata. Dalam mode terlindungi, tabel vektor digantikan oleh tabel deskriptor interupsi yang menggunakan deskriptor berukuran 8 byte untuk mendeskripsikan setiap interupsi. Terdapat 256 vektor interupsi yang berbeda, dan setiap vektor berisi alamat prosedur layanan interupsi.

TABLE 6–4 Interrupt vectors defined by Intel.
Gambar tersebut adalah tabel interrupt vectors yang didefinisikan oleh Intel, yaitu alamat khusus yang digunakan prosesor untuk menangani kondisi tertentu atau kesalahan selama eksekusi program. Setiap nomor interupsi memiliki alamat, prosesor yang mendukungnya, dan fungsi spesifik. Misalnya, 0 digunakan untuk divide error, 1 untuk single-step, 2 untuk interupsi dari NMI pin, 3 untuk breakpoint, dan 4 untuk overflow. Pada prosesor 80186–Core2 ditambahkan interupsi seperti bound instruction (5), invalid opcode (6), serta coprocessor emulation (7). Prosesor 80386–Core2 memperluasnya dengan interupsi penting seperti double fault (8), general protection fault (D), dan page fault (E). Beberapa interupsi lain digunakan untuk kesalahan khusus, seperti floating-point error (10), alignment check (11), dan machine check exception (12). Sedangkan vektor 13H–1FH dicadangkan (reserved), dan 20H–FFH digunakan untuk interupsi pengguna (user interrupts). Dengan mekanisme ini, prosesor dapat secara otomatis mengalihkan kontrol ke rutin penanganan interupsi yang sesuai setiap kali kondisi tertentu terjadi.
10. Interrupt Control
Meskipun bagian ini tidak menjelaskan interupsi perangkat keras, dua instruksi diperkenalkan yang mengontrol pin INTR. Instruksi set interrupt flag (STI) menempatkan nilai 1 ke bit I flag, yang mengaktifkan pin INTR. Instruksi clear interrupt flag (CLI) menempatkan nilai 0 ke bit I flag, yang menonaktifkan pin INTR. Instruksi STI mengaktifkan INTR dan instruksi CLI menonaktifkan INTR. Dalam prosedur layanan interupsi perangkat lunak, interupsi perangkat keras diaktifkan sebagai salah satu langkah pertama. Hal ini dilakukan oleh instruksi STI. Alasan interupsi diaktifkan sejak awal dalam prosedur layanan interupsi adalah karena hampir semua perangkat I/O pada komputer pribadi diproses melalui interupsi. Jika interupsi dinonaktifkan terlalu lama, masalah sistem yang serius dapat terjadi.
Komentar
Posting Komentar