TI324-111061-710-5 133KB Jun 30 2011 04:10

advertisement
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
Download