Modul BaRak

Embed Size (px)

Citation preview

Modul Bahasa Rakitan oleh abu syafaBAB I DASAR-DASAR BAHASA RAKITAN Bahasa Assembly atau rakitan merupakan bahasa yang memiliki tingkat paling rendah dalam bahasa pemrograman, karena bahasa ini hampir mirip dengan bahasa mesin. Bahasa mesin merupakan kumpulan perintah dengan bilangan binner. Karena banyaknya bahasa rakitan yang ada saat ini, maka pada pembahasan selanjutnya hanya akan membahas bahasa rakitan dengan menggunakan Turbo Assembly (TASM). Untuk membuat program dengan bahasa rakitan, kita bisa menggunakan program editor apapun, asalkan disimpan dengan ekstensi asm (*.asm). Karena Tasm biasa digunakan pada command line (baris perintah), maka untuk menjalankan Tasm, kita harus menggunakan MS-DOS Prompt. MS-DOS Prompt Merupakan DOS emulator milik windows. Artinya kita bisa menggunakan DOS walaupun kita berada pada sistem operasi Windows. Untuk menjalankan MS-DOS Prompt ini, anda bisa mengikuti langkah dibawah ini: Klik tombol Start Programs MS-DOS PromptGambar 1. Tampilan Jendela MS-DOS Prompt Dari tampilan gambar diatas bisa kita ketahui bahwa kita aktif pada drive C: didirektori Windows. Untuk selanjutnya anda bisa berpindah ke direktori kerja anda. Misal, jika data anda akan disimpan di D:\Praktek\TI\12020205, maka perintah yang harus anda ketik untuk aktif di direktori kerja anda adalah: Berpindah ke drive D, dengan perintah: D: [Enter] Berpindah ke direktori dengan perintah: CD \Praktek\TI\12020205 [Enter] Agar anda bisa menggunakan Tasm tanpa perlu mengcopy ke direktori anda, maka anda bisa menggunakan perintah Path. Misal program Tasm ada direktori C:\Tasm, maka anda bisa menggunakan perintah: SET PATH=%PATH%;C:\TASM MEMBUAT PROGRAM SEDERHANA Untuk membuat program menggunakan bahasa rakitan, anda bisa menggunakan editor apapun. Misal kita menggunakan editor Edit.com dan file yang akan kita buat adalah a.asm, maka perintah yang anda gunakan adalah: Edit a.asm [Enter] Kemudian anda ketik listing program dibawah ini: ; program mencetak huruf A kelayar ; by [email protected] .model small .code org 100h mulai: mov ah,02 mov dl,65 int 21h int 20h end mulai Kemudian simpan program anda, dan keluar dari program editor. Keterangan program ;(tanda titik koma) Merupakan baris keterangan program. Artinya setelah tanda ; program akan mengabaikan perintah apapun yang ada. .model small Digunakan untuk menentukan mode dari program anda, seperti tiny, small dan lain sebagainya. .code org 100h Menentukan alamat offset dari program yang akan digunakan. Untuk program com selalu diawali dari offset 100h. mulai: Adalah nama label. Pada pemrograman assembly anda harus mengawali program anda dengan sebuah label. Label ini juga digunakan untuk lompatan program dengan perintah jmp (jump). mov ah,02 Mengisi register ah dengan servis 2, identik dengan ah:=2 dalam bahasa pascal. Artinya kita menyuruh program nantinya untuk mencetak sebuah karakter yang ada pada register dl. Dengan kata lain perintah mov ah,02 adalahHal 1servis untuk mencetak sebuah karakter. Angka 2 disini adalah 2 heksadesimal, sehingga biasa ditulis 02h. mov dl,65 Mengisi register dl dengan karakter ascii 65 atau 'A'. Jadi perintah diatas bisa diubah atau sama artinya dengan perintah mov dl,'A'. int 21h Menjalankan interupsi nomor 21. Interupsi ini akan mengerjakan sesuai dengan nilai servis yang diisikan. Karena ada perintah mov ah,2 maka progam akan mencetak karakter yang ada pada register dl. int 20h Menjalankan interupsi 20. Interupsi ini berfungsi untuk mengembalikan kontrol ke DOS, dengan kata lain interupsi ini digunakan untuk menghentikan jalannya program. end mulai Akhir dari progam. Untuk mengakhiri program anda harus mengetikkan perintah end diikuti oleh nama label yang pertama kali digunakan.KOMPILASI DAN RUNNING PROGRAM Untuk mengkompilasi program bahasa rakitan, ada 2 langkah yang perlu kita lakukan, diantaranya adalah: 1. Membuat berkas objek dengan menggunakan Tasm.exe 2. Membuat berkas EXE dengan menggunakan Tlink.exe Jika anda ingin mengkompilasi berkas a.asm, maka cukup anda ketik: Tasm a.asm [Enter] Kemudian dilanjutkan dengan perintah: Tlink/t a.obj [Enter] Jika tidak muncul pesan kesalahan, maka proses kompilasi anda telah berhasil. Untuk melihat hasilnya anda cukup mengetikan nama filenya saja, misal: a.com [Enter] Begitu seterusnya. Setiap anda selesai mengetik listing program, untuk melihat hasilnya anda bisa mengkompilasi program dengan cara seperti yang telah diterangkan sebelumnya.Gambar 2. Tampilan Jendela Saat Kompilasi Program. TUGAS 1. Berdasarkan contoh program diatas, buatlah sebuah program dengan menggunakan bahasa rakitan untuk menampilkan tulisan BISA, serta jelaskan algoritma atau cara kerja program tersebut. 2. Menurut anda, struktur pemrograman dalam bahasa rakitan seperti apa ?, jelaskan !.Modul Bahasa Rakitan oleh abu syafaBAB II PERULANGAN Apakah anda masih ingat dengan program pertama kita, yaitu program untuk mencetak huruf A ?.Bagaimana jika kita ingin mencetak lebih dari satu karakter ?. Apakah kita harus mengetikkan perintah mov ah,? dan int 21h sebanyak karakter yang ingin dicetak ?. Tentunya hal tersebut akan sangat mubadzir sekali. Akan lebih efektif lagi jika anda menggunakan LOOP atau perulangan. Berikut ini contoh programnya: ; program mencetak huruf A ; sebanyak 26 kali ; dengan menggunakan loop .model small .code org 100h mulai: mov ah,02 mov dl,65 mov cx,26 ulang: int 21h loop ulang int 20h end mulai; servis cetak karakter ; dl=A ; banyaknya perulangan ; cetak karakter ; ulangi hingga 26 kali ; selesaiDari contoh program diatas, anda akan melihat sebuah register baru yaitu CX. Register ini sifatnya unik, yaitu bisa digunakan sebagai pencacah atau counter dalam sebuah perulangan. Secara otomatis nilai CX akan berkurang 1 atau CX=CX-1, jika terdapat perintah LOOP. Sedangkan ketika ada perintah LOOP program akan memeriksa nilai CX, jika CX=0, maka perulangan akan dihentikan. Selain itu jika nilai CX >0 maka nilai CX akan dikurangi 1. INCREASE dan DECREASE Didalam suatu perulangan biasanya berhubungan dengan penaikan nilai. Sebagai contoh jika kita ingin mencetak huruf A sampai dengan Z, maka kita perlu membuat suatu perulangan dan menaikan nilai A hingga Z. untuk menaikan nilai, dalam bahasa rakitan digunakan perintah INC. Kebalikannya, fungsi decrease adalah untuk menurunkan suatu nilai. Didalam bahasa rakitan digunakan perintah DEC. Berikut ini contoh programnya: ; program mencetak ; huruf A s/d Z ; dengan loop dan inc .model small .code org 100h mulai: mov ah,02 mov dl,65 mov cx,26 ; servis cetak karakter ; dl=A ; banyaknya perulangan ; ; ; ; cetak karakter naikkan nilai dl ulangi hingga 26 kali selesaiulang:int 21h inc dl loop ulang int 20h end mulaiTUGAS 1. Buatlah sebuah program dengan menggunakan bahasa rakitan untuk mencetak huruf Z sampai dengan A dengan menggunakan perulangan.Hal 3BAB III MENCETAK KALIMAT Pada bab sebelumnya telah dijelaskan bagaimana cara mencetak karakter dengan bahasa pemrograman assembly. Nah, bagaimana kalau kita ingin mencetak suatu kalimat. Akan sangat tidak efektif kalau kita mencetak suatu kalimat per karakter. Berikut ini algoritma untuk mecetak suatu kalimat. Pertama kita mendefinisikan atau mendeklarasikan suatu variable untuk menampung teks yang ingin kita tampilkan. Selanjutnya kita menggunakan servis 9h interup 21h. Kemudian kita ambil alamat efektif dari teks yang akan kita cetak, untuk selanjutnya kita simpan kedalam register dx. DEKLARASI VARIABLE Sama halnya seperti pada pemrograman tingkat tinggi, pada bahasa rakitan dikenal juga adanya variable. Untuk mendeklarasikan variable harus didefinisikan berdasarkan besarannya. Contoh: kuliah db stmik el rahma kuliah adalah nama variable yang didefinisikan dalam byte (db = define byte) dengan ukuran 8 bit. Variable kuliah ini memiliki nilai stmik el rahma. nama db ? menjelaskan bahwa ada variable nama dengan nilai tidak diketahui. angka dw 22 variable angka didefinisikan word (dw = define word) dengan ukuran 16 bit atau 2 byte. Variable angka ini memiliki nilai 22. Yang perlu diperhatikan saat membuat variable adalah kita harus melompatkan program jangan sampai membaca deklarasi variable. Jika tidak, maka program akan menganggap deklarasi variable sebagai baris perintah yang akan dieksekusi. Untuk melompatkan program tanpa syarat kita menggunakan perintah jmp. .model small .code org 100h mulai: jmp proses ; lompat ke proses teks db 'Bahasa Assembly Memang Mudah' db 13,10,'Semudah membalikan Tank Baja' db ' Plastik Mainan Anakku$' proses: mov ah,9 ; servis cetak karakter lea dx,teks ; catat kalimat int 21h ; cetak... int 20h ; selesai end mulai Selain menggunakan int 21h servis 9, anda juga bisa mencetak kalimat dengan menggunakan int 10h servis 13 sub servis 00. Biar lebih jelas coba program dibawah ini: .model small .code org 100h mulai: jmp proses teks db 'Bahasa proses: mov ax,1300h mov bl,2 mov bh,00 mov dl,10 mov dh,10 mov cx,24 lea bp,teks int 10h int 20h end mulai; lompat ke proses Assembly, Oke deh' ; ; ; ; ; ; ; ; ; servis cetak karakter warna tulisan nomor halaman posisi kolom posisi baris cetak 24 kali catat teks cetak... selesai; 24 karakterHal yang harus anda perhatikan pada int 10h servis 13 sub servis 00, adalah bahwa anda harus menentukan panjang karakter yang akan dicetak. Jika salah dalam menghitung jumlah karakter tersebut, maka hasil yang muncul tidak akan sama dengan kalimat yang ada. Selain contoh program diatas, anda juga bisa mencetak beberapa buah karakter sampai ditemukan karakter tertentu sebagai akhir dari kalimat. Misalkan anda ingin mencetak "Hidup Mulia Dengan Islam Atau Mati Syahid*", kitaModul Bahasa Rakitan oleh abu syafamemberikan tanda bintang sebagai akhir dari kalimat. Contoh programnya dibawah ini: .model small .code org 100h mulai: jmp proses ; lompat ke proses teks db 'Hidup Mulia Dengan Islam Atau Mati Syahid*' proses: xor bx,bx ; set nilai bx=0 mov ah,2 ; servis cetak karakter ulang: cmp teks[bx],'*'; apakah karakter '*' je keluar ; kalo iya, lompat ke keluar mov dl,teks[bx] int 21h inc bx jmp ulang keluar: int 20h end mulai ; ; ; ; kalo ngga isi dl dgn karakter cetak karakter tersebut cari karakter berikutnya ulangi lagi; selesaiTUGAS 1. Buatlah sebuah program dengan bahasa rakitan untuk mencetak teks seperti tertera dibawah ini: Tips dan trik memahami bahasa assembly: a. belajar b. belajar c. belajar 2. Dengan menggunnakan perulangan, buat program untuk menampilkan teks seperti dibawah ini: Bismillah Bismillah Bismillah Bismillah BismillahHal 5BAB IV INPUT DATA Pada praktikum kali ini, kita akan membahas bagaimana membuat sebuah program untuk menerima input atau masukan dari keyboard. Interupsi yang akan kita gunakan adalah Int 16h servis 0. Hasil dari pembacaan karakter ini akan disimpan oleh program pada register AX. Bila terjadi penekanan pada tombol biasa (huruf/angka), maka byte rendah dari AX (AL) akan menunjukan kode ASCII dari tombol tersebut dan byte tingginya (AH) berisi kode scan dari tombol tersebut. Bila yang ditekan adalah tombol khusus (extended),maka byte rendah dari register AX (AL) akan menghasilkan kode ASCII 0, sedangkan AH berisi kode extended dari tombol tersebut. .model small .code org 100h mulai: jmp proses tbl_ascii db 13,10,'Ini adalah tombol ' db 'ASCII : $' tbl_extended db 13,10,'Ini adalah tombol ' db 'Extended $' proses: mov ah,0 ; servis input satu karakter int 16h ; laksanakan... push ax ; simpan nilai ax cmp al,00 ; apakah karakter extende ? je extended ; kalo iya, lompat ke extended ascii: lea dx,tbl_ascii ; catat keterangan mov ah,09h ; servis cetak opo hayo.... int 21h ; kerjake dab ! pop ax ; ambil nilai ax (setelah di push) mov dl,al ; catat nilai al mov ah,02h ; servis opo meneh hayoo... int 21h ; cetak cmp al,'Q' je keluar cmp al,'q' je keluar jmp proses extended: lea dx,tbl_extended mov ah,09h int 21h jmp proses keluar: int 20h ; ; ; ; ; ; ; ; ; yg ditekan 'Q' kalo iya metuuuuuu neken 'q' metuuu menehhhh kalo bukan 'Q' atau 'q' ulangi lagi masih inget lea ??? servis iki wis dibolabaline ping piro wae ! iki meneh... ulangi lagi; selesaiend mulai Selain fungsi diatas, masih ada lagi fungsi yang berkenaan dengan input keyboard ini. Untuk mendeteksi adanya penekanan tombol anda bisa menggunakan int 16h servis 1. Fungsi ini akan mendeteksi keyboard buffer, bila ada penekanan maka ZF (Zerro Flag) akan menjadi 0 (nol), dan register AL berisi kode ASCII dari karakter tersebut sedangkan register AH berisi kode scan dari tombol tersebut. Jika pada buffer tidak ada karakter, maka ZF bernilai 1 (satu) Berikut ini contoh programnya: .model small .code org 100h mulai: jmp proses teks db 'Tekan sembarang tombol ' db 'untuk berhenti !!!',13,10,'$' proses: mov ah,1 ; cek buffer keyboard int 16h ; laksanakan jnz keluar ; jika ada tombol yg ditekan, keluar mov ah,9 ; ngga akan aku jelaskan lagi lea dx,teks ; ini juga tak kan kujelaskanModul Bahasa Rakitan oleh abu syafaint 21h jmp proses keluar: int 20h; opo meneh iki ; podo waeend mulai Bagaimana kalo ingin mendapatkan masukan satu kalimat dari keyboard ?. Tenang saja, ngga usah menangis apalagi sampe lari ke dukun segala (dosa tauuuu...). Alhamdulillah anda bisa melakukannya dengan menggunakan servis 0ah Int 21h. Hasil dari masukkan keyboard akan disimpan pada register DX. Untuk dapat mengambil isinya anda harus menyediakan sebuah variable seperti: Hasil db X,Y,Z dup(?) Pada byte pertama yang kita gambarkan 'X' digunakan sebagai tanda dari banyaknya karakter yg dimasukkan dari keyboard ditambah 1. Bila anda memberikan nilai 26, maka karakter maksimum yang dapat dimasukkan adalah 25 karakter, karena satu karakter lagi digunakan untuk tombol Enter.Untuk 'Y' digunakan sebagai indikator banyaknya karakter yang telah diketikkan oleh user. Anda dapat memberikan tanda '?' untuk byte kedua ini, karena nilainya akan diisi secara otomatis nantinya. Byte ketiga digambarkan sebagai 'Z' untuk menampung string. Karena itu banyaknya byte harus sama dengan byte pertama ('X'). .model small .code org 100h mulai: jmp proses tbl_enter equ 0dh ; 0dh=Enter Tanya db 'Ketik nama kamu : $' Ket db 13,10,'Assalamualaikum $' Jawab db 26,?,26 dup(?) proses: mov ah,09h lea dx,tanya int 21h ; tanya mov ah,0ah lea dx,jawab int 21h mov ah,09h lea dx,ket int 21h lea bx,jawab+2 ulang:; catat; cetak ket ; menunjuk byte ke-2 dari jawab ; apakah karakter entercmp byte ptr [bx],tbl_enter je keluar mov dl,[bx] mov ah,02h int 21h inc bx jmp ulangkeluar: int 20h end mulaiHal 7TUGAS 1. Buatlah program untuk menginputkan data mahasiswa. Contoh output: Masukan data anda. Nim : 12020205 [Enter] Nama : abu syafa [Enter] Jurusan : TI [Enter] Berikut ini adalah data anda. Nim = 12020205 Nama = abu syafa Jurusan = TIModul Bahasa Rakitan oleh abu syafaBAB V PROSEDUR Seperti pada bahasa pemograman tingkat tinggi, pada program assembly juga menyediakan pembuatan prosedur. Bentuk penulisan prosesur secara umum adalah sebagai berikut: namaP PROC Near/Far ..................... isi prosedur ..................... RET namaP ENDP Bentuk Near digunakan untuk program yang terdiri 1 segment (*.com), sedangkan untuk jenid Far digunakan untuk program yang memiliki lebih dari 1 segment (*.com). Perintah Ret (Return) digunakan untuk mengembalikan alih kontrol keprogram utama (pemanggil). Untuk memanggil prosedur ini syntaxnya adalah : Call namaP Dibawah ini 2 contoh program prosedur yang bisa anda coba: .model small .code org 100h mulai: call cetak_kar int 20h cetak_kar proc near mov ah,02h mov dl,'A' int 21h ret cetak_kar endp end mulai Berikut ini contoh prosedur yang lain: .model small .code org 100h mulai: jmp proses kar db ? klm db 'The Qur''an is Holly ' db 'no unThruth in it al all' ; 44 kar proses: mov cx,44 xor bx,bx ulang: mov dl,klm[bx] mov kar,dl call cetak_kar inc bx loop ulang int 21hcetak_kar proc near push ax push dx mov ah,02h mov dl,kar int 21h pop dx pop ax ret cetak_kar endp end mulai BAB VI MACRO & GRAFIK Kelemahan penggunaan prosedur didalam bahasa assembly adalah suatu prosedur tidak dapat memiliki parameter. Sebagai solusinya kita bisa menggunakan macro. Secara umum prosedur dan macro memiliki persamaan. Bedanya macro dapatHal 9menangani pemanggilan dengan parameter. Berikut ini contoh penggunaan macro untuk menggambar suatu garis: Readkey MACRO MOV AH,00 INT 16h ENDM SetCRT MACRO Mode MOV AH,00 MOV AL,Mode INT 10h ENDM PutPixel MACRO X,Y,Warna PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,0C ; Servis menggambar pixel MOV CX,X ; Posisi kolom atau X MOV DX,Y ; Posisi baris atau Y MOV AL,Warna ; Atribut Pixel INT 10h ; Gambar pixel tersebut ! POP DX POP CX POP BX POP AX ENDM GarisV MACRO X1,Y1,Panjang,Warna LOCAL Ulang PUSH DX PUSH CX MOV DX,Y1 MOV CX,Panjang Ulang: PutPixel X1,DX,Warna INC DX LOOP Ulang POP CX POP DX ENDM MACRO X1,Y1,Panjang,Warna LOCAL Ulang PUSH CX PUSH DX MOV DX,X1 MOV CX,Panjang Ulang: PutPixel DX,Y1,Warna INC DX LOOP Ulang POP DX POP CX ENDMGarisH;/===============================================\; ; Program : GRAPH0.ASM ; ; Fungsi : Menggambar garis vertical ; ; dan horisontal ; ;\===============================================/;Modul Bahasa Rakitan oleh abu syafa.MODEL SMALL .CODE ORG 100h Proses: SetCRT 13h ; Aktifkan mode grafik 13h GarisV 150,50,50,12 ; Gambar garis Vertikal Readkey ; Tunggu penekanan keyboard GarisH 135,60,30,12 ; Gambar garis Horisontal Readkey ; Tunggu penekanan keyboard SetCRT 03h INT 20h END Proses ; Kembali pada mode DosContoh program dibawah ini adalah pengembangan dari contoh program sebelumnya: Readkey MACRO MOV AH,00 INT 16h ENDM SetCRT MACRO Mode MOV AH,00 MOV AL,Mode INT 10h ENDM PutPixel MACRO X,Y,Warna PUSH AX PUSH BX PUSH CX PUSH DX MOV AH,0C ; Servis menggambar pixel MOV CX,X ; Posisi kolom atau X MOV DX,Y ; Posisi baris atau Y MOV AL,Warna ; Atribut Pixel INT 10h ; Gambar pixel tersebut ! POP DX POP CX POP BX POP AX ENDM GarisV MACRO X1,Y1,Panjang,Warna LOCAL Ulang PUSH DX PUSH CX MOV DX,Y1 MOV CX,Panjang Ulang: PutPixel X1,DX,Warna INC DX LOOP Ulang POP CX POP DX ENDM MACRO X1,Y1,Panjang,Warna LOCAL Ulang PUSH CX PUSH DX MOV DX,X1 MOV CX,PanjangHal 11GarisHUlang: PutPixel DX,Y1,Warna INC DX LOOP Ulang POP DX POP CX ENDM Kotak MACRO X1,Y1,X2,Y2,Warna GarisH X1,Y1,X2-X1,Warna GarisV X1,Y1,Y2-Y1,Warna GarisV X2,Y1,Y2-Y1,Warna GarisH X1,Y2,X2-X1+1,Warna ENDM;/=============================================\; ; Program : GRAPH2.ASM ; ; Fungsi : Menggambar sebuah kotak ; ;\=============================================/; .MODEL SMALL .CODE ORG 100h Proses: SetCRT 13h Kotak 120,30,180,100,12 ; Gambar kotak Readkey SetCRT 03h INT 20h END Proses