PERCOBAAN 7 PEMBAGIAN BINER Oleh : Sumarna, Jurdik Fisika, FMIPA, UNY E-mail : sumarna@uny.ac.id Tujuan dari percobaan ini agar memahami cara merancang subroutine pembagian biner untuk suatu mikrokomputer. Selain itu, agar terbiasa dengan teknikteknik perancangan program. Prosedur pembagian biner secara manual dan terperinci dapat dijelaskan sebagai berikut. Misalkan bagilah bilangan biner 11101101 dengan bilangan biner lain 00010100. Untuk contoh tersebut, perhatikan langkah-langkah berikut : 1. Tulislah bilangan yang akan dibagi di sebelah kanan dan bilangan pembagi di sebelah kiri. Kemudian letakkan hasilnya di atas bilangan yang dibagi. Hasil (jawaban) 1 1 1 0 1 1 0 1 (237) 0 0 0 1 0 1 0 0 (20) 2. Geser bilangan yang dibagi dan hasilnya (jawabannya) ke kiri 1 bit. Untuk membandingkan antara bilangan yang dibagi dengan pembagi, letakkan 7 buah 0 (nol) di belakang bilangan pembagi pada kolom di bawah bilangan yang dibagi. Dengan mudah dapat dilihat bahwa bilangan yang dibagi lebih kecil dari pada bilangan pembagi, karena itulah letakkan 0 (nol) pada kolom hasil (jawaban). 0 Hasil (jawaban) 1 1 1 0 1 1 0 1 0 0 0 0 0 0 41
3. Lihatlah, apakah bilangan yang dibagi masih lebih kecil dari pada bilangan pembaginya. Jika ternyata bilangan yang dibagi masih lebih kecil dari pada bilangan pembagi, maka letakkan 0 (nol) pada kolom hasil (jawaban). Jika sebaliknya, maka letakkan 1 (satu) pada kolom jawaban dan bilangan yang dibagi dikurangi dengan pembaginya. Selisishnya (perbedaannya) menjadi bilangan yang dibagi. Pada contoh tersebut, bilangan yang dibagi dengan hasilnya (jawabannya) harus digeser 5 bit sebelum 1 (satu) dapat diletakkan pada jawaban. Jadi 4 buah 0 (nol) dan satu buah 1 (satu) diletakkan pada kolom jawaban dengan cara sebagai berikut : 0 0 0 0 1 Hasil (jawaban) 1 1 1 0 1 1 0 1 0 0 4. Kurangi bilangan yang dibagi dengan pembagi. Perbedaannya menjadi bilangan yang dibagi. 0 0 0 0 1 Hasil (jawaban) 0 1 0 0 1 1 0 1 0 0 setelah pengurangan 5. dan hasilnya digeser ke kiri 2 bit, kemudian 1 (satu) diletakkan pada kolom jawaban. 0 0 0 0 1 0 1 Hasil (jawaban) 0 1 0 0 1 1 0 1 42
6. Kurangi bilangan yang dibagi dengan pembagi. Perbedaannya menjadi bilangan yang dibagi. 0 0 0 0 1 0 1 Hasil (jawaban) 0 0 1 0 0 1 0 1 setelah pengurangan 7. dan jawabannya digeser ke kiri 1 bit lagi. Karena bilangan yang dibagi masih lebih besar dari pada bilangan pembagi, maka kemudian meletakkan 1 (satu) pada kolom jawaban. 0 0 0 0 1 0 1 1 Hasil (jawaban) 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 8. Kurangi bilangan yang dibagi dengan pembagi. Sisa pembagian diletakkan pada poisis bilangan yang dibagi. 0 0 0 0 1 0 1 1 Hasil (11) 0 0 0 1 0 0 0 1 Sisa pembagian (17) 0 0 0 1 0 1 0 0 9. Jika sisa tidak sama dengan 0 (nol), proses pembagian dapat dilanjutkan tetapi hasilnya berisi pecahan. 43
Berdasarkan algoritma di atas, dipaelukan 3 (tiga) lokasi memori untuk menyimpan bilangan yang dibagi, bilangan pembagi, dan hasilnya. Percobaan 7.1 : Merancang sebuah program untuk membagi data 16 bit di pasangan register DE dengan data 16 bit pada pasangan register BC. Hasilnya harus disimpan pada pasangan register DE dan sisanya pada pasangan regiater HL. Seperti diketahui bahwa pasangan register HL dapat digunakan sebagai register untuk mengerjakan operasi pengurangan aritmatik 16 bit. Geser data 16 bit yang ada di DE ke kiri 1 bit ke pasangan register HL. Bandingkan HL dengan BC. Jika HL lebih besar dari pada BC, kurangi HL dengan BC dan carry flag secara otomatis akan di-set menjadi 1 (satu). Jika sebaliknya, tidak akan ada operasi pengurangan dan carry flag akan menjadi 0 (nol). Karena bit register DE yang paling kanan sekarang menjadi kosong, carry flag dipindahkan ke posisi ini. Perhatikan mnemonik dan diagram alir program berikut. Mnemonik subroutine pembagian : Org 1800h XOR A LD H,A LD L,A LD A,16 DV0 : RL E RL D ADC HL,HL SBC HL,BC JR NC,DV1 ADD HL,BC DV1 : CCF DEC A JR NZ,DV0 EX DE,HL ADC HL,HL RET 44
Diagram alirnya : Mulai A = 16 (Penghitung) HL = 0 (Register untuk mengerjakan pengurangan) Carry 0 Hubungkan HL dan DE secara berurutan, kamudian geser ke kiri 1 bit Bandingkan HL dan BC. Jika HL lebih besar dari pada BC, kurangi HL dengan BC. Jika sebaliknya tidak ada pengurangan Jika ada pengurangan, carry = 1. Jika sebaliknya, carry = 0. Pindahkan carry ke DE bit paling kanan. A (A 1) Simpan hasilnya Selesai Pernyataan LD H,A dan LD H,A dapat diganti dengan LD HL,0. Tetapi perintah ini memerlukan memori sebanyak 3 byte dan waktu pelaksanaannya adalah 10 clock cycle. Pada contoh di atas digunakan perintah LD H,A dan LD H,A (A di-nol-kan dengan XOR A). Perintah itu hanya memerlukan memory 2 byte dan dilaksanakan dalam waktu 8 clock cycle. 45
Perintah-perintah penjumlahan dan pengurangan dapat digunakan untuk operasi-operasi GESER KIRI atau ROTASI. Dalam contoh di atas, perintah ADC HL,HL sama dengan merotasikan data 16 bit pada pasangan HL ke kiri 1 bit (bit yang dipindahkan ke carry flag berasal dari register D bit paling kiri). Perhatikan fungsi perintah-perintah berikut : ADD A,A ADC A,A Geser register A ke kiri 1 bit, atau kalikan A dengan 2. Rotasikan A ke kiri 1 bit. ADD HL,HL Geser HL ke kiri 1 bit, atau kalikan dengan 2. ADC HL,HL Rotasikan HL ke kiri 1 bit. ADD IX,IX Geser IX ke kiri 1 bir, atau kelikan dengan 2. ADD IY,IY Geser IY ke kiri 1 bir, atau kelikan dengan 2. Masukkan program di atas ke MPF-1, kemudian jalankan dan periksalah status register-register yang terlibat (AF, BC, DE, dan HL). Cocockkan hasilnya dengan perhitungan secara manual. Percobaan 7.2 : Gantilah perintah terakhir (RET) pada percobaan 7.1 (subroutine pembagian) di atas dengan perintah RST 38h kemudian jalankan. Catatlah hasilnya pada tabel berikut : Yang dibagi Pembagi Jawab Sisa Pemeriksaan 8686h 0020h 0434h 0006h FFFFh 0003h 5555h 0000h 5A48h 0142h 0047h 00FAh 0h 0142h 0000h 0000h 1234h 0h FFFFh 1234h 46
Percobaan 7.3 : Ubahlah program di atas sedemikian rupa sehingga proses pembagian dapat dilanjutkan sampai diperoleh hasil pecahan 1 bit. Percobaan 7.4 : Dengan mempergunakan program di atas sebagai subroutine, rancanglah program utama untuk membagi data di RAM pada alamat 1A00h s/d 1A01h dengan data di RAM pada alamat 1A04h s/d 1A05h. Hasilnya harus disimpan pada alamat 1A00h s/d 1A01h. Sebagai bahan pertimbangan, gunakan program berikut : Org 1900h LD DE,(1A00h) LD BC,(1A04h) CALL Pembagian LD (1A00h),HL RST 38h Percobaan 7.5 : Rancanglah sebuah program untuk membagi data 4 byte yang tersimpan pada alamat 1A00h s/d 1A03h dengan data 4 byte yang tersimpan pada memori yang alamatnya ditunjukkan oleh pasangan register HL. Hasilnya disimpan pada alamat 1A00h s/d 1A03h. Sisanya disimpan pada alamat 1A04h s/d 1A07h. 47