PERCOBAAN 3 INSTRUKSI ARITMATIK DAN LOGIK Oleh : Sumarna, Jurdik Fisika, FMIPA, UNY E-mail :
[email protected]
Tujuan dari percobaan ini adalah untuk membiasakan diri dengan berbagai instruksi aritmatik dan logik serta menjelaskan tentang status flag. Instruksi aritmatik 8 bit dan operasi logik dalam CPU-Z80 dilaksanakan pada register akumulator A. Register-register A, B, C, D, E, H, dan L dapat digunakan sebagai operand (besaran hitungan) bersama-sama dengan register A. Setelah suatu operasi aritmatik atau logik selesai dilaksanakan, hasilnya akan disimpan pada register A dan beberapa status flag (Carry, Overflow, Change Sign, Zero Result, Parity) juga akan terpengaruh. Status flag disimpan dalam flip-flop yang membentuk register Flag. Carry flag berada dalam keadaan set (1) bila dalam operasi penjumlahan tanpa tanda (+ atau -) hasil yang didapat lebih besar dari bilangan 8 bit. Flag ini juga berada dalam keadaan set bila dalam operasi pengurangan terjadi peminjaman (borrow). Carry flag juga berguna sebagai suatu syarat untuk instruksi JUMP, CALL, dan RETURN. Overflow/parity flag berfungsi pada operasi aritmatik komplemen 2 yang menggunakan tanda (+ atau -).
Overflow flag menyatakan bahwa bilangan komplemen 2 yang
bertanda pada akumulator telah melebihi kapasitas maksimumnya (+127) atau kurang dari kapasitas minimumnya (-128). Ketika operasi aritmatik dilaksanakan, bilangan pada register A dapat dianggap sebagai data yang tidak bertanda (0 s/d 255) atau data yang bertanda (-128 s/d +127). Untuk operasi logik flag overflow/parity bernilai 1 bila hasil parity 8 bit dalam akumulator adalah genap. Overflow/parity flag juga sangat berguna dalam memeriksa transmisi data. Zero flag berkaitan dengan register A ketika bernilai nol (zero) setelah selesai suatu operasi aritmatik atau logik. Zero flag digunakan sebagai syarat dalam instuksi percabangan dan berguna dalam program ‘loop’. Sedangkan Sign flag terkait jika bit yang paling kiri (bit ke 7) dari register A bernilai 1 setelah suatu operasi logik atau aritmatik selesai dilaksanakan, bilangan pada register A diinterpretasikan sebagai bilangan negatif atau positif (sign flag di-set menjadi 1 untuk 12
bilangan negatif). Berikut ini dikemukakan beberapa instruksi aritmatik dan logik beserta penjelasannya !
Mnemonic
Penjelasan
ADD A
Data pada register A ditambahkan pada register A sendiri, artinya data di-dua kali-kan, atau digeser ke kiri 1 bit
ADC B
Isi register B bersama dengan Carry Flag ditambahkan pada register A
SUB C
Data pada register A dikurangi dengan data pada register C
SBC (HL)
Isi register A dikurangi dengan isi memori yang address-nya ditunjuk oleh HL, dikurangi lagi dengan Carry Flag
AND D
Operasi AND logik antara register D dan Register A
OR 0FH
Operasi OR logik antara data 0FH dan register A
XOR A
Operai EX-OR logik antara register A dengan dirinya sendiri (karena register A sama dengan dirinya maka hasilnya pasti nol)
INC H
Menambah isi register H dengan 1 (increment)
INC (IX)
Menambah isi memori pada address yang ditunjuk oleh IX dengan 1
DEC C
Mengurangi isi register C dengan 1 (decrement)
DEC (IY + 3) Hasil penjumlahan dari isi register IY dan 3 dipakai sebagai penunjuk address pada memori. Kemudian isi memori pada address yang ditunjuk oleh IY + 3 dikurangi dengan 1
Percobaan 3.1 : Buatlah program yang dapat dipakai untuk menjumlahkan isi register D dan isi register E dan hasil penjumlahannya disimpan dalam pasangan register HL. Masukkan program tersebut ke dalam MPF dan jalankan. Periksa apakah hasil penjumlahan itu sesuai dengan rancangan ! Tabel berikut dapat digunakan sebagai petunjuk pembuatan.
13
Address
Bahasa Mesin
Mnemonik
1800
1E 05
LD E,05
1802
7B
LD A,E
1803
16 06
LD D,06
1805
82
ADD A,D
1806
6F
LD L,A
1807 1809 180B
3E 00 CE 00 67
LD A,00H ADC A,00H LD H,A
180C
FF
RST 38 H
Keterangan Masukkan suatu bilangan 8 bit ke dalam register E Masukkan data pada register E ke dalam register A Masukkan suatu bilangan 8 bit ke dalam register D Tambahkan data pada register D ke dalam register A (Carry flag dapat berubah) Masukkan data pada register A ke dalam register L Masukkan bilangan 0 ke dalam A Tambahkan 0 bersama Carry ke dalam A Masukkan data pada register A ke dalam register H Kembali ke program monitor
Data di dalam E dan D (05 dan 06) dapat diganti dengan data lain yang berukuran 8 bit. Kemudian periksalah isi di dalam pasangan register HL setelah pelaksanaan program.
Percobaan 3.2 : Rancanglah suatu program untuk menjumlahkan data 16 bit di dalam memori pada address 1A00H hingga 1A01H dengan data 16 bit yang ada di dalam pasangan register DE
dan hasil penjumlahannya di simpan dalam pasangan register HL.
Masukkan program tersebut ke dalam MPF dan jalankan. Periksa apakah hasil penjumlahan itu sesuai dengan rancangan ! Tabel berikut dapat digunakan sebagai petunjuk pembuatan program.
Address
Bahasa Mesin
Mnemonik
Keterangan
1800
3A 00 1A
LD A,(1A00H)
1803 1805
1E 67 83
LD E,67H ADD A,E
1806
6F
LD L,A
Masukkan data dari lokasi memori 1A00 ke dalam register A Masukkan data 67 ke dalam register E Tambahkan data pada register E ke dalam register A (Carry flag dapat berubah) Masukkan data pada register A ke dalam register L 14
1807
3A 01 1A
LD A,(1A01H)
180A 180C
16 89 8A
LD D,89H ADC A,D
180D
67
LD H,A
180E
FF
RST 38 H
ADDR 1A00
DATA 98
ADDR 1A01
DATA 23
Masukkan data dari lokasi memori 1A01 ke dalam register A Masukkan data 89 ke dalam register D Tambahkan data dalam register D bersama Carry ke dalam A Masukkan data pada register A ke dalam register H Kembali ke program monitor Memasukkan data 98 ke dalam lokasi memori 1A00 Memasukkan data 23 ke dalam lokasi memori 1A01
Data di dalam E dan D (67 dan 89) serta di dalan lokasi memori 1A00 dan 1A01 (98 dan 23) dapat diganti dengan data lain yang berukuran 8 bit. Kemudian periksalah isi di dalam pasangan register HL setelah pelaksanaan program.
Percobaan 3.3 : Rancanglah suatu program untuk menjumlahkan data 32 bit di dalam lokasi memori yang address-nya 1A00H s/d 1A03H dengan data 32 bit yang terdapat pada lokasi memori yang address-nya 1A04H s/d 1A07H. Hasil penjumlahannya disimpan di dalam lokasi memori pada address 1A08H s/d 1A0BH. Ingat bahwa hal yang mutlak dalam mikrokomputer adalah byte berorde tinggi disimpan di dalam address yang lebih tinggi. Masukkan program tersebut ke dalam MPF dan jalankan. Periksa apakah hasil penjumlahan itu sesuai dengan rancangan ! Tabel berikut dapat digunakan sebagai petunjuk pembuatan program.
Address
Bahasa Mesin
1800 1802 1806 1807 180A 180D 1810 1812
06 04 DD 21 00 1A A7 DD 7E 00 DD 8E 04 DD 77 08 DD 23 05
Label
Mnemonik
LD B,04H LD IX,1A00H AND A LOOP LD A, (IX + 00) ADC A, (IX + 04) LD (IX + 08),A INC IX DEC B 15
1813 1816
C2 07 18 FF
JP NZ, LOOP RST 38 H
Misalkan dicoba untuk data berikut : Data
1A00 = 87
1A04 = A2
1A01 = 9A
1A05 = 97
1A02 = 7B
1A06 = A8
1A03 = 48
1A07 = 6B
Hasil 1A08 = 29
48 7B 9A 87 6B A8 97 A2
1A09 = 32
+
1A0A = 24
B4 24 32 29
1A0B = B4
Data di dalam lokasi memori 1A00 s/d 1A03 dan 1A04 s/d 1A07 dapat diganti dengan data lain yang berukuran 8 bit. Kemudian periksalah isi di dalam lokasi memori 1A08 s/d 1A0B setelah pelaksanaan program.
Percobaan 3.4 : Susunlah program untuk melaksanakan operasi pengurangan pada bilangan 16 bit (2 byte). Address awal bilangan yang dikurangi adalah 2D70H dan address awal bilangan pengurangnya adalah 2D72H. Sedangkan address awal tempat penyimpanan hasil pengurangannya adalah 2D74H. Masukkan program tersebut ke dalam MPF dan jalankan. Periksa apakah hasil penjumlahan itu sesuai dengan rancangan ! Tabel berikut dapat digunakan sebagai petunjuk pembuatan program.
Address
Bahasa Mesin
1800 1802 1807 180A 180D 1810
06 02 DD 21 70 2D DD 7E 00 DD 9E 02 DD 77 04 DD 23
Label
Mnemonik
LD B,02H LD IX,2D70H LOOP LD A, (IX + 00) SBC A, (IX + 02) LD (IX + 04),A INC IX 16
1813 1816
10F3 C9
DJNZ, LOOP RET
Misalkan dicoba untuk data berikut : Data
2D70 = CD
2D72 = 12
2D71 = EF
2D73 = 34
CD EF 12 34 -
Hasil 2D74 = BB
BB BB
2D75 = BB Data di dalam lokasi memori 2D70 s/d 2D71 dan 2D72 s/d 2D73 dapat diganti dengan data lain yang berukuran 8 bit. Kemudian periksalah isi di dalam lokasi memori 2D74 s/d 2D75 setelah pelaksanaan program.
17