PRAKTIKUM MIKROPROSESOR DAN BAHASA RAKITAN MENCETAK HURUF, KALIMAT, DAN ANGKA TUJUAN 1. Mahasiswa mampu melakukan pemrograman assembly menggunakan Turbo Assembler 2. Mahasiswa mampu membuat program assembly untuk mencetak huruf , kalimat, dan angka DASAR TEORI Proses pencetakan huruf, kalimat, atau angka pada bahasa assembly secara umum memanfaatkan interupsi dos. Untuk mencetak sebuah kalimat maka dipergunakan INT 21h dengan kode servis 9 dengan ketentuan sebagai berikut : 1. Register AH diisi dengan 09h 2. Register DS:DX diisi dengan alamat kalimat yang akan dicetak 3. Jalankan INT 21h Untuk metode ini , maka secara default karakter $ akan dijadikan tanda akhir kalimat yang akan dicetak. Dalam implementasinya, akan sering dijumpai karakter kontrol. Karakter kontrol merupakan karakter yang khusus untuk melaksanakan fungsi tertentu. Macamnya sebagai berikut : Kode ASCII 7 8 9 10 13 Nama Fungsi Bel Memberikan suara beep Backspace Memindahkan kursor 1 kolom ke belakang Horizontal tab Memindah kursor 8 kolom ke kanan Line feed Memindah kursor 1 kolom ke bawah Carriage return Memindahkan kursor ke ke awal baris Tabel 1. Tabel Karakter Kontrol ASCII Selain karakter kontrol tersebut, juga ada karakter kontrol lainnya, yang dipergunakan untuk komunikasi komputer dengan periferalnya, antara lain : Kode ASCII Nama 0 Null 1 Start of heading 2 Start of text 1 3 End of text 4 End of transmission 5 Enquiry 6 Acknowledge 7 Bel 8 Backspace 9 Horizontal tab 10 Line feed 11 Vertical tabulation 12 Form feed 13 Carriage return 14 Shift out 15 Shift in 16 Data link escape 17 Device control 18 Negative acknowledge (NACK) 19 Synchronous idle 20 End of transmission block 21 Cancel 22 End of medium 23 Substitute 24 Escape 25 File separator 26 Group separator 27 Record separator 28 Unit separator 29 Spasi 30 Delete Tabel 1. Tabel Karakter Kontrol ASCII Lengkap Mencetak kalimat juga bisa menggunakan atribut seperti pada pencetakan huruf. Interupsi yang dipergunakan yaitu INT 10h dengan langkah sebagai berikut : 1. Register AX diisi dengan 1300h 2. Register BL diisi dengan atribut yang diinginkan 3. Register BH diisi dengan halaman tampilan 4. Register DL diisi dengan posisi X kalimat akan ditampilkan 5. Register DH diisi dengan posisi Y kalimat akan ditampilkan 6. Register CX diisi dengan panjang kalimat yang akan ditampilkan 7. Register ES:BP diisi alamat kalimat yang akan dicetak 8. Jalankan INT 10h 2 Pengaturan atribut yang diinginkan dapat dilihat seperti pada tabel berikut : Bit ke Nama Warna dasar 6 5 7 BL (Blink) 4 3 R G B I (Red) (Green) (Blue) (Intensitas warna) Tabel 3. Atribut Kalimat Warna tulisan 2 R (Red) 1 0 G B (Green) (Blue) Mencetak angka untuk bahasa assembly tidak semudah pada bahasa tingkat tinggi. Hal ini dikarenakan tidak ada fungsi khusus yang dapat digunakan. Misal ingin cetak angka 2, maka kita harus mencari nilai kode ASCII-nya yaitu 32h baru bisa dicetak ke layar. Cara yang sering digunakan adalah dengan melakukan pembagian bertingkat dengan 10. Pembagian memanfaatkan register AX dan BX, untuk selanjutnya hasil pembagian disimpan ke stack pointer. Setelah pembagian selesai maka data di stack pointer dikonversi ke ASCII dan ditampilkan ke layar. PROSEDUR PERCOBAAN 1. Mencetak kalimat Tuliskan program berikut ini pada text editor dan simpan sebagai file kal00.asm pada folder yang sama dengan tasm.exe. ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; ; Program : kal00.asm ; ; Fungsi : Mencetak kalimat ; ; dengan Int 21 servis 9 ; ;=====================================; .Model Small .Code ORG 100h Kalimat : JMP Kal0 Kal1 Proses db 'PROSES PENCETAKAN STRING ',13,10,'$' db 'DIBELAKANG TANDA $ TIDAK BISA DICETAK ' Proses: MOV MOV INT LEA INT LEA INT AH,09h DX,OFFSET Kal0 21h DX,Kal0 21h DX,Kal0+7 21h ; ; ; ; ; ; ; Servis ke 9 Ambil Alamat Offset Kal0 Cetak perkarakter sampai tanda $ Ambil Alamat Offset Kal0 Cetak perkarakter sampai tanda $ Ambil Alamat Offset KAl0+7 Cetak perkarakter sampai tanda $ 3 End LEA DX,KAL1 INT 21h INT 20h Kalimat ; Ambil Offset kal1 ; Cetak perkarakter sampai ketemu $ ; Selesai, kembali ke DOS a. Buka command prompt dos. b. Compile program menggunakan tasm dengan perintah berikut : tasm kal00 c. Lingking file kal00.obj menggunakan tlink dengan mengetikkan perintah berikut : tlink/t kal00 d. Jalankan file kal00.com dan amati yang terjadi pada layar Anda. e. Ubah nilai Kal0 dan Kal1 sesuai dengan keinginan Anda dan lihat hasilnya 3. Mencetak kalimat dengan atribut a. Tulis source code program berikut ini pada text editor lalu compile ,linking, dan jalankan hasilnya serta amati hasilnya dengan seksama. ;============================================= ; Program : kal01.asm ; ; Fungsi : Mencetak kalimat disertai ; ; atributnya ; ;-----------------------------------------------; ; INT 10h ; ;-----------------------------------------------; ; Input : ; ; AX = 1300h ; ; BL = Atribut ; ; BH = Halaman tampilan ; ; DL = Posisi X ; ; DH = Posisi Y ; ; CX = Panjang kalimat<dalam karakter>; ; ES:BP = Alamat awal string ; ;=============================================; .Model Small .Code ORG 100h Kalimat : JMP Kal0 Proses: MOV MOV MOV MOV MOV MOV LEA Proses db ' Menulis kalimat dengan Atributnya ' AX,1300h BL,10010101b BH,00 DL,20 DH,12 CX,35 BP,Kal0 ; ; ; ; ; ; ; Servis 13h subfungsi 00 Atribut tulisan Halaman tampilan 0 Posisi X Posisi Y Banyaknya karakter dalam string ES:BP alamat string 4 End INT 10h INT 20h Kalimat ; Cetak kalimat ! ; Selesai, kembali ke DOS b. Ubah nilai BL menjadi : 65, 128, 180, 200, 255, 0 dan amati yang terjadi c. Ubah nilai DL dan DH lalu amati apa yang terjadi pada tulisan di layar Anda 3. Mencetak angka dalam bentuk desimal a. Tulis source code program berikut ini pada text editor lalu compile ,linking, dan jalankan hasilnya serta amati hasilnya dengan seksama. ;============================================ ; Program : angka01.ASM ; Fungsi : Mencetak angka yang bernilai ; antara 0 sampai 65535 dalam ; format desimal ;============================================ .Model Small .Code ORG 100h TData : JMP Proses Test_Angka dw 65535 Proses: MOV AX,Test_Angka MOV BX,10 XOR CX,CX Ulang : XOR DX,DX pembilang ! DIV BX dengan 10 PUSH DX INC CX CMP AX,0 JNE Ulang Cetak : POP DX ADD DL,'0' ASCII MOV AH,02 INT 21h LOOP Cetak INT 20h End TData ; Angka yang akan dicetak ; AX = angka yang akan dicetak ; BX = penyebut ; CX = 0 ; Cegah sisa bagi menjadi ; Bagi angka yang akan dicetak ; ; ; ; Simpan sisa bagi dalam stack CX ditambah 1 Apakah hasil bagi sudah habis ? Jika belum, ulangi lagi ! ; Ambil 1 angka yang disimpan ; Ubah angka tersebut dalam kode ; No servis yang dipergunakan ; Cetak angka tersebut ; ulangi b. Ubah nilai Test_Angka ke 32, 50, 75,1234,33445,123456 dan amati apa yang terjadi 5 4. Mencari dan menampilkan angka prima a. Tulis source code program berikut ini pada text editor lalu compile ,linking, dan jalankan hasilnya serta amati hasilnya dengan seksama. Cetak_Klm MOV LEA INT EndM Macro Klm AH,09 DX,Klm 21h ; Macro untuk mencetak kalimat CDesimal Macro Angka Local Ulang, Cetak MOV AX,Angka ; AX = angka yang akan dicetak MOV BX,10 ; BX = penyebut XOR CX,CX ; CX = 0 Ulang : XOR DX,DX ; Cegah sisa bagi menjadi pembilang ! DIV BX ; Bagi angka yang akan dicetak dengan 10 PUSH DX ; Simpan sisa bagi dalam stack INC CX ; CX ditambah 1 CMP AX,0 ; Apakah hasil bagi sudah habis ? JNE Ulang ; Jika belum, ulangi lagi ! Cetak : POP DX ; Ambil 1 angka yang disimpan ADD DL,'0' ; Ubah 1 angka dalam kode ASCII MOV AH,02 ; INT 21h ; Cetak angka tersebut LOOP Cetak ; ulangi EndM ;================================================; ; Program : angka02.ASM ; ; Fungsi : Mencari dan menampilkan angka ; ; prima dari 0 sampai 1000 ; ;================================================; .Model Small .Code ORG 100h TData : JMP Awal Batas Prima I J Spasi Header dw dw dw dw db db db 1000 0 2 2 ' $' 9,9,9,'Bilangan Prima 1 sampai 1000 : ',13,10 9,9,9,'------------------------',13,10,10,'$' Awal : Cetak_Klm Header Proses : MOV AX,Batas ; CMP AX,I ; JE Exit ; ForI : MOV J,2 ; Jika bilangan yang dicek sudah sama dengan Batas maka selesai J untuk dibagi oleh I 6 MOV Prima,0 ForPrima: MOV AX,Prima CMP AX,0 JNE TambahI MOV AX,I CMP AX,J JNE Tidak CDesimal I Cetak_Klm Spasi MOV Prima,1 JMP TambahJ Tidak : MOV DX,0 ; MOV AX,I ; MOV BX,J ; DIV BX CMP DX,0 JNE TambahJ MOV Prima,1 TambahJ : INC J JMP ForPrima TambahI : INC I JMP Proses Exit : INT 20h End TData ; Prima = Tidak ; ; ; ; ; ; ; ; ; ; ; ; ; ; Apakah prima = Tidak ? jika Prima = Ya, lompat ke TambahI I = J ? Jika tidak sama, lompat ke Tidak Cetak angka prima Cetak spasi Prima = Ya Lompat ke TambahJ Bagi I dengan J Apakah sisa bagi=0? Jika tidak sama lompat ke TambahJ Prima = Ya ; Tambah J dengan 1 ; Ulangi, bagi I dengan J ; Tambah I dengan 1 ; Ulangi Cek I = prima atau bukan 5. Menampilkan angka dalam bentuk heksadesimal a. Tulis source code program berikut ini pada text editor lalu compile ,linking, dan jalankan hasilnya serta amati hasilnya dengan seksama. Cetak Macro MOV DL,Tabel_Hex[BX] ; MACRO untuk MOV AH,02 ; mencetak INT 21h ; huruf ke BX pada tabel_Hex EndM ;======================================================; ; Program : angka03.ASM ; ; Fungsi : Mencetak angka yang bernilai antara ; ; 0000 sampai 255 <FFh> dalam format ; ; hexadesimal ; ;======================================================; .Model Small .Code ORG 100h TData : JMP Proses Tabel_Hex db '0123456789ABCDEF' Test_Angka db 255 ; Angka yang akan dicetak 255=FFh Proses: SUB BH,BH ; Jadikan BH=0 7 End MOV PUSH MOV SHR Cetak POP AND Cetak INT TData BL,Test_Angka BX CL,4 BL,CL BX BL,0Fh ; ; ; ; ; ; ; ; BL = angka yang akan dicetak Simpan angka tersebut Ambil 4 bit tinggi dari + BL untuk dicetak Cetak 1 angka hexa tingginya Ambil angka yang disimpan Ambil 4 bit rendah dari + BL untuk dicetak 20h 8