LAPORAN PRAKTIKUM SISTEM MIKROPROSESSOR STACK DAN SUBROUTINE
Disusun oleh : Nama
: Yudi Irwanto
(021500456)
Rekan Kerja
: Safira Rachmadewi
(021500453)
Tri Handayani Prodi
: Elektronika Instrumentasi
Tanggal Praktikum
: 4 Mei 2017
Asisten
: Rokhmat Arifianto
(021500454)
Adib Afham
SEKOLAH TINGGI TEKNOLOGI NUKLIR BADAN TENAGA NUKLIR NASIONAL YOGYAKARTA 2017
PERCOBAAN 5 STACK DAN SUBROUTINE A. Tujuan 1.
Mengerti arti dan penggunaan stack.
2.
Mengerti tehnik merancang program dan penggunaan subroutin.
B. LANDASAN TEORI. 1. STACK Dalam merencanakan program stack dikenal sebagai daerah memori yang hanya mempunyai satu gerbang (port) untuk input dan output. Data ditulis atau diambil (dibaca) dari stack melalui port ini. Data pertama yang diletakkan di stack dikatakan berada di bagian bawah stack. Data yang terakhir dimasukkan berada pada bagian atas stack. Jadi stack dapat dikatakan memori yang ‘last-in first-out’ (masuk terakhir keluar terlebih dahulu). Stack dapat dibuat dengan piranti keras (hard ware) yaitu shift register atau RAM pada umumnya. Dalam sistim mikroprosesor Z80, programer dapat menentukan daerah pada RAM sebagai stack. Caranya ialah dengan menambah alamat tertinggi pada RAM dengan 1, kemudian dimasukkan kedalam penunjuk stack (Stack Pointer atau SP) pada CPU. Program dan diagram berikut ini menggambarkan operasi stack. (1)
LD
SP, 1FAFH
(2)
DEC
SP
(3)
LD
(SP), H
(4) (5)
DEC LD
SP (SP), L
(6) (7)
DEC LD
SP SP
(8) (9)
DEC LD
SP (SP), F
(10) LD
C, (SP)
(11) (12) (13) (14)
INC LD INC LD
SP B, (SP) SP E, (SP)
(15) INC (16) LD
SP D, (SP)
(17) INC
SP
Stack poiter diset pada 1FAFH, yaitu daerah RAM dengan alamat kurang dari atau sama dengan 1FAEH ditunjuk sebagai stack. Kurangi SP dengan 1. Stack pointer berada pada 1FAEH, yaitu bagian bawah stack. Masukkkan isi register H ke memori (RAM) pada alamat 1FAEH. Kurangi lagi dengan 1. SP bergerak keatas. Tempatkan isi L ke bagian atas Stack (yaitu diatas H) Tempatkan isi A pada bagian atas stack (yaitu diatas L) Tempatkan isi F ke bagian atas Stack (yaitu diatas A). Ambil (pop) satu byte data dari atas stack dan pindahkan ke register C. SP ditambah dengan 1. SP bergerak kebawah. Ambil (pop) data dari atas stack. SP ditambah dengan 1 lagi. Ambil data dari atas stack dan pindahkan ke register E. Ambil data dari atas stack dan pindahkan ke register D. Data ini adalah data yang pertama kali disimpan pada stack. SP berada pada nilai asal (awal) 2
Yudi Irwanto_021500456
RAM
RAM SP yang ditunjuk oleh inst ke 10
SP yang ditunjuk Oleh intruksi ke 9 F
C
F
ke 12
F
B
A
ke 14
A
E
L
D
A SP yang ditunjuk
L Oleh intruksi ke 3
Nilai awal SP 1FAFH
L
H
H
ke 16
H
ke 17 Mengambil (pop) data dari Stack
Memasukkan (push) data pada Stack
Dari ilustrasi operasi stack diatas, kita dapat melihat bahwa data dapat disimpan pada RAM dengan
menggunakan SP sebagai penunjuk. SP
dikurangi dengan 1 (decremented)
bilamana ada satu byte data yang disimpan dan area stack menjadi lebih besar. SP ditambah dengan 1 (decremented) bilamana ada satu byte data yang diambil dari area stck dan area stack menjadi lebih kecil. Proses mengurangi SP dengan 1 (memasukkan data ke stack) atau menambah SP dengan 1 (mengambil data dari stack) dapat dilakukan secara otomatis dengan satu rangkaian khusus. Stack dapat juga digunakan untuk menyimpan alamat (atau data) 16 bit. Dalam sistem Z80/8085, ada intruksi untuk memasukkan pasangan register 16 bit kedalam stack, serta mengambil data 16 bit dari stack. Dalam tiap-tiap operasinya, SP dikurani atau ditambah dengan 2. Program ini mempunyai fungsi yang sama dengan program diatas. LD PUSH PUSH POP POP Intruksi
SP, 1FAFH Sama dengan intruksi pertama HL Sama dengan intruksi ke-2,3,4,5. AF Sama dengan intruksi ke-6,7,8,9. BC Sama dengan intruksi ke-10,11,12,13. DE Sama dengan intruksi ke-14,15,16,17. PUSH dan POP dapat juga digunakan untuk menyimpan data sementara pada
register, dapat pula digunakan untuk memindahkan data ke register. Kita dapat melihat contoh dibawah ini : PUSH POP PUSH AND SBC
BC IX HL A HL, DE
Pindahkan data 16 bit yang ada di BC ke IX
Bandingkan HL dengan DE untuk menghasilkan status flag. Nilai HL tidak berubah.
Hal yang perlu diperhatikan :Jumlah intruksi PUSH sama dengan jumlah intruksi POPdalam operasi stack. 3 Yudi Irwanto_021500456
2. SUBROUTINE : Program-program untuk aritmatik (penambahan,pengurangan,perkalian atau pembagian), keyboard, kontrol display dan sebagainya seringkali digunakan sebagai bagian dari suatu program yang besar dalam aplikasi-aplikasi praktis. Jika seorang programer harus menuliskan kembali program-program kecil tersebut setiap kali dia membutuhkannya, tentulah akan sangat menjemukan. Untuk menghemat memori dan mengurangi kesalahan, subroutin sering digunakan dalam program-program besar. Intruksi CALL dan RET (table C-2) digunakan untuk memanggil / menunjuk subroutine yang akan dipakai. Subroutin dapat dilaksanakan tanpa syarat, atau menurut keadaan flag. Intruksi CALL pada program utama digunakan untuk memanggil subroutine. Fungsinya terdiri dari dua operasi seperti yang digambarkan dibawah ini :
CALL
1A38H
; memangil subroutin yang tersimpan pada alamat 1A38H
PUSH JP
PC 1A38H
; masukkan (push) PC saat itu ke stack ; loncat ke alamat 1A38H dan melanjutkan
Sama dengan
pelaksaan program. Intruksi RET tidak membutuhkan operand (intruksi 1 byte), sama dengan intruksi „POP PC‟.
RET
; kembali ke program asal dan melanjutkan pelaksaan program.
Sama dengan
POP
PC
; Mengambil data 16 bit dari stack dan memasukkan ke PC, lalu melaksanakan program sesuai isi PC.
Mengambil suatu subroutin adalah langkah yang penting dalm suatu program. Subroutin dalam suatu program dapat berbentuk saling bersarang (dalam satu subroutin terdapat subroutin lain). Untuk lebih jelasnya hubungan itu dapat digambarakan sebagai berikut :
4 Yudi Irwanto_021500456
Program utama
Subroutin 1
CALL
1
CALL
2 CALL 1 RET
Subroutin 2
CALL 2
RET
Biasanya, subroutin ditulis oleh seorang ahli. Pemakai hanya perlu mengetahui prosedure pemanggilnya. Jika subroutin tersebut ditulis oleh pemakainya sendiri, hal-hal berikut ini perlu dipertimbangkan dalam merancang subroutin :
(1)
Nama untuk subroutin sebaiknya dipilih nama yang mudah diingat.
(2)
Bagaimana mendapatkan data yang dibutuhkan dalam subroutin sebelum menjalankan subroutin tersebut.
(3)
Bagaimana menyatakan hasil pelaksaan subroutin itu.
(4)
Register mana yang akan berubah setelah pelaksanaan subroutin.
(5)
Berapa besar memori yang akan ditempati oleh subroutin yang bersangkutan dan berapa lama waktu yang dibutuhkan oleh CPU untuk melaksanakn subroutin tersebut.
Hal-hal berikut ini harus diperhatikan bila suatu subroutin dipangil oleh program utama : (1) Data yang dibutuhkan oleh subroutin harus disimpan. (2)
Register-register yang tidak boleh berubah setelah pelaksanaan subroutin tersebut harus disimpan dalam stck sebelum memanggil subroutin tersebut.
(3)
Hasil yang diperoleh dari pelaksanaan subroutin akan diproses dengan metode yang digambarkan dalam subroutin.
Progrma berikut ini adalah contoh subroutine yang bernama MADD, yang dapat digunakan untuk penambahan multi byte BCD.
5 Yudi Irwanto_021500456
LOC
OBJ
St mt 1
Source Statement
2
Input :
ROUTIN PENAMBAHAN MULTY BYTE BCD HL MENUNJUK BYTE ORDE RENDAH BILANGAN YANG DI TAMBAH DE MENUNJUK BYTE ORDE RENDAH BILANGAN PENAMBAH B=JUMLAH BYTE, 1 BYTE=2 DIGIT BCD IX MENUNJUK BYTE BILANGAN YANG DIHASILKAN YANG BERORDE RENDAH REG YANG BERUBAH : AF. B, HL, DE, IX MEMORI YANG DIGUNAKAN : 15 BYTE
3
4 5
Output :
6 7
1900 1901 1902 1903 1904 1907 1908 1909 190B 190D
AF 1A 86 27 DD7700 13 23 DD23 10F4 C9
8 9 10 11 12 13 14 15 16 17 18
MADD MADD1
XOR LD ADD DAA LD INC INC INC DJNZ RET
A A,(DE) A, (HL)
NOL-KAN CARRY FLAG
(IX), A DE HL IX MADD1
0 Asembly errors Dua data BCD 4 byte disimpan di memori dengan alamat awal 1A00H dan 1A40H. Untuk menambahkan data BCD ini bersama-sama dan menyimpan hasilnya pada RAM alamat 1A08H, subroutin MADD dipanggil dengan prosedure berikut ini : LD
B,4
Set jumlah byte = 4
LD LD LD CALL
HL, 1A00H DE, 1A40H IX, 1A08H MADD
HL menunjuk alamat bilangan yang ditambah DE menunjuk alamat bilangan penambah IX menunjuk alamat bilangan yang dihasilkan
6 Yudi Irwanto_021500456
C. PERCOBAAN-PERCOBAAN 1. Dengan menggunakan instruksi-instruksi untuk operasi stack, tulislah suatu rutin untuk memindahkan berturut-turut data pada HL, DE, dan BC ke HL‟, BC‟, DE‟. Masukkan program pada MPF-I dan jalankan. 2. Dalam program berikut ini loop kecil dikelilingi oleh loop besar. Fungsi program ini menggeser semua data 8 bit pada alamat 1A00H – 1A20H ke kiri 4 bit. Gunakan register B sebagai penghitung loop untuk loop kecil dan besar. Masukkan program ke uPF-I dan jalankan. Diskusikan hasilnya mengapa register B dapat dipakai sebagai penghitung kedua loop. 1800 1 ORG 1800 06 21 2 LD 1802 21 00 1A 3 LD 1805 C5 4 LOOP 1 PUSH 1806 7E 5 LD 1807 06 04 6 LD 1809 87 7 LOOP 2 ADD 180A 10 FD 8 DJNZ 180C 77 9 LD 180D 23 10 INC 180E C1 11 POP 180F 10 F4 12 DJNZ 1811 76 13 HALT 3. Dengan memanggil subroutin yang diberikan pada bagian
1800H B, 21H HL, 1A00H BC A, (HL) B, 4 A, A LOOP 2 (HL), A HL BC LOOP 1 pertama (routin penambahan
multi byte BCD), tulislah sebuah program untuk penambahan dua data 8 byte yang tersimpan pada memori 1A00H dan 1A40H. Hasilnya harus disimpan pada memori 8 byte yang dimulai pada 1A00H. 4. Ubahlah program diatas untuk pengurangan BCD atau penambahan / pengurangan multy byte biner. Cobalah programnya dan catat metoda revisi yang digunakan. 5. Tulislah subroutin untuk mengubah data 16 bit pada HL menjadi komplemen keduanya. Tulislah suatu program utama untuk mengubah data pada IX dan IY menjadi komplemen keduanya. Masukkan proram ke uPF-I dan cobalah. 6. Dengan menggunakan routin diatas untuk meng-komplemen-kan pasangan register HL, tulislah suatu program utama untuk mengurangi data pada IY dan DE dan menyimpan hasilnya pada IY.
7 Yudi Irwanto_021500456
0000 0001 0002 0003 0004 0007 0008 0009 000B 00D
AF 1A 86 27 DD7700 13 23 DD23 10F4 C9
8 9 10 11 12 13 14 15 16 17 18
MADD MADD1
XOR LD ADD DAA LD INC INC INC DJNZ RET
A A,(DE) A, (HL)
NOL-KAN CARRY FLAG
(IX), A DE HL IX MADD1
LD
B,4
Set jumlah byte = 4
LD LD LD CALL
HL, 1A00H DE, 1A40H IX, 1A08H MADD
HL menunjuk alamat bilangan yang ditambah DE menunjuk alamat bilangan penambah IX menunjuk alamat bilangan yang dihasilkan
D. HASIL PERCOBAAN 1. Percobaan 1 Alamat H L D E B C
Data 00 01 02 03 04 05
Alamat H’ L’ D’ E’ B’ C’
Data 01 02 03 04 05 06
2. Percobaan 2 a. Program 1800 1800 1802 1805 1806 1807 1809 180A 180C 180D 180E 180F 1811
06 21 21 00 1A C5 7E 06 04 87 10 FD 77 23 C1 10 F4 76
1 2 3 4 5 6 7 8 9 10 11 12 13
LOOP 1
LOOP 2
ORG LD LD PUSH LD LD ADD DJNZ LD INC POP DJNZ HALT
1800H B, 21H HL, 1A00H BC A, (HL) B, 4 A, A LOOP 2 (HL), A HL BC LOOP 1
8 Yudi Irwanto_021500456
b. Data Alamat 1A00H 1A01H 1A02H 1A03H 1A04H 1A05H 1A06H 1A07H 1A08H 1A09H 1A10H 1A11H 1A12H 1A13H 1A14H 1A15H 1A16H
Data 00 10 20 30 40 50 60 70 80 90 00 10 20 30 40 50 60
Alamat 1A17H 1A18H 1A19H 1A20H 1A21H 1A22H 1A23H 1A24H 1A25H 1A26H 1A27H 1A28H 1A29H 1A30H 1A31H 1A32H
Data 70 80 90 00 10 20 1A 40 50 60 70 80 90 00 10 20
3. Percobaan 3 a. Program - Sub Routine
-
1900 AF 1901 1A 1902 86 1903 27 1904 DD7700 1907 13 1908 23 1909 DD23 190B 10F4 190D C9 Main Program
1800 1802 1805 1808 180C b. Data Alamat 1A00 H 1A01 H 1A02 H 1A03 H 1A04 H 1A05 H 1A06 H 1A07 H
9 10 11 12 13 14 15 16 17 18
MADD MADD1
06 08 21 00 1A 11 40 1A DD 21 00 1A CD 00 19 Data 20 20 20 20 20 20 20 20
Alamat 1A40 H 1A41 H 1A42 H 1A43 H 1A44 H 1A45 H 1A46 H 1A47 H
LD LD LD LD CALL
XOR LD ADD DAA LD INC INC INC DJNZ RET
A A,(DE) A, (HL) (IX), A DE HL IX MADD1
B,4 HL, 1A00H DE, 1A40H IX, 1A08H MADD Data 10 10 10 10 10 10 10 10
Alamat 1A00 H 1A01 H 1A02 H 1A03 H 1A04 H 1A05 H 1A06 H 1A07 H
Data 30 30 30 30 30 30 30 30
9 Yudi Irwanto_021500456
4. Percobaan 4 a. Program - Sub Routine 1900 1901 1902 1903 1904 1907 1908 1909 190B 190D -
AF 1A 96 27 DD7700 13 23 DD23 10F4 C9
9 10 11 12 13 14 15 16 17 18
MADD MADD1
XOR LD SUB DAA LD INC INC INC DJNZ RET
A A,(DE) (HL) (IX), A DE HL IX MADD1
Main Program 1800 1802 1805 1808 180C
06 08 21 00 1A 11 40 1A DD 21 00 1A CD 00 19
b. Data Alamat 1A00 H 1A01 H 1A02 H 1A03 H 1A04 H 1A05 H 1A06 H 1A07 H
Data 10 10 10 10 10 10 10 10
LD LD LD LD CALL
Alamat 1A40 H 1A41 H 1A42 H 1A43 H 1A44 H 1A45 H 1A46 H 1A47 H
B,4 HL, 1A00H DE, 1A40H IX, 1A08H MADD
Data 20 20 20 20 20 20 20 20
Alamat 1A00 H 1A01 H 1A02 H 1A03 H 1A04 H 1A05 H 1A06 H 1A07 H
Data 10 10 10 10 10 10 10 10
5. Percobaan 5 1) Komplemen HL - Subroutine 1900H 1901H 1902H 1903H 1904H 1905H 1906H 1907H
7C 2F 67 7D 2F 6F C9 FF
RET -
LD A, H CPL LD H,A LD A,L CPL LD L,A RET RST 38H
Memasukkan isi reg H ke reg A Reg A dikomplemenkan Memasukkan reg A ke reg H Memasukkan reg L ke reg A Reg A dikomplemenkan Memasukkan isi reg A ke reg L Kembali ke program utama. Kembali ke monitor
instruksi LD HL, 55BB
keterangan Memasukkan 55BBH pada reg HL Memanggil alamat 1900H
Main program
Alamat 1800H
Bahasa mesin 21 BB 55
1803H
CD 00 19
1806H
FF
label
CALL MADD
CALL M, 1900H RST 38H
Kembali ke monitor
10 Yudi Irwanto_021500456
-
Data Reg HL awalnya adalah 55BBH. Reg HL menjadi AA44H.
Pembuktian
2) Komplemen IX dan IY - Program Alamat 1800H
Bahasa mesin 31 00 1A
label
1803H
21 00 1A
LD HL, 1A00H
1806H 1808H 180CH 1810H
06 04 DD 21 BB 55 FD 21 44 AA DD E5
LD B,4 LD IX, 55BBH LD IY, AA44H PUSH IX
1812H
FD E5
PUSH IY
1814H
2B
1815H
7E
LD A, (HL)
1816H 1817H
2F 77
CPL LD (HL), A
1818H 181AH
10 FA FD E1
DJNZ, Loop POP IY
181CH
DD E1
POP IX
181EH
FF
RST 38H
Loop
-
instruksi LD SP, IA00H
DEC HL
keterangan Memasukkan 1A00H ke reg SP Memasukkan 1A00H ke reg HL Memasukkan 4 ke register B Isi register IX dengan 55BBH Isi register IY dengan AA44H Mengambil isi register IX ke SP Mengambil isi register IY ke SP Mengurangi isi register HL dengan 1 Memasukkan alamat pada register HL ke register A Komplemen register A Memasukkan register A ke alamat register HL Loop ke alamat 1814H Mengambil data dari SP ke register IY Mengambil data dari SP ke register IX Kembali ke monitor
Data
BEFORE
AFTER
Register IX
55 BB
Register IX
AA 44
Register IY
AA 44
Register IY
55 BB
11 Yudi Irwanto_021500456
Pembuktian
E. PEMBAHASAN Praktikum “Stack dan Subroutine” ini bertujuan agar mahasiswa mengerti arti dan penggunaan stack serta mengerti teknik merancang program dan penggunaan subroutine. Pada praktikum ini terdapat lima percobaan, yaitu membuat dan menjalankan program untuk memindahkan data secara berturut-turut; membuat dan menjalankan program untuk menggeser data 8 bit ke kiri 4 bit; membuat dan menjalankan program untuk penambahan dua data 8 byte; membuat dan menjalankan program untuk pengurangan dua data 8 byte; serta membuat dan menjalankan program untuk mengkomplemenkan isi register. Pada percobaan pertama ini praktikan diinstruksian untuk memindahkan berturut – turut data pada HL, DE, BC ke HL”, BC”, DE”. Pada percobaan kali ini pratikan menggunakan instruksi EXX yang berfungsi untuk menukar isi register HL, BC, DE ke HL”, BC”, DE”. Langkah awal praktikan mengisi register H = 00, L = 01, D = 02, E = 03, B = 04, C = 05. Kemudian praktikan menginstruksikan LD SP, 1900H yang berfungsiuntukmengeset stack pointer padaalamat 1900H. kemudian digunakan instruksi push HL, push DE, push BC yang berfungsi untuk menyimpan sementara isi register dari register HL, DE, BC ke stack pointer. Kemudian untuk memindahkan isi register di stack pointer pada HL”, BC”, dan DE” digunakan instruksi EXX. Percobaan kedua adalah menggunakan program loop kecil yang dikelilingi oleh loop besar. Fungsi program ini menggeser semua data 8 bit pada alamat 1A00H – 1A20H ke kiri 4 bit dengan menggunakan register B sebagai penghitung loop untuk loop kecil dan besar. Pada percobaan ini, data pada register HL dengan alamat 1A00H akan bergeser 4 byte. Program ini melibatkan instruksi B loop 21H, dimana reg HL dengan alamat 1A00H akan mengambil reg BC di SP dan menaruh data pada reg HL ke alamat A. Instruksi looping bekerja sebanyak 4x loop. Sehingga menambah data A dengan data A. Instruksi loop akan mengarahkan program kembali dan menaruh data A ke reg HL. Reg HL akan bertambah dan instruksi loop kembali ke reg HL 1A00H. Sesuai data hasil percobaan, reg HL 1A00H menghasil kan data 00, karena berapapun banyak nilai loop alamat 00 tidak akan menghasilkan data. Sedangkan pada reg HL dengan alamat 1A01H data bergeser 4 byte ke kiri artinya 0000 0001 menjadi 00010000 sehingga data bernilai 10. Hal yang serupa dapat dibuktikan pada reg HL dengan alamat 1A02 , 0000 0010 bergeser menjadi 0010 000, sehingga data yang terbaca adalah 20. Percobaan ketiga adalah membuat dan menjalankan program untuk penambahan dua data 8 byte. Data yang ditambahkan ada pada alamat 1A00 H dan 1A40 H, hasilnya disimpan di 1A00 H. Ada dua program yang digunakan dalam percobaan ini, yaitu main program dan subroutine. Main program dimulai dengan mengatur jumlah byte menjadi 8 byte dengan LD B, 8. Lalu register HL menunjuk alamat 1A00 H sebagai alamat dimulainya data akan ditambah dengan LD HL, 1A00 H. Lalu register DE menunjuk alamat 1A40 H sebagai alamat dimulainya data penambah dengan LD DE, 1A40 H. Lalu IX menunjuk alamat 1A00 H sebagai alamat dimulainya data hasil penjumlahan data pada 1A00 H dan 1A40 H. Lalu main program memanggil subroutine dengan CALL 12 Yudi Irwanto_021500456
MADD. Program masuk ke subroutine dengan MADD XOR A. Lalu subroutine mengambil data dari data alamat 1A40 H yang ditunjuk DE sebagai penambah dengan MADD1 LD A, (DE). Lalu subroutine menambahkan data tersebut dan data alamat 1A00 H yang ditunjuk HL dengan ADD A, (HL). Data hasil penjumlahan tersebut akan diubah menjadi bilangan decimal oleh DAA. Lalu data tersebut akan disimpan di alamat 1A00 H yang ditunjuk IX dengan LD (IX), A. Lalu nilai alamat yang ditunjuk DE naik satu heksa, 1A01 H dan seterusnya. Lalu nilai alamat yang ditunjuk HL naik satu heksa, 1A41 H dan seterusnya. Lalu B sebagai penghitung loop yang diatur 8 byte berarti akan mengulang sebanyak delapan kali dengan DJNZ MADD1. Lalu program akan kembali ke main program dengan RET. Lalu main program akan berhenti dengan FF. Dari program tersebut dapat dianalisa bahwa hasil penjumlahan data pada alamat 1A40 H dan 1A00 H akan tersimpan di 1A00 H, dan seterusnya. Contohnya pada alamat 1A40 H berisi data 10 dan pada alamat 1A00 H berisi data 20 maka setelah program dijalankan isi data alamat 1A00 H akan menjadi 30 sebagai hasil penjumlahan 10 dan 20 desimal, dan seterusnya. Percobaan keempat adalah membuat dan menjalankan program untuk pengurangan dua data 8 byte. Data yang dikurangkan ada pada alamat 1A00 H dan 1A40 H, hasilnya disimpan di 1A00 H. Ada dua program yang digunakan dalam percobaan ini, yaitu main program dan subroutine. Main program dimulai dengan mengatur jumlah byte menjadi 8 byte dengan LD B, 8. Lalu register HL menunjuk alamat 1A00 H sebagai alamat dimulainya data akan dikurang dengan LD HL, 1A00 H. Lalu register DE menunjuk alamat 1A40 H sebagai alamat dimulainya data pengurang dengan LD DE, 1A40 H. Lalu IX menunjuk alamat 1A00 H sebagai alamat dimulainya data hasil pengurangan data pada 1A00 H dan 1A40 H. Lalu main program memanggil subroutine dengan CALL MADD. Program masuk ke subroutine dengan MADD XOR A. Lalu subroutine mengambil data dari data alamat 1A40 H yang ditunjuk DE sebagai pengurang dengan MADD1 LD A, (DE). Lalu subroutine menambahkan data tersebut dan data alamat 1A00 H yang ditunjuk HL dengan SUB (HL). Data hasil pengurangan tersebut akan diubah menjadi bilangan decimal oleh DAA. Lalu data tersebut akan disimpan di alamat 1A00 H yang ditunjuk IX dengan LD (IX), A. Lalu nilai alamat yang ditunjuk DE naik satu heksa, 1A01 H dan seterusnya. Lalu nilai alamat yang ditunjuk HL naik satu heksa, 1A41 H dan seterusnya. Lalu B sebagai penghitung loop yang diatur 8 byte berarti akan mengulang sebanyak delapan kali dengan DJNZ MADD1. Lalu program akan kembali ke main program dengan RET. Lalu main program akan berhenti dengan FF. Dari program tersebut dapat dianalisa bahwa hasil pengurangan data pada alamat 1A40 H dan 1A00 H akan tersimpan di 1A00 H, dan seterusnya. Contohnya pada alamat 1A40 H berisi data 20 dan pada alamat 1A00 H berisi data 10 maka setelah program dijalankan isi data alamat 1A00 H akan menjadi 10 sebagai hasil pengurangan 10 dan 20 desimal, dan seterusnya. Percobaan kelima adalah menjalankan program untuk mengkomplemenkan isi register. Yang pertama mengkomplemenkan isi register HL dan yang kedua mengkomplemenkan isi register IX dan IY. Praktikan membuat 2 program, yakni program utama dan subroutine-nya. Pada program utamanya, praktikan memasukkan alamat 55BBH pada register HL yang akan dikomplemenkan. Kemudian memanggil alamat Subroutine-nya dengan instruksi CALL M, 1900H. Pada program subroutine-nya, praktikan memasukkan isi reg H pada reg A, kemudian mengklomenkannya dengan instruksi CPL. Instruksi CPL hanya dapat digunakan pada register A, oleh karenanya disimpan pada isi reg A terlebih dahulu. Setelah dikomplemenkan, praktikan hasil pengkomplemenannya ke register H lagi. Setelah itu, praktikan juga memasukan isi register L ke reg A, kemudian dilakukan pengkomplemenan dengan instruksi CPL. Barulah dipindahkan kembali ke register L. Setelah itu digunakan instruksi RET dengan maksud untuk kembali ke program utama. Dan setelah itu program selesai.
13 Yudi Irwanto_021500456
Pada percobaan 5 ini juga, yakni melakukan komplemen pada register IX dan IY. Dengan menggunakan Stack pointer (SP), maka isi register IX dan IY dapat dikomplemenkan. Pertama, praktikan melakukan penginisialisasian pada register HL, IX, dan IY dengan instruksi LD HL, 1A00H; LD IX, 55BBH; LD IY, AA44H. kemudian mengeset SP pada alamat 1A00H. isi register IX dan IY inilah yang akan dikomplemenkan. Setelah melakukan penginisialisasian, isi register IX dan IY disimpan pada Stack Pointer (SP) dengan instruksi PUSH IX dan PUSH IY. Kemudian praktikan mengisi register B dengan 4H. pengisian pada isi register B ini bertujuan untuk banyaknya pengeloop-an terjadi. Dengan melakukan pengurang 1H pada HL yakni DEC HL, isi alamat HL dimasukan pada register A dengan instruksi LD A,(HL). Kemudian barulah dilakukan pengkomplemenan, dimana intruksi CPL hanya bisa pada register A, itulah sebabnya isi register HL dipindahkan pada reg A. setelah dikomplemen, isi reg A dikembalikan pada isi reg HL. Apabila nilai B belum bernilai 0, maka looping akan terus terjadi sebanyak 4kali. Namun apabila isi register B telah sama dengan 0, maka proses dilanjutkan pada pengambilan data yang disimpan pada SP menuju isi register IY dan IX dengan menggunakan instruksi POP. Sebagai hasilnya, dapat dilihat pada isi register IX dan IY telah terkomplemen, dan hasil komplemennya telah dibuktikan dan bernilai benar.
F. KESIMPULAN 1. Stack merupakan suatu instruksipenyimpan data sementara yang data tersebut dapat dipindah ke alamat lain dengan bantuan instruksi pemanggil CALL. 2. Subroutine merupakan suatu program yang besar dalam aplikasi praktis untuk menghemat memori dan mengurangi kesalahanp pada perhitungan aritmatik (penambahan,pengurangan,perkalian atau pembagian), keyboard, kontrol display. 3. RET yaitu suatu instruksi yang dijalankan agar suatu program yang dijalankan kembali ke programasal dan melanjutkan pelaksana program.
14 Yudi Irwanto_021500456
G. FLOW CHART 1. Percobaan 1
15 Yudi Irwanto_021500456
2. Percobaan 2
16 Yudi Irwanto_021500456
3. Percobaan 3 START
Inisialisasi LD HL, 1A00H LD DE, 1A40 H LD IX, 1A00 H
CALL MADD 1900 H
MADD XOR A
MADD1 LD A, (DE)
ADD A, (HL) DAA LD (IX), A INC DE INC HL
DJNZTIDAK MADD1 (B NOT 0)
RET
RST 38H
STOP
17 Yudi Irwanto_021500456
4. Percobaan 4 START
Inisialisasi LD HL, 1A00H LD DE, 1A40 H LD IX, 1A00 H
CALL MADD 1900 H
MADD XOR A
MADD1 LD A, (DE)
SUB (HL) DAA LD (IX), A INC DE INC HL
DJNZTIDAK MADD1 (B NOT 0)
RET
RST 38H
STOP
18 Yudi Irwanto_021500456
5. Percobaan 5 a. Komplemen HL b.
START
Inisialisasi register HL
CALL M, 1900H
LD A, H CPL LD H, A
LD A, L CPL LD L, A
RET
RST 38H
reg HL terkomplemenkan
STOP
19 Yudi Irwanto_021500456
a. Komplemen HL b. c.
START
d.
Inisialisasi e. LD SP, f. 1A00H LD HL, 1A00H g. LD IX, 55BBH h. LD IY, AA44H
i.
j. IX PUSH k. IY PUSH LD l.B, 4
m.
DEC HL n. LD A, (HL) o. CPL p. LD (HL), A
q.
r. DJNZ s. REG B=0? t. YA
TIDAK
POP IX
u.POP IY
RST 38H
Isi reg IX dan IY terkomplemenkan
STOP
20 Yudi Irwanto_021500456