Jumat, 31 Maret 2017

Pengenalan Register dan Interupsi pada Mikroprosesor

Setiap komputer memiliki sebuah bagian penting yang disebut Central Processing Unit (CPU) atau yang lebih dikenal dengan mikroprosesor. Sebagaimana halnya Integrated Circuit lainnya, mikroprosesor terdiri dari beberapa bagian kecil yang disebut dengan register. Pada arsitektur Intel x86 yang diperkenalkan oleh Intel Corporation pada tahun 1985, setiap mikroprosesor Intel memiliki beberapa jenis register berikut ini:
  1. General Purpose Register
  2. Pointer dan Index Register
  3. Segment Register
  4. Flag Register

Setiap jenis register memiliki fungsi-fungsi tersendiri. Berikut ini adalah rincian dari masing masing register.

1. General Purpose Register

General Purpose Register terdiri dari register AX, BX, CX dan DX. Masing-masing register memiliki ukuran 16 bit (2 byte) dan masih dapat dibagi menjadi dua bagian, yaitu high dan low. Artinya register AX terdiri AH dan AL, demikian juga BX (BH dan BL), CX (CH dan CL) dan DX (DH dan DL). Masing-masing bagian high dan low berukuran 8 bit (1 byte). Register AX disebut juga akumulator dan berhubungan dengan operasi khusus seperti aritmatika, IN, OUT, shift, logika dan operasi binary decimal.

Register BX disebut juga base register dan berfungsi pada operasi rotate, aritmatika,, shift dan logika. Register BX juga dapat digunakan untuk mereferensikan alamat memori. Register yang khusus digunakan untuk operasi perulangan (loop) dan pencacah (counter) adalah register CX. Data register atau register DX digunakan pada operasi perkalian (MUL) dan menyimpan sebagian hasil perkalian 32 bit atau menyimpan nilai sisa dari operasi pembagian (DIV). Register DX juga digunakan pada operasi input/output suatu port.

Dalam mempelajari teknik-teknik pengaksesan perangkat keras menggunakan Borland C++ 5.02, General Purpose Register akan banyak digunakan. Oleh karena itu, sangatlah penting untuk memahami fungsi-fungsi dari register ini.

2. Pointer dan Index Register

Pointer dan index register digunakan untuk menunjukan suatu alamat memori, terdiri dari SP, BP, SI, DI dan IP. Register SP (Stack Pointer) dan BP (Base Pointer) berfungsi menunjukan alamat stack saat terjadi operasi PUSH (menyimpan nilai ke dalam stack) dan POP (membaca nilai di dalam stack).

Register SI (Source Index) dan DI (Destination Index) digunakan pada saat operasi string jika kita membuat program dalam bahasa assembly murni. SI dan DI menyimpan nilai offset suatu string dalam segmen data memori. Register IP (Instruction Pointer) berfungsi menunjukan alamat suatu instruksi program dalam memori saat program dijalankan. Register IP berpasangan dengan register CS (Code Segment) yang menyimpan semua kode program dalam bentuk binari saat program dijalankan dan dimuat dalam memori. Register IP dan CS dituliskan dalam notasi CS:IP, misalkan:

1:  0F6C:0100 mov ah, 02  
2:  0F6C:0102 mov bl, 05  

Arti instruksi diatas adalah saat program dijalankan register CS menunjukan alamat 0F6C heksadesimal dan register IP menunjukan alamat 0100 heksadesimal. Instruksi yang tersimpan adalah mov ah, 02 (simpan nilai 2 heksadesimal ke register AH). Hal yang sama juga terjadi pada baris kedua, pada baris kedua nilai register IP berubah menjadi 0102 yang sebelumnya 0100. Hal ini terjadi karena instruksi mov pada baris pertama menggunakan memori sebesar 2 byte.

Notasi CS:IP dapat dianalogikan dengan tabel atau matriks, dimana CS menunjukan nomor baris sedangan register IP menunjukan nomor kolom. Dalam membuat program menggunakan bahasa pemrograman C++ seorang programmer tidak harus mengubah nilai-nilai CS:IP karena nilai-nilai dalam kedua register tersebut diatur oleh kompilator. Merupakan hal yang beresiko mengubah nilai-nilai pada register CS:IP karena pasangan register tersebut menunjukan alamat instruksi. Kesalahan mengubah nilai register CS:IP akan menyebabkan program berhenti melakukan eksekusi atau program mengalami hang.

3. Segment Register

Segment register terdiri dari CS (Code Segment), DS (Data Segment), SS (Stack Segment) dan ES (Extra Segment) yang masing-masing berukuran 16 bit (2 byte). Register CS berpasangan dengan IP berfungsi menyimpan alamat instruksi, register DS berpasangan dengan register DX (DS:DX) yang menyimpan alamat data. Register SS (Stack Segment) menyimpan alamat memori stack sedangkan ES (Extra Segment) menyimpan alamat segment tambahan.

Dalam pemrograman C++ segment register umumnya tidak perlu diakses secara langsung karena segment register telah diatur oleh kompilator.

4. Flag Register

Pada arsitektur awal Intel x86 terdapat beberapa flag register, yaitu:
  • CF (Carry Flag), menandakan jika suatu instruksi ADD menghasilkan nilai carry, atau suatu instruksi SUB menghasilkan nilai borrow.
  • PF (Parity Flag), menandakan jika suatu instruksi menghasilkan nilai genap atau ganjil. Register ini akan bernilai 1 jika bilangan yang dihasilkan bernilai genap.
  • AF (Auxiliary Carry Flag), digunakan untuk operasi desimal berkode binari (BCD), seperti pada operasi AAA (ASCII Adjust for Addition).
  • OF (Overflow Flag), menandakan jika suatu operasi aritmatika mengalami overflow (melebihi jangkauan nilai yang telah ditentukan atau hasil operasi aritmatika melebihi ukuran register).
  • SF (Sign Flag), digunakan pada operasi aritmatika yang menggunakan bilangan bertanda (bilangan positif atau bilangan negatif).
  • ZF (Zero Flag), menandakan jika suatu operasi aritmatika menghasilkan nilai nol.
  • DF (Direction Flag), digunakan pada operasi string yang menunjukan arah proses.
  • IF (Interrupt Enable Flag), menandakan jika CPU akan memproses interupsi jika bernilai 1 (satu) atau mengabaikan interupsi jika bernilai nol.
  • TF (Trap Flag), digunakan saat debugging, dengan mode single step.
  • NT (Nested Task), digunakan untuk memantau jalannya interupsi yang terjadi secara beruntun.
  • IOPL (I/O Protection Level), flag ini digunakan jika program berjalan pada mode terproteksi (protected mode).
  • PE (Protection Enable), flag ini digunakan untuk mengaktifkan mode terproteksi.
  • MP (Monitor Coprocessor), digunakan untuk memantau kerja coprocessor dan menangani terjadinya instruksi WAIT.
  • EM (Emulate Coprocessor), digunakan jika prosesor akan mengemulasikan kerja coprocessor.
  • ET (Extention Type), digunakan untuk menentukan jenis coprocessor (80287 atau 80387).
  • VF (Virtual 8086 Mode), digunakan jika ingin menjalankan aplikasi real mode pada protected mode.
Pada pemrograman C++, nilai-nilai pada flag register tidak diberikan secara manual oleh pemrogram, tetapi diatur oleh sistem operasi pada saat program C++ dijalankan.

Register-register yang telah dibahas sebelumnya hanya menyimpan data dan jenis instruksi yang akan dijalankan oleh mikroprosesor. Lalu pertanyaannya adalah bagaimana memerintahkan mikroprosesor melaksanakan instruksi tertentu. Jawabnya adalah dengan melakukan interupsi. Interupsi (interrupt) atau sela adalah permintaan kepada mikroprosesor untuk melakukan tugas tertentu, ketika terjadi interupsi maka mikroprosesor menghentikan dahulu instruksi yang sedang dikerjakan dan menjalankan tugas yang diminta sesuai dengan interupsi yang diberikan.

Terdapat dua jenis interupsi, yaitu interupsi BIOS dan interupsi DOS. Interupsi BIOS (Basic Input Output System) ditanam pada chip ROM BIOS oleh pabrik komputer sedangkan interupsi DOS (Disk Operating System) hanya dapat digunakan jika komputer menjalankan sistem operasi DOS atau Microsoft Windows. Berikut ini adalah tabel yang menjelaskan daftar interupsi BIOS dan DOS.



Pada kedua tabel diatas, setelah nomor interupsi selalu diakhiri oleh huruf h. Maksud dari huruf tersebut adalah nomor-nomor interupsi yang digunakan diberikan dalam bentuk bilangan heksadesimal. Pada saat membuat program yang sesungguhnya menggunakan Borland C++ 5.02 pemrogram dapat mengetikan nomor interupsi dalam bentuk bilangan desimal (basis 10), oktal (basis 8) atau heksadesimal (basis 16). Penulisan ketiga bentuk bilangan tersebut mengikuti aturan yang ditetapkan oleh sintaks bahasa C++, yaitu dituliskan sebagaimana biasanya jika menggunakan bilangan desimal (misalnya: 10, 45, dan 150), diawali dengan karakter “0” jika menggunakan bilangan oktal (misalnya: 012, 055, dan 0226) dan diawali dengan karakter “0x” jika menggunakan bilangan heksadesimal (misalnya 0x0a, 0x2d, dan 0x96).

Tidak ada komentar:

Posting Komentar