pembagian biner mpf7
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)
11101101
Bilangan pembagi (20)
00010100
2.
Bilangan yang dibagi (237)
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)
11101101
Bilangan yang dibagi
000101000000000
41
Bilangan pembagi
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 :
00001
Hasil (jawaban)
11101101
Bilangan yang dibagi
00010100000
4.
Bilangan pembagi
Kurangi bilangan yang dibagi dengan pembagi. Perbedaannya menjadi bilangan
yang dibagi.
00001
Hasil (jawaban)
01001101
Bilangan yang dibagi
setelah pengurangan
00010100000
5.
Bilangan pembagi
Bilangan yang dibagi dan hasilnya digeser ke kiri 2 bit, kemudian 1 (satu)
diletakkan pada kolom jawaban.
0000101
Hasil (jawaban)
01001101
Bilangan yang dibagi
000101000
42
Bilangan pembagi
6.
Kurangi bilangan yang dibagi dengan pembagi. Perbedaannya menjadi bilangan
yang dibagi.
0000101
Hasil (jawaban)
00100101
Bilangan yang dibagi
setelah pengurangan
000101000
7.
Bilangan pembagi
Bilangan yang dibagi 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.
8.
00001011
Hasil (jawaban)
00100101
Bilangan yang dibagi
00010100
Bilangan pembagi
Kurangi bilangan yang dibagi dengan pembagi. Sisa pembagian diletakkan pada
poisis bilangan yang dibagi.
9.
00001011
Hasil (11)
00010001
Sisa pembagian (17)
00010100
Bilangan pembagi
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
XOR
LD
LD
LD
1800h
A
H,A
L,A
A,16
DV0 :
RL
RL
ADC
SBC
JR
ADD
E
D
HL,HL
HL,BC
NC,DV1
HL,BC
DV1 :
CCF
DEC
JR
EX
ADC
RET
A
NZ,DV0
DE,HL
HL,HL
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 – 1)
A
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
Geser register A ke kiri 1 bit,
atau kalikan A dengan 2.
ADC A,A
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
8686h
0020h
0434h
0006h
FFFFh
0003h
5555h
0000h
5A48h
0142h
0047h
00FAh
0h
0142h
0000h
0000h
1234h
0h
FFFFh
1234h
46
Sisa
Pemeriksaan
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
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)
11101101
Bilangan pembagi (20)
00010100
2.
Bilangan yang dibagi (237)
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)
11101101
Bilangan yang dibagi
000101000000000
41
Bilangan pembagi
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 :
00001
Hasil (jawaban)
11101101
Bilangan yang dibagi
00010100000
4.
Bilangan pembagi
Kurangi bilangan yang dibagi dengan pembagi. Perbedaannya menjadi bilangan
yang dibagi.
00001
Hasil (jawaban)
01001101
Bilangan yang dibagi
setelah pengurangan
00010100000
5.
Bilangan pembagi
Bilangan yang dibagi dan hasilnya digeser ke kiri 2 bit, kemudian 1 (satu)
diletakkan pada kolom jawaban.
0000101
Hasil (jawaban)
01001101
Bilangan yang dibagi
000101000
42
Bilangan pembagi
6.
Kurangi bilangan yang dibagi dengan pembagi. Perbedaannya menjadi bilangan
yang dibagi.
0000101
Hasil (jawaban)
00100101
Bilangan yang dibagi
setelah pengurangan
000101000
7.
Bilangan pembagi
Bilangan yang dibagi 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.
8.
00001011
Hasil (jawaban)
00100101
Bilangan yang dibagi
00010100
Bilangan pembagi
Kurangi bilangan yang dibagi dengan pembagi. Sisa pembagian diletakkan pada
poisis bilangan yang dibagi.
9.
00001011
Hasil (11)
00010001
Sisa pembagian (17)
00010100
Bilangan pembagi
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
XOR
LD
LD
LD
1800h
A
H,A
L,A
A,16
DV0 :
RL
RL
ADC
SBC
JR
ADD
E
D
HL,HL
HL,BC
NC,DV1
HL,BC
DV1 :
CCF
DEC
JR
EX
ADC
RET
A
NZ,DV0
DE,HL
HL,HL
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 – 1)
A
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
Geser register A ke kiri 1 bit,
atau kalikan A dengan 2.
ADC A,A
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
8686h
0020h
0434h
0006h
FFFFh
0003h
5555h
0000h
5A48h
0142h
0047h
00FAh
0h
0142h
0000h
0000h
1234h
0h
FFFFh
1234h
46
Sisa
Pemeriksaan
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