Upload
rizky12
View
24
Download
5
Embed Size (px)
Citation preview
LAPORAN PRAKTIKUM POK
FINAL PROJECT
OLEH :
Nama : Andyta Permana Sari
NIM : M0511006
JURUSAN INFORMATIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS SEBELAS MARET
2012
I. TUJUAN:
Agar mahasiswa mampu mengimplementasikan materi – materi yang sudah
diberikan sebelumnya kedalam suatu program.
II. DASAR TEORI:
Dengan menggunakan bahasa Assembler, kita mampu membuat program
yang mampu mengubah huruf kecil menjadi huruf besar atau sebaliknya, dapat
pula mebuat program perulangan atau menuliskan string dengan pengaturan
kursor maupun atribut. Jika kita menginginkan untuk mengatur posisi kursor
digunakan INT 10h dengan servis 02 dengan syarat register sebagai berikut :
AH 02
BH nomor halaman layar
DH posisi baris
DL posisi kolom
Sebuah karakter disertai dengan warna tentunya akan lebih menarik. Untuk itu
anda bisa menggunakan interupsi ke 10h dengan aturan pemakaiannya :
AH = 09h
AL = Kode ASCII dari karakter yang akan dicetak
BH = Nomor halaman(0 untuk halaman 1)
BL = Atribut atau warna dari karakter yang akan dicetak
CX = Banyaknya karakter tersebut akan dicetak
Dapat juga melakukan operasi aritmatika yaitu penjumlahan dengan instruksi
ADD atau INC, operasi pengurangan dengan instruksi SUB atau DEC, operasi
perkalian dengan instruksi MUL dan operasi pembagian dengan instruksi DIV.
Selainitu kita juga dapat menggunakan prinsip stack. Berikut merupakan prinsip
stack :
- Sifat operasinya LIFO (Last In First Out), artinya data yang disimpan terakhir
ke dalam stack, akan diambil yang pertama kali.
- Ada operasi PUSH, yaitu mendorong isi register ke dalam STACK
- Ada operasi POP, yaitu operasi mengambil data dari STACK ke dalam register
- Adress memori yang menangani stack adalah SS:SP (Stack Segment dan Stack
Pointer)
Disamping itu, assembler juga menyediakan proses input keyboard dengan
ketentuan sebagai berikut :
INT 21H servis 01 : input 1 karakter dari keyboard dengan ECHO (apa yang
diinputkan ditampilkan di layar)
Syarat: AH 01
Hasil : kode ASCII karakter yang diinput disimpan di register AL
INT 21H servis 07 : input 1 karakter dari keyboard tanpa ECHO (apa yang
diinputkan tidak ditampilkan di layar) tanpa mengecek
ctrlbreak
Syarat : AH 07
Hasil : kode ASCII karakter yang diinput disimpan di register AL
INT 21H servis 08 : input 1 karakter dari keyboard tanpa ECHO (apa yang
diinputkan tidak ditampilkan di layar) dengan mengecek ctrl-
break (dapat dibreak dengan Ctrl-C)
Syarat : AH 08
Hasil : kode ASCII karakter yang diinput disimpan di register AL
INT 21H servis 06 : input 1 karakter dari keyboard tanpa menunggu
Syarat : AH 06
DL 0FFH
Hasil : kode ASCII karakter yang diinput disimpan di register AL
III. ANALISIS:
Run :
Untuk membuat program seperti yang terlihat diatas, pertama-tama
diawali dengan membuat project baru dengan COM file, sehingga secara
default akan tertulis ORG100h yang digunakan untuk memberitahu assembler
supaya program pada saat dijalankan ditaruh mulai dari offset ke 100h atau
256 byte.
Barulah dalam label start dibuat instruksi jmp mulai, yang meminta
program untuk langsung loncat menuju ke label mulai. Sebelumnya
dideklarasikan beberapa buah string antara lain : :
- Teks1 db “PROGRAM CAMPUR CAMPUR$”
- Teks2 db 10,13 “OLEH : Andyta PS / M0511006$”
- Teks 3 db 10,13 “Membuat kalimat menjadi tidak Alay$”
- Teks 4 db 10,13 “Masukkan kalimat (campuran huruf besar &
kecil) : $”
- Teks 5 db 10,13 “Dalam huruf kecil : $”
- Kal db 20,?,20 dup(?)
- Teks 6 db 10,13 “ $” => agar ada 1 baris yang kosong
- Teks 7 db 10,13 “PERULANGAN$”
- Teks 8 db 10,13 “Masukkan Angka untuk perulangan(1-9): $”
- Teks 9 db 10,13 “Diulang-ulang$”
- Teks 10 db 10,13 “Bukan bilangan Ulangi$”,10,13
- Teks 11 db 10,13 “OPERASI PEMBAGIAN$”
- Hasil db 0 (nilai hasil diinisiasi awal bernilai 0)
- Sisa db 0 (nilai sisa diinisiasi awal bernilai 0)
- Teks 12 db 10,13 “Akan dilakukan pembagian 66 dibagi 7 $”
- Teks 13 db 10,13 “Hasil bagi: $”
- Teks 14 db 10,13 “Sisa bagi: $”
- Teks 15 db 10,13 “STACK$”
Dalam beberapa buah string diatas, terdapat tanda $ yang selalu tertera
dalam akhir string, tanda tersebut digunakan sebagai tanda bahwa string telah
berakhir, atau dapat dikatakan sebagai pengakhir kalimat, sedangkan angka 10
disamping kalimat digunakan untuk pergantian baris dan angka 13 digunakan
untuk pengaturan rata kiri. Lanjut ke label mulai, didalamnya diberikan
berbagai perintah atau instruksi.
Dalam label mulai dibuatlah instruksi pengaturan kursor dengan
didahului perintah MOV AH, 02h merupakan servis untuk mengatur kursor.
Kemudian terdapat instruksi MOV BH, 00 yang dimaksudkan sebagai
pengatur nomor halaman layar. Sedangkan MOV DH, 01 dimaksudkan
sebagai pengatur posisi baris , dalam hal ini string pertama yaitu PROGRAM
CAMPUR CAMPUR dituliskan dalam baris ke 1 atau pertama. Instruksi MOV
DL,25 merupakan perintah untuk mengatur posisi kolom, sehingga string
tersebut dituliskan dalam kolom ke 25. Jadi jika dipandang sebagai matriks,
kalimat PROGRAM CAMPUR CAMPUR ini terdapat dalam (8,25). Perintah
INT 10 merupakan interupsi untuk mengakses layar agar dapat diatur posisi
kursornya. Kemudian diberikan perintah MOV AH,09H yang digunakan untuk
mencetak string, hampir sama dengan perintah MOV AH,02H saat kita hendak
mencetak sebuah karakter. Dan kemudian kalimate tersebut diberikan atribut
atau warna agar lebih menarik dengan instruksi MOV BL,0BH. Kita dapat
mengganti warna baground maupun warna dari tulisan itu sendiri. Untuk
memilih warna background, kita dapat mengganti angka 0 dalam intsruksi
tersebut dengan angka 1-9 sesuai keinginan kita, sedangkan untuk warna dasar
dari karakter dapat dilakukan dengan mengganti huruf b dalam instruksi
tersebut dengan angka 1-9 atau huruf a-f sesuai keinginan kita. Dalam hal ini
saya mengambil 0b untuk mendapatkan huruf dengan warna background hitam
(0) dan warna dasar karakter biru (b). Selanjutnya diberikan perintah MOV
DX, OFFSET teks1 yang artinya data berupa teks1 yang disimpan dalam
memori memiliki alamat offset dimana alamat offset tersebut akan dikirim ke
register DX. Setelah itu, dijalankan perintah INT 21H yang digunakan untuk
mengeksekusi program atau mencetak string yang dikehendaki. Dicetak
kembali teks 2 dan teks 6 dengan MOV DX, offset teks2 yang dilanjutkan
dengan INT 21h dan MOV DX, offset teks6 yang juga dilanjutkan dengan INT
21h untuk mencetak kalimat.
Selanjutnya, untuk program yang mengubah Huruf menjadi huruf kecil
semua, awalnya kita mencetak string dari teks3 dan teks4 dengan perinta
MOV DX, offset teks3 yang dilanjutkan dengan INT 21h dan MOV DX, offset
teks4 yang juga dilanjutkan dengan INT 21h untuk mencetak kalimat ke-3 dan
ke-4. Kemudian nilai dalam register BX di-Nolkan atau di XORkan.
Kemudian dibuat label baca yang didalamnya terdapat berbagai
instruksi. diawali dengan instruksi MOV AH,01h yang dimaksudkan agar user
dapat memasukkan input berupa sebuah karakter dari keyboard dengan ECHO
(apa yang diinputkan ditampilkan di layar). Perintah INT 21h merupakan
instruksi yang merupakan syarat yang digunakan agar servis 01 dari register
AH dapat dilaksanakan. Hasil inputan dari keyboard nantinya akan disimpan
dalam register AL. Kemudian CMP AL,0DH dimaksudkan untuk
membandingkan atau compare dengan desimal 0D yang dalam kode ascii
merupakan tanda enter, maksudnya nilai dalam register AL di bandingkan
apakah sama dengan 0D. Jika sama, maka instruksi JE jadi (jump if equal)
dilaksanakan, sedangkan jika nilai dalam register AL tidak sama dengan 0D,
JE jadi tidak dilaksanakan. Misalkan yang kita inputkan dalam program adalah
huruf A (besar), yang memiliki kode ascii 41, karena tidak sama dengan 0D
(enter) maka JE jadi dilewati. Perintah CMP AL ini hampir sama dengan
fungsi if condition dalam c++ maupun java. Kemudian nilai dalam register AL
tadi dipindahkan ke kal dalam indeks ke BX (awalnya BX bernilai 0, akibat
proses XOR BX). Kemudian nilai BX diincrement atau ditambah 1 dan
program kembali mengulang program dalam label baca sampai diinputkan
enter.
Lalu dalam label ubah, disini digunakan perintah MOV AH,02h yang
digunakan untuk mencetak karakter, kemudidan nilai dalam register DL
ditambah 20 heksa decimal dengan pernyataan ADD DL,20h. Kemudian nilai
DL yang baru dicetak dengan interup 21h dan nilai CX di decrement atau
dikurang 1 dan program loncat atau jump ke label cetak.
Dalam label jadi, diberikan perintah MOV AH,09H yang digunakan
untuk mencetak string, hampir sama dengan perintah MOV AH,02H saat kita
hendak mencetak sebuah karakter. Selanjutnya diberikan perintah MOV DX,
OFFSET teks5 yang artinya teks5 yang disimpan dalam memori memiliki
alamat offset dimana alamat offset tersebut akan dikirim ke register DX.
Setelah itu, dijalankan perintah INT 21H yang digunakan untuk mengeksekusi
program atau mencetak string dari teks5. Kemudian dijalankan MOV AH,02h
untuk servis mencetak karakter, setelah itu nilai dalam register BX dipindah ke
register CX. Kemudian diberikan instruksi XOR BX,BX yang digunakan
untuk meng-XOR-kan nilai dalam register BX, atau membuat nilai dalam
register BX sama dengan 0 (meng NOL kan register BX).
Dalam label cetak, di compare atau dibandingkan apakah nilai dalam
CX adalah 0 (CMP CX,0000), jika iya maka JE prog2 (Jump if Equal)
dijalankan, akan tetapi jika tidak, maka langsung ke MOV DL,kal[BX] yang
dimaksudkan bahwa nilai kal pada indeks ke BX dipindah ke register DL.
Stelah itu nilai BX diincrement atau ditambah 1. Lalu dibandingkan nilai
dalam register DL apakah kurang dari 40h, jika iya maka JLE (Jump if Lower
or Equal) cetak1 dijalankan, tapi jika lebih besar 40h, maka JLE cetak1
dilewati. Kemudian nilai register DL dibandingkan lagi apakah kurang dari
5AH, jika iya, maka program loncat ke label ubah (JLE ubah). Sedangkan
dalam label cetak1 program dieksekusi dengan INT 21h dan mengalami
pengulangan menuju ke label cetak.
Berikutnya adalah label prog2 yang didalamnya juga diberikan
berbagai instruksi. Pertama adalah pencetakan string dari teks ke 6, teks7
dan teks8 dengan instruksi MOV AH, offset teks6, INT 21h , MOV AH,
offset tek7, INT 21h dan MOV AH, offset teks8, INT 21h . Kemudian
diberikan instruksi MOV AH,01h dimaksudkan agar user dapat
memasukkan input berupa sebuah karakter dari keyboard dengan ECHO
(apa yang diinputkan ditampilkan di layar). Perintah INT 21h merupakan
instruksi yang merupakan syarat yang digunakan agar servis 01 dari
register AH dapat dilaksanakan. Hasil inputan dari keyboard nantinya akan
disimpan dalam register AL. Kemudian perintah CMP AL, 30h dan JLE
(Jump if Lower or Equal) salah maksudnya adalah nilai dalam register AL
(yang diinputkan dari keyboard) dibandingkan apakah bernilai kurang dari
atau sama dengan 30 heksadesimal atau angka 0 dari kode ascii , jika benar
maka program loncat atau jump ke label salah. Namun jika tidak atau
bernilai salah (lebih dari 30 heksadesimal ) maka perintah JLE dilewati
dan langsung ke instruksi CMP AL,3Ah dan JGE (Jump if Greater or
Equal) salah, perintah tersebut dimaksudkan bahwa jika nilai dalam
register AL lebih besar atau sama dengan 3A heksadesimal atau angka 10,
maka program langsung loncat ke label salah.
Kemudian diberikan instruksi XOR CX,CX yang digunakan untuk
meng-XOR-kan nilai dalam register CX, atau membuat nilai dalam
register CX sama dengan 0 (meng NOL kan register CX). Nilai dari
register CX ini nantinya digunakan sebagai perulangan. Setelah itu nilai
dalam register AL dimasukkan ke register CL (MOV CL,AL) dan
dikurangi 30 heksadesimal dengan istruksi SUB CL,30h. Setelah itu
diberikan perintah MOV AH,09H yang digunakan untuk mencetak string,
hampir sama dengan perintah MOV AH,02H saat kita hendak mencetak
sebuah karakter. Selanjutnya diberikan perintah MOV DX, OFFSET teks9
yang artinya teks9 yang disimpan dalam memori memiliki alamat offset
dimana alamat offset tersebut akan dikirim ke register DX.
Dalam label ulang dieksekusi atau dicetak data dari register DX yang
berisi string dari teks9. Kemudian dilakukan perulangan dengan instruksi
LOOP ulang dan mencetak kembali data teks9, dan proses ini akan terus
terulang sampai dengan nilai yang ada dalam register CX. Setelah selesai
melakukan perulangan di label ulang maka program loncat ke label prog3.
Untuk label salah diberikan perintah MOV AH,09H yang digunakan
untuk mencetak string. Selanjutnya diberikan perintah MOV DX, OFFSET
teks10 yang artinya teks10 yang disimpan dalam memori memiliki alamat
offset dimana alamat offset tersebut akan dikirim ke register DX. Setelah
itu, dijalankan perintah INT 21H yang digunakan untuk mengeksekusi
program atau mencetak string dari string tersebut. Kemudian program
kembali ke label prog2 dengan perintah JMP prog2.
Selanjutnya adalah label prog3, didalamnya diberika instruksi yang
digunakan untuk menghitung operasi aritmatika pembagian. Pertama
diberikan instruksi MOV AH,09h yang digunakan untuk mencetak string,
hampir sama dengan perintah MOV AH,02H saat kita hendak mencetak
sebuah karakter. Selanjutnya diberikan perintah untuk mencetak string
dalam teks6, teks11, dan teks12 dengan perintah MOV AH, offset teks6,
MOV AH, offset teks11 dan MOV AH, offset teks12 yang masing masing
disisipi INT 21h untuk eksekusi. Kemudian diberikan instuksi MOV
AX,66 dan MOV DL,7 yang berarti nilai dalam register AX diberikan
sama dengan 66 dan nilai dalam register DL adalah 7. Barulah diberikan
operasi pembagian terhadap register AX dan DL dengan perinta DIV DL,
yang artinya nilai dalam register AX di bagi dengan nilai dalam register
DL dan hasilnya akan disimpan dalam register AL dan sisanya akan
disimpan dalam register AH. Jadi setelah terjadi operasi pembagian AL
terhadap DL (66/7= 9 sisa 3), nilai AL yang merupakan hasil pembagian
yaitu 9, dipindah ke HASIL dengan MOV HASIL, AL dan nilai AH yang
merupakan sisa pembagian yaitu 3 dipindah ke SISA dengan MOV
SISA,AH. Setelah itu berikan kembali perintah MOV AH,09h untuk
mencetak string dan MOV DX, OFFSET teks13 yang artinya teks13 yang
disimpan dalam memori memiliki alamat offset dimana alamat offset
tersebut akan dikirim ke register DX. Setelah itu, dijalankan perintah INT
21H yang digunakan untuk mengeksekusi program atau mencetak string
dari teks13 tersebut.
Kemudian diberikan perintah MOV AH,02h yang merupakan servis
yang digunakan untuk mencetak karakter. Kemudian nilai HASIL yaitu 9
dipindah ke dalam register DL (MOV DL,HASIL), dan nilai DL tadi ditambah
dengan 30h (ADD DL,30h), sehingga nilai DL sekarang adalah 9+30h=39h
yang dalam kode ascii merupakan angka 9. Kemudian dicetak angka 9 tersebut
dengan interrupt 21h (INT 21h).
Setelah itu berikan kembali perintah MOV AH,09h untuk mencetak
string dan MOV DX, OFFSET teks14 yang artinya teks14 yang disimpan
dalam memori memiliki alamat offset dimana alamat offset tersebut akan
dikirim ke register DX. Setelah itu, dijalankan perintah INT 21H yang
digunakan untuk mengeksekusi program atau mencetak string dari teks14
tersebut.
Kemudian diberikan perintah MOV AH,02h yang merupakan servis
yang digunakan untuk mencetak karakter. Kemudian nilai SISA yaitu 3
dipindah ke dalam register DL (MOV DL,SISA), dan nilai DL tadi
ditambah dengan 30h (ADD DL,30h), sehingga nilai DL sekarang adalah
3+30h=33h yang dalam kode ascii merupakan angka 3. Kemudian dicetak
angka 3 tersebut dengan interrupt 21h (INT 21h).
Label berikutnya adalah label prog4 yang berisi berbagai instruksi
Stack. Awalnya diberikan instruksi instruksi MOV AH,09h yang digunakan
untuk mencetak string, hampir sama dengan perintah MOV AH,02H saat kita
hendak mencetak sebuah karakter. Selanjutnya diberikan perintah untuk
mencetak string dalam teks6, teks15, dan teks6 dengan perintah MOV AH,
offset teks6, MOV AH, offset teks15 dan MOV AH, offset teks6 yang masing
masing disisipi INT 21h untuk eksekusi. MOV AH, 02 H artinya program
tersebut diminta untuk memindahkan nilai 02H ke dalam register AH atau kita
menyuruh program untuk memanggil servis 02 agar dapat menuliskan huruf.
Dengan konsep stack, dituliskan satu persatu dulu nilai yang akan kita
munculkan dengan MOV DL. Setiap menuliskan nilai dalam register DL, DX
harus di PUSH dulu untuk memasukkannya kedalam stack dulu sebelum
digunakan nantinya. Dalam hal ini awalnya kita menuliskan nilai 70 yang
merupakan kode asciii dari huruf p (kecil) ke dalam register DL dengan MOV
DL, 70H. Kemudian DX di PUSH atau disimpan nilainya dalam stack.
Kemudian MOV DL,3aH yang berguna untuk menuliskan symbol : (titik dua),
register DX di PUSH lagi. Kemudian dituliskan MOV DL,20H untuk
menuliskan symbol spasi, lalu di PUSH ke stack. Begitu seterusnya mengisi
register DL dengan nilai 41H, 54H, 59H, dan 44H. Dan setiap kali kita
mengisikan register DX, harus dimasukkan dalam stack (PUSH) terlebih
dahulu. Lalu nilai yang ada dalam stack itu di POP atau diambil dari nilai
paling atas atau yang terakhir kali dimasukkan. Dengan instruksi POP DX
pertama, artinya kita mengambil nilai dari register DX yang terakhir kali
dimasukkan atau berada paling atas dalam stack yaitu nilai 44 yang
merupakan kode ascii dari huruf D. Huruf D tadi di eksekusi dengan perintah
INT 20H. Kemudian diberikan POP DX lagi yang akan mengambil nilai 59
dalam stack yang merupakan kode ascii dari huruf Y, lalu di POP DX yang
memiliki nilai 54 yang merupakan kode ascii dari T. Dan juga di POP DX
dengan nilai 41 yang merupakan huruf A dalam kode ascii. Begitu seterusnya
data dalam stack di POP sampai data yang terakhir dalam stack yaitu 70 yang
merupakan kode ascii dari p(kecil). Sehingga saat dieksekusi akan
menghasilkan string “DYTA :p”.
Terakhir kali, diberikan label selesai yang didalamnya diberikan
instruksi MOV AX,4C00H yang digunakan untuk mengakhiri program,
sebagai pengganti dari INT 20H, dan INT 21H digunakan untuk mengeksekusi
program yang telah kita buat.
IV. KESIMPULAN:
Dari program yang terlah dibuat dan dianalisa, dapat diambil kesimppulan
bahwa Assembler dapat digunakan untuk membuat program dengan berbagai
variasi seperti program mencetak kalimat dengan stack, program yang dapat
melakukan perulangan atau looping, program yang mampu menginputkan
karakter dari keyboard dan lain-lain. Dimana dalam program itu, kita dapat
memberikan atribut berupa wana background maupun warna dasar karakter sesuai
keinginan kita dan juga dapat memberikan pengaturan letak atau pengaturan posisi
kursor.