modul praktek Running text menggunakan menggunakan bahasa assembly
MEMBUAT PROGRAM COM
MODEL PROGRAM COM Program .COM hanya menggunakan 1 segment dan bisa anda buat d engan model program seperti Gambar 1 di bawah. Bentuk yang digunakan disini adalah bentuk program yang dianjurkan (Ideal). Dipilihnya bentuk program inikarena pertimbangan dari berbagai keunggulannya seperti, prosesnya lebih cepat dan lebih mudah digunakan oleh berbagai bahasa tingkat tinggi yang terkenal (Turbo Pascal dan C).
---------------------------------------------------------.MODEL SMALL .CODE ORG 100H
Label1 : JMP Label2 +---------------------+ TEMPAT DATA PROGRAM +---------------------+
Label2 : +---------------------+ TEMPAT PROGRAM +---------------------+
INT 20H END Label1 ---------------------------------------------------------Gambar 1 Model Program COM
Tanda directive ini di gunakan gunakan untuk memberitahukan kepada assembler bentuk memory yang digunakan oleh program kita. Supaya lebih jelas modelmodel yang bisa digunakan adalah : - TINY Jika program anda hanya menggunakan 1 segment seperti program COM. Model ini disediakan khusus untuk program COM. - SMALL Jika data dan code yang digunakan oleh program kurang dari ukuran 1 segment atau 64 KB. - MEDIUM Jika data yang digunakan oleh program kurang dari 64 KB tetapi code yang digunakan bisa lebih dari 64 KB. - COMPACT Jika data yang digunakan bisa lebih besar dari 64 KB tetapi codenya kurang dari 64 KB. - LARGE Jika data dan code yang dipakai oleh program bisa lebih dari 64 KB. - HUGE Jika data, code maupun array yang digunakan bisa lebih dari 64 KB. Mungkin ada yang bertanya-tanya mengapa pada program COM yang yang dibuat digunakan model SMALL dan bukannya TINY ? Hal ini disebabkan karena banyak dari compiler bahasa tingkat tin ggi yang tidak bisa berkomunikasi dengan model TINY, sehingga kita menggunakan model SMALL sebagai pemecahannya.
Supaya lebih jelas bentuk dari program ideal, marilah kita telusuri lebih lanjut dari bentuk program ini.
.CODE Tanda directive ini di gunakan gunakan untuk memberitahukan kepada assembler bahwa kita akan mulai menggunakan Code Segment-nya disini. Code segment ini digunakan untuk menyimpan program yang nantinya akan dijalankan.
.MODEL SMALL
ORG 100h 1
Pada program COM perintah ini akan selalu digunakan. Perintah ini digunakan untuk memberitahukan assembler supaya program pada saat dijalankan(diload ke memory) ditaruh mulai pada offset ke 100h(256) byte. Dapat dikatakan juga bahwa kita menyediakan 100h byte kosong pada saat program dijalankan. 100h byte kosong ini nantinya akan ditempati oleh PSP(Program Segment Prefix) dari program tersebut. PSP ini digunakan oleh DOS untuk mengontrol jalannya program tersebut.
JMP Perintah JMP(JUMP) ini digunakan untuk melompat menuju tempat yang ditunjukkan oleh perintah JUMP. Adapun s yntaxnya adalah: JUMP Tujuan . Dimana tujuannya dapat berupa label seperti yang digunakan pada bagan diatas. Mengenai perintah JUMP ini akan kita bahas lebih lanjut nantinya. Perintah JUMP yang digunakan pada bagan diatas dimaksudkan agar melewati tempat data program, karena jika tidak ada perintah JUMP ini maka data program akan ikut dieksekusi sehingga kemungkinan besar akan menyebabkan program anda menjadi Hang.
INT 20h Perintah INT adalah suatu perintah untuk menghasilkan menghasilkan suatu interupsi dengan syntax: INT NoInt Interupsi 20h berfungsi untuk mengakhiri program dan menyerahkan kendali sepenuhnya kepada Dos. Pada program COM cara ini bukanlah satu-satunya tetapi cara inilah yang paling efektif untuk digunakan. Bila anda lupa untuk mengakhiri sebuah
program maka program anda tidak akan tahu kapan harus selesai, hal ini akan menyebabkan komputer menjadi hang.
MEMBUAT PROGRAM EXE
harus mendefinisikan tempat untuk segment DATA, CODE dan STACK. Untuk membuat program EXE ini, anda bisa menggunakan model pada Gambar 2 di bawah. ---------------------------------------------------------.MODEL SMALL
PROGRAM EXE Seperti program COM, program EXE juga merupakan suatu bentuk program yang dapat langsung dijalankan pada prompt DOS. Bentuk program EXE tidaklah dibatasi oleh satu segment, seperti halnya pada program COM. Oleh karenanya besarnya file untuk program EXE bisa melebihi 64 KB. Program EXE merupakan program yang lebih lengkap dibandingkan dengan program COM, selain itu penggunaan memory juga lebih mudah pada program EXE.
Pada program EXE, register segment CS dan SS diinialisasi secara otomatis, tetapi register segment DS dan ES tidaklah demikian. Register segment DS dan ES pada awalnya menunjuk pada awal program, yaitu PSP. Karenanya register DS perlu kita inialisasi s ecara manual agar menunjuk pada segment data melalui perintah:
.STACK 200h MOV AX,@DATA MOV DS,AX
.DATA +--------------+ Tempat Data Program +--------------+ .CODE Label1: MOV AX,@DATA
Pada program EXE, kita perlu mendefinisikan tempat untuk stack. Pendefinisian tempat untuk stack digunakan tanda directive: .STACK yang diikuti dengan banyaknya stack yang didefinisikan untuk program. Pada model yang kita gunakan didefinisikan tempat untuk stack sebanyak 200h Word yang tentunya sudah lebih dari cukup untuk digunakan oleh program-program pada umumya.
MOV DS,AX Catatan: Pada program EXE, segala bentuk JUMP dan CALL digunakan jenis FAR(Program COM berbentuk NEAR). Hal ini dikarenakan program EXE yang bisa mengakses segment lain, sehingga perintah JUMP dan CALL membutuhkan informasi alamat dari segment(CS) selain offset(IP).
+---------------+ Tempat Program +---------------+ MOV AX,4C00h INT 21h END Label1
MODEL PROGRAM EXE Pada program COM, kita tidak perlu mendefinisikan tempat tertentu untuk segment DA TA dan STACK karena program COM hanya menggunakan 1 segment. Dengan demikian segment untuk DATA, STACK dan CODE pada program COM adalah sama, stack akan menggunakan akhir dari segment yang digunakan oleh segment CODE. Berbeda dengan program COM, pada program EXE anda
--------------------------------------------------------Gambar 2 Model program EXE
Pada program EXE, kita tidak perlu menggunakan perintah:ORG 100h, karena program EXE bisa menempatkan dirinya pada alamat yang telah ditentukan. 2
Berbeda dengan program COM, yang selalu kita akhiri dengan interupsi 20h, pada program EXE interupsi 20h tidak bisa digunakan. Pada program EXE digunakan interupsi 21h fungsi 4Ch dengan register AL berisi kode return. Interupsi 21h fungsi 4Ch ini lebih fleksibel untuk digunakan, karena selain kontrol akan dikembalikan kepada DOS, file-file yang terbuka juga akan ditutup oleh fungsi ini. Fungsi ini ju ga akan mengembalikan vektor interupsi default 22h, 23h dan 24h. Anda juga bisa mengakhiri program COM dengan fungsi ini. instruction sets 80x86 part1 (from aaa 2 div instruction) -------------------------------Mnemonic : AAA (ASCII Adjust For Addition) Tersedia pada : 8088 keatas Syntax : AAA Pengaruh flag :
AF, CF Fungsi : Mengatur format bilangan biner/hexa ke bentuk BCD setelah dilakukan operasi penjumlahan dua bilangan BCD. AAA hanya dapat dilakukan untuk bilangan sebesar 4 bit, maksimal hexa F dan diletakkan di register AL. Bila AL bernilai lebih dari 9, maka AL akan dikurangi 10 dan 4 bit tinggi dari AL akan dijadikan 0. Setelah itu AH akan ditambah dengan 1. CF dan AF akan diset 1.
Pengaruh flag : OF, SF, ZF, AF, PF, CF Fungsi : Mengkonversi bilangan biner atau hexa ke BCD. Adapun cara yang dilakukan adalah membagi AL dengan 10, kemudian hasilnya dimasukkan ke register AH sedang sisanya ke register AL.
Contoh:
Contoh:
Bilangan BCD 8 + 6 = ...
Bilangan BCD ; 12 * 9 = ...
MOV AL,8h MOV AH,6h ADD AL,AH ; AX = 060Eh AAA ; AX = 0704h
MOV AL,12h MOV BL,09h MUL BL ; AX = 00A2h AAM ; AX = 1002h
Jadi bilangan 0E dijadikan BCD menjadi 14, dimana bilangan di AX dibaca BCD 14 --> AH = 1(7-6), AL =4
Mnemonic : AAD (ASCII Adjust For Division) Tersedia pada : 8088 keatas Syntax : AAD Pengaruh flag : SF, ZF, PF Fungsi : Mengkonversi bilangan BCD ke biner atau hexa. Adapun cara yang dilakukan adalah mengalikan AH dengan 10 dan menambahkan isi AL dengan hasilkali AH. Hasil pertambahan tersebut akan diletakkan di register AL kemudian AH akan dinolkan.
Mnemonic : AAM (ASCII Adjust For Multiplication) Tersedia pada : 8088 keatas Syntax : AAM
Bilangan 1002h pada AX dibaca sebagai desimal 162 : - AH = 10h = 16 - AL = 02h = 2
Mnemonic : AAS (ASCII Adjust For Subtraction) Tersedia pada : 8088 keatas Syntax : AAS Pengaruh flag : AF, CF Fungsi : Mengatur format bilangan biner/hexa hasil pengurangan ke bentuk BCD. AAS ini berlaku untuk hasil pengurangan yang tidak lebih dari 4 bit. Jika 4 Bit rendah dari AL lebih besar dari 9, maka AL akan dikurangi dengan 6 dan register AH akan dikurangi 1. 4 bit atas register AL akan dijadikan nol sedangkan 4 bit rendahnya akan bernilai 0-9.
Mnemonic : ADC (Add With Carry) Tersedia pada : 8088 keatas Syntax : ADC Tujuan,Sumber Pengaruh flag : OF, SF, ZF, AF, PF Fungsi : Menambahkan "Sumber", "Tujuan" dan Carry Flag (1=on, 0=off), hasilnya diletakkan pada "Tujuan". Intruksi ini biasanya digunakan setelah operasi pada pertambahan atau perkalian yang menyebabkan Carry. Misalkan pertambahan yang melibatkan bilangan yang besar, seperti pada contoh dibawah ini: Contoh: 12345678h + 9ABCDEF0 = ...... Kedua operand di atas berukuran 4 byte. Jelas sudah melebihi kapasitas register. Di sinilah digunakan mnemonic ADC. Contoh:
MOV AX,1234h ; AX = 1234 MOV BX,9ABCh ; BX = 9ABC MOV CX,5678h ; BX = 5678 MOV DX,0DEF0h ; DX = DEF0 ADD CX,DX ; CX = 3568 CF =1 ADC AX,BX ; AX = AX+BX+CF = ACF1 Hasil penjumlahan tertampung di AX:CX yaitu ACF13568h.
Contoh: Contoh: Hexa dari BCD 53 adalah ...
Mnemonic : ADD Bilangan BCD 11 - 5 = ...
MOV AH,05 MOV AL,03 AAD ; AL=0035h yaitu hexa dari BCD 53
MOV AL,11h MOV BL,5h SUB AL,BL ; AX = 000C AAS ; AX = FF06
3
Tersedia pada : 8088 keatas Syntax : ADD Tujuan,Sumber Pengaruh flag : OF, SF, ZF, AF, PF, CF Fungsi : Menambahkan
"Sumber" dan "Tujuan" kemudian hasilnya disimpan pada "Tujuan". Bila hasil penjumlahan tidak tertampung seluruhnya pada "Tujuan", maka CF akan diset 1.
RET ; Pop IP(=0128) Mnemonic : CALL
N_PROC ENDP
Tersedia pada : 8088 keatas Syntax : CALL nama procedure
1FFF:0179 F_PROC PROC FAR ....... .......
Contoh: ADD AX,BX ; Jumlahkan 2 register ADD AL,[350] ; Jumlahkan register dengan isi memori ADD [350],AL ; Jumlahkan isi memory dengan register ADD AH,10h ; Jumlahkan register dengan immediate ADD [350],10h ; Jumlahkan isi memori dengan immediate
Mnemonic : AND Tersedia pada : 8088 keatas Syntax : AND Tujuan,Sumber Pengaruh flag : OF, SF, ZF, PF, CF Fungsi : Melakukan logika AND antara "Tujuan" dan "Sumber". Hasil dari operasi AND diletakkan pada "Tujuan". Instruksi AND umumnya digunakan untuk melihat kondisi suatu bit dengan menolkan bit-bit lainnya.
Pengaruh flag : Tidak ada Fungsi : Melompat dan mengerjakan intruksi pada procedure program. Pada saat instruksi Call diberikan, maka processor akan melakukan :
- PUSH CS ke stack bila procedure yang dipanggil bertipe Far. - PUSH IP ke stack. - Mengganti nilai CS dengan segmen dari procedure bila procedure tersebut bertipe Far. - Mengganti nilai IP dengan offset dari procedure. Lakukan intruksi yang terdapat pada alamat baru(CS:IP) sampai bertemu dengan intruksi RE T, setelah itu: - POP IP - POP CS bila procedure bertipe Far. - Kembali ke program induk/pemanggil.
Contoh: AND AL,00001000b ; AL=0000?000 JZ Nol ; Jika bit ketiga AL=0, maka lompat
Mnemonic : BOUND (Check Bounds Of Array Index) Tersedia pada : 8088 keatas Syntax : BOUND Tujuan,Sumber
Contoh:
1CFE:0125 CALL N_PROC ; Push IP(=0128) ke stack, IP=1066 1CFE:0128 ....... 1CFE:0155 CALL F_PROC ; Push CS(=1CFE)&IP(=0160) ke stack ; CS=1FFF,IP=0179
Pengaruh flag : Tidak ada Fungsi : Untuk memastikan bahwa index array bertanda negatif atau positif masih masuk dalam batas limit yang didefinisikan oleh Double Word blok memory.
1CFE:0160 ....... 1CFE:1066 N_PROC PROC NEAR ....« .......
4
RET ; Pop IP(=0160) & CS(=1CFE) F_PROC ENDP
Mnemonic : CBW (Convert Byte To Word) Tersedia pada : 8088 keatas Syntax : CBW Fungsi : Mengubah isi register AL menjadi AX dengan mengubah isi register AH menjadi 0 bila AL benilai positif atau AH akan bernilai FF bila AL negatif. Contoh: MOV AL,FFh MOV BX,123Fh CBW ; AX = FFFF ADD AX,BX ; AX = 123F + (1) = 123E
Pada bilangan bertanda, angka FFh pada AL adalah -1 bagi Assembler bukannya 255 desimal.
Mnemonic : CLC (Clear Carry Flag) Tersedia pada : 8088 keatas Syntax : CLC Pengaruh flag : CF Fungsi : Membuat carry flag menjadi 0. Contoh: Untuk menjaga agar dalam operasi RCR, rotasi pertamanya yang masuk adalah 0 maka digunakan CLC dahulu. CLC RCR AX,1
Mnemonic : CLD (Clear Direction Flag) Tersedia pada : 8088 keatas Syntax : CLD Pengaruh flag : DF Fungsi : Membuat direction flag berisi 0. Bila direction flag berisi 0 maka pembacaan string akan berlangsung dari memory rendah ke tinggi. Sebaliknya bila direction flag bernilai 1 maka string akan diproses dari memory tinggi ke rendah.
MOV SS,AX STI
operand1,operand2
Mnemonic : CMC (Complement Carry Flag) Tersedia pada : 8088 keatas Syntax : CMC Pengaruh flag : CF Fungsi : Mengubah Carry flag menjadi kebalikan dari isi semulanya, seperti dari 0 menjadi 1 dan sebaliknya. Contoh:
Contoh:
CLD ; Arah Operasi string ke kanan MOV CX,0Fh ; Bandingkan 16 byte dari string REPE CMPSB ; sampai ada satu yang tidak sama
Mnemonic : CLI (Clear Interrupt Flag) Tersedia pada : 8088 keatas Syntax : CLI Pengaruh flag : IF Fungsi : Membuat interrupt flag menjadi 0. Bila IF berisi 0 maka semua interupsi akan diabaikan oleh komputer, kecuali Nonmaskable Interrupt(NMI). Umumnya CLI diberikan pada saat akan dilakukan proses yang fatal, dimana terjadinya interupsi akan menghancurkan proses tersebut.
Pada kebanyakan operasi, Carry flag dijadikan sebagai tanda berhasil atau tidaknya operasi tersebut. Bi asanya Carry flag akan bernilai 0 bila operasi berhasil dan bernilai 1 bila operasi mengalami kegagalan. Dengan menggunakan perintah CMC disertai dengan ADC(pertambahan dengan carry flag), anda dapat memanfaatkannya untuk menghitung banyaknya keberhasilan operasi yang dilakukan, seperti: MOV CX,Counter XOR AX,AX Ulang: PUSH AX
Pengaruh flag : OF, SF, ZF, AF, PF, CF Fungsi : Membandingkan "operand1" dengan "operand2". Adapun cara yang dilakukan adalah dengan mengurangkan "operand1" dengan "operand2" (operand1operand2). "Operand1" dan "operand2" yang dibandingkan harus mempunyai tipe data yang sama, seperti byte dengan byte (AL,AH,BL,BH,..) atau word dengan word (AX,BX,CX,..). Perintah CMP hanya mempengaruhi flags register tanpa merubah isi "operand1" dan "operand2". Contoh: Ulang: CMP CX,AX JE Exit LOOP Ulang
Mnemonic : CMPSB (Compare Strings Byte) Tersedia pada : 8088 keatas
Operasi Syntax : CMPSB POP AX Pengaruh flag : OF, SF, ZF, AF, PF, CF
CMC
Contoh:
ADC AX,0
Kita akan mengubah alamat sebuah stack, dengan mengubah SS dan SP. Selama SS dan SP diubah, interupsi tidak boleh terjadi. Hal ini dikarenakan pada saat terjadi interupsi, register CS, IP dan Flags disimpan pada stack sebagai alamat kembali nantinya.
LOOP Ulang
Pada hasil akhir dari proses ini register AX akan berisi banyaknya operasi yang berhasil dilakukan.
Fungsi : Untuk membandingkan satu byte pada alamat DS:SI dengan ES:D I. Jika direction flag bernilai 1 maka setiap selesai perbandingan register SI dan DI akan ditambah dengan 1, sebaliknya jika direction flag bernilai 0 maka setiap selesai perbandingan register SI dan DI akan dikurang dengan 1.
Mnemonic : CMP (C ompare) MOV AX,AlmStack MOV DX,AlmOffset CLI MOV SP,DX
Tersedia pada : 8088 keatas
Mnemonic : CMPSW (Compare Strings Word)
Syntax : CMP
Tersedia pada : 8088 keatas 5
Tersedian pada : 8088 keatas
besar dari 9 maka AL akan dikurangi dengan 6 dan AF diset menjadi 1, sebaliknya jika 4 bit rendah dari AL lebih kecil atau sama dengan 9 maka AF akan dijadikan 0.
Syntax : DAA
Contoh:
Syntax : CMPSW Pengaruh flag : OF, SF, ZF, AF, PF, CF Fungsi : Untuk membandingkan satu word pada alamat DS:SI dengan ES:DI. Jika direction flag bernilai 1 maka setiap selesai perbandingan register SI dan DI akan ditambah dengan 2, sebaliknya jika direction flag bernilai 0 maka setiap selesai perbandingan register SI dan DI akan dikurang dengan 2.
Mnemonic : CWD (Convert Word To Doubleword) Tersedia pada : 8088 keatas Syntax : CWD Pengaruh flag : Tidak ada Fungsi : Mengubah tipe word(AX) menjadi double word(DX). Bila AX positif maka DX akan berisi 0000, bila AX negatif maka DX berisi FFFF.
Mnemonic : DAA (Decimal Adjust After Addition)
Pengaruh flag : OF, SF, ZF, AF, PF, CF Fungsi : Mengubah hasil penjumlahan 2 bilangan bukan BCD pada register AL menjadi bentuk BCD. Jika 4 bit rendah dari AL lebih besar dari 9 maka AL akan dikurangi dengan 10 dan AF diset menjadi 1, sebaliknya jika 4 bit rendah AL lebih kecil atau sama dengan 9 maka AF akan dijadikan 0. DAA sebenarnya adalah sama dengan AAA kecuali dalam hal bahwa DAA dapat mengatur baik bilangan 8 bit maupun 4 bit pada AL, sementara AAA hanya 4 bit. Contoh:
Bilangan BCD : 27h + 45h = ... Contoh: Anda dapat memanfaatkan fungsi CWD ini untuk mendapatkan bilangan absolute.
MOV AH,45h MOV AL,27h ADD AL,AH ; AL = 6C
Absolut MACRO Bil
Bilangan BCD: 50h - 23h = ...
MOV AX,50h SUB AX,23h ; AX = 002D DAS ; AX = 0027
Mnemonic : DEC (Decrement) Tersedia pada : 8088 keatas Syntax : DEC Tujuan Pengaruh flag : OF, SF, ZF, AF, PF Fungsi : Untuk mengurangi "Tujuan" dengan 1. "Tujuan" dapat berupa register 8 bit, 16 bit, 32 bit maupun memory. Bila anda ingin mengurangi suatu register ataupun memory dengan 1, gunakanlah perintah DEC ini karena selain lebih cepat, perintah DEC juga menggunakan memory lebih sedikit dibandingkan dengan perintah SUB.
DAA ; AL = 72 MOV
Contoh:
TEST AX,10000000b ; Apakah AX negatif? JZ Selesai ; Ya, selesai
Mnemonic : DAS (Decimal Adjust After Substraction)
CWD ;
Tersedia pada : 8088 keatas
XOR AX,DX ; Jadikan positif
Syntax : DAS
SUB AX,DX ;
Pengaruh flag : OF, SF, ZF, AF, PF, CF Fungsi : Mengubah hasil pengurangan 2 bilangan pada AL menjadi bentuk BCD. Jika 4 bit rendah dari AL lebih
Selesai: ENDM
6
Kita dapat mengimplementasikan perintah Loop dengan menggunakan DEC. Di bawah ini kita akan menjumlahkan bilangan BX sampai 1. Misalnya bila BX = 5 maka dijumlahkan 5+4+3+2+1 = ....
XOR AX,AX Loop1 : ADD AX,BX
DEC BX
MOV BX,3
CMP BX,0
DIV BX
JNZ Loop1
CMP AX,0 ; Apakah ada sisa pembagian ?
INTERRUPT 21h - Service 07h
JE Tiga ; Tidak ada sisa , kelipatan 3 Mnemonic : DIV (Divide) Tersedia pada : 8088 keatas Syntax : DIV Sumber
MOV AL,0 Tiga :
Pengaruh flag : OF, SF, ZF, AF, PF, CF Fungsi : Bila "sumber" bertipe 8 bit maka dilakukan pembagian AX dengan "Sumber" (AX / Sumber). Hasil pembagian akan disimpan pada register AL sedangkan sisa pembagian akan disimpan pada regiser AH. Jika "sumber" bertipe 16 bit maka dilakukan pembagian DX:AX dengan "Sumber" (DX:AX / Sumber). Hasil pembagian akan disimpan pada register AX sedangkan sisa pembagian akan disimpan pada regiser DX. Contoh:
Untuk memeriksa apakah suatu bilangan merupakan kelipatan 3 atau bukan,
Direct Character Input Without Echo Fungsi : Untuk membaca masukan 1 karakter dari keyboard. Fungsi ini tidak akan menampilkan karakter yang ditekan pada layar, selain itu penekanan tombol
MOV AL,1 ENDM
Ctrl+Break juga akan diabaikan.
INTERRUPT 21h - Service 01h
Register Input : Register Output :
Read Character With Echo Fungsi : Untuk membaca masukan 1 karakter dari keyboard dan menampilkannya ke layar. Fungsi ini dapat dihentikan oleh penekanan tombol Ctrl+Break.
AH = 07h AL = Kode ASCII
Register Input : Register Output :
Character Input Without Echo Fungsi : Untuk membaca masukan 1 karakter dari keyboard. Fungsi ini tidak akan menampilkan karakter yang ditekan pada layar. Penekanan tombol Ctrl+Break akan menghentikan fungsi ini.
AH = 10h AL = Kode ASCII Catatan : Berbeda dengan fungsi dari BIOS, untuk membaca karakter khusus yang mempunyai kode Extended, anda harus membacanya dua kali dengan fungsi dari DOS ini.
INTERRUPT 21h - Service 08h
Register Input : Register Output : AH = 08h AL = Kode ASCII
anda bisa membaginya dengan tiga. Bila merupakan kelipatan 3, maka sisa pembagian akan 0, sebaliknya jika bukan kelipatan tiga, sis a pembagian tidak akan 0. Macro ini akan menjadikan AL=1 bila bilangan yang ditest merupakan kelipatan tiga dan sebaliknya akan bernilai 0.
INTERRUPT 21h - Service 02h Write Character To Standard Output Fungsi : Untuk mencetak satu buah karakter pada layar. Register Input : Register Output : Tidak ada
INTERRUPT 21h - Service 09h Write String To Standard Output Fungsi : Untuk mencetak string ke layar.
Lipat3 MACRO Bil
AH = 02h
Register Input : Register Output : Tidak ada
MOV AX,Bil
DL = Kode ASCII
AH = 09h
7
DS:DX = String yang diakhiri dengan tanda "$". INTERRUPT 21h - Service 0Ah Input String Fungsi : Untuk mendapatkan masukan string dari keyboard. Register Input : Register Output : AH = 0Ah Buffer terisi DS:DX = Buffer Spesifikasi buffer: - Offset 00 mencatat maksimum karakter yang d apat dimasukkan. - Offset 01 banyaknya masukan dari keyboard yang telah diketikkan. Tombol CR tidak akan dihitung. - Offset 02 keatas, tempat dari string yang diketikkan disimpan. ASM 4 - Akses String Asembly juga mengenal tipe data String, yaitu berupa variabel terstruktur yang merupakan kumpulan dari beberapa karakter. Tipe data String pada assembly ini menyerupai String pada Pascal dan C/C++/Java, dapat d iakses per-huruf seperti mengakses elemen array karakter sesungguhnya. Berikut adalah controh program dengan variabel String : include bantu.mac .model small .code .org 100H var: jmp mulai teks1 db ³Hello World .. $´ teks2 db ³How Green Are You ? .. $´ mulai: clrscr gotoxy 10, 5
gotoxy 10, 5 ; pencetakan string mov ah, 09H mov dx, OFFSET teks2 int 21H int 20H end var Karakteristik String pada Assembly adalah dengan diberikannya penutup ³$´ pada akhir kalimat. Ketentuan ini diberikan sebagai ³end of char´ dari String kita. Apabila ketentuan ini diabaikan, maka String berikutnya akan menjadi bagian dari strin g sebelumnya. Hasil ini dapat diamati pada gambar berikut : Hasil yang didapatkan tidak beraturan, karena string pertama ³Hello World ..´ belum terhenti, digabung dengan string berikutnya, string kedua mengalami kondisi yang sama (dapat dilihat pada baris kedua dari gambar hasil program). Perintah pencetakan yang dipergunakan hampir sama dengan pencetakan karakter, menggunakan service 09H, namun menggunakan Interrrupt DOS, nomor 21H. Register DX berisi alamat string yang akan dicetak, dengan memberikan alamat OFFSET-nya, dengan menuliskannya ³OFFSET teks1 atau ³OFFSET teks2. Bagaimana dengan pemahaman tersebut ? Marilah kita coba untuk memodifikasi program tersebut untuk menunjukkan bahwa tipe data String pada Assembly berupa Array dari karakter. include bantu.mac .model small .code .org 100H
; pencetakan string mov ah, 09H mov dx, OFFSET teks1 int 21H
var: jmp mulai teks1 db ³Hello World .. $´ teks2 db ³How Green Are You ? .. $´
gotoxy 10, 6
mulai: clrscr 8
; pencetakan string mov ah, 09H mov dx, OFFSET teks1 int 21H gotoxy 10, 6 ; pencetakan string mov ah, 09H mov dx, OFFSET teks2 int 21H ; pencetakan array karakter gotoxy 10, 7 writec teks1(1), 07H int 20H end var Hasil dari program adalah mencetak karakter ke dua dari variabel string ³Teks1. Anda amati sekali lagi pada program di atas, ternyata karakter kedua, disebut dengan teks1(1), artinya karakter pertama dimulai dari ³0, karakter kedua adalah ³1 dan seterusnya. Dapat Anda pahami bukan ? ASM 5 - Input String Untuk memasukkan sebuah string sebagai sebuah input pada program assembly, ada 3 (tiga) variabel yang dibutuhkan bagi aktifitasnya. Variabel tersebut adalah : 1. Temporary, digunakan sebagai tempat penampungan sementara data 2. Panjang, menyimpan panjang string hasil inputan 3. Hasil berisi hasil proses input data Untuk lebih jelasnya marilah kita amati program berikut : nclude bantu.MAC .model small .code org 100H var: jmp mulai teks1 db ³Masukkan Kalimat : $´ tmp db 11 ; maksimal input 10 huruf panjang db 0 hasil db 11 dup(?) ; dup (?)
mengkosongkan ruang mulai: clrscr gotoxy 10, 5 write teks1 ; ² input st ring ²± mov ah, 0ah lea dx, tmp ; gunakan variabel temporary int 21h mov BL, panjang ; register BL diisikan panjang string mov hasil [ bx ], ³$´ ; berikan penutup string ³$´ ; ²²²²²²² int 20H end var Kompilasilah program di atas, Anda akan mendapatkan program inputan Kalimat sebanyak 10 huruf. Mengapa hanya 10 huruf ? karena pada variabel ³hasil´ hanya diberikan maksimal ruangan sebanyak 10 ditambah ³$´, jadinya 11 huruf. Buatlah inputan untuk data yang agak banyak, seperti pada contoh tampilan berikut : Penyelesaian untuk programnya adalah sebagai berikut : include bantu.MAC .model small .code org 100H var: jmp mulai teks1 db ³Data Barang $´ teks2 db ³²²²²²²²² ²²²-$´ teks3 db ³Kode Barang : [ ] $´ teks4 db ³Nama : [ ]$´ teks5 db ³Satuan : [ ] $´ teks6 db ³Harga : Rp. [ ] $´ teks7 db ³Stok : [ ] $´ tmp1 db 4 ; maksimal huruf sebanyak 3 p1 db 0 kode db 4 dup(?) ; dup (?) mengkosongkan ruang tmp2 db 11 ; maksimal huruf sebanyak 10 p2 db 0 nama db 11 dup (?)
tmp3 db 7 ; maksimal huruf sebanyak 6 p3 db 0 satuan db 7 dup(?) tmp4 db 6 ; maksimal huruf sebanyak 5 p4 db 0 stok db 6 dup (?) mulai: clrscr gotoxy 10, 5 writes teks1 gotoxy 10,6 writes teks2 gotoxy 10,7 writes teks3 gotoxy 10,8 writes teks4 gotoxy 10,9 writes teks5 gotoxy 10, 10 writes teks6 gotoxy 10, 11 writes teks2
lea dx, tmp4 int 21h mov BL, p4 mov harga[ bx ], ³$´ ; ² input stok ²± gotoxy 28, 11 mov ah, 0ah lea dx, tmp5 int 21h mov BL, p5 mov harga[ bx ], ³$´
; ² input kode ²± gotoxy 28,7 mov ah, 0ah lea dx, tmp1 ; gunakan variabel temporary int 21h mov BL, p1 ; register BL diisikan panjang string mov kode [ bx ], ³$´ ; berikan penutup string ³$´ ; ² input nama ²± gotoxy 28,8 mov ah, 0ah lea dx, tmp2 int 21h mov BL, p2 mov nama[ bx ], ³$´ ; ² input satuan ²± gotoxy 28,9 mov ah, 0ah lea dx,, tmp3 int 21h mov BL, p3 mov satuan [ bx ], ³$´ ; ² input harga ²± gotoxy 32, 10 mov ah, 0ah 9
int 20H end var Oke, selamat mencoba. Materi berikutnya adalah pengujian. ASM 6 - Branching 1 Branching (pencabangan) adalah sebuah kondisi harus dipelajari oleh seorang programmer. Untuk menangani sebuah permasalahan hasil input atau output harus melalui cara ini. Assembly menggunakan cara yang berbeda untuk melakukan proses pengujian pada variabel, baik yang merupakan hasil input maupun hasil proses lain. Buatlah terlebih dahulu program untuk entri data Password berikut ini : Program yang dapat Anda tuliskan adalah sebagai berikut : include bantu.mac .model small .code org 100h var: jmp mulai teks1 db " Private Access $" teks2 db "----------------------------------$" teks3 db " User Name : [ ] $" teks4 db " Password : [ ] $" tmp1 db 10 p1 db 0 user db 10 dup (?) tmp2 db 16 p2 db 0 pass db 16 dup (?) mulai: clrscr
gotoxy 10,5 write teks1 gotoxy 10,6 write teks2 gotoxy 10,7 write teks3 gotoxy 10,8 write teks4 gotoxy 10,9 write teks2 ; --- input user --gotoxy 28, 7 mov ah, 0ah lea dx, tmp1 int 21h mov BL, p1 mov user[ bx ], "$" ; --- input pass --gotoxy 28, 8 mov ah, 0ah lea dx, tmp2 int 21h mov BL, p2 mov pass[ bx ], "$" int 20h end var Pengujian pada Assembly tidaklah rumit, namun memiliki teknik yang berbeda dengan bahasa pemrograman lain. Memiliki sedikit kerumitan, namun harus tetap dapat Anda pahami dengan baik. Pengujian dapat dil akukan dengan menggunakan register ³SI´ dan ³DI³. Tambahan perintah adalah dengan memberikan pembandingan string menggunakan ³cmpsb´ kepanjangan dari ³compares byte³. Berikut pengembangan dari program di atas : include bantu.mac .model small .code org 100h var: jmp mulai teks1 db " Private Access $" teks2 db "----------------------------------$"
teks3 db " User Name : [ ] $" teks4 db " Password : [ ] $"
je benar1 jmp salah
tmp1 db 10 p1 db 0 user db 10 dup (?)
benar1: ;-- uji password -lea si, pass lea di, passb mov cx, 5 ; bandingkan 5 huruf rep cmpsb ; repeat compares byte je benar2 jmp salah
tmp2 db 16 p2 db 0 pass db 16 dup (?) ; -- data user dan password yang benar -userb db "05.30.001" passb db "okedeh$" ; -- pesan benar dan salah - psnbenar db "Hai, Selamat Datang.$" psnsalah db "Maaf, data Anda salah ..$" mulai: clrscr gotoxy 10,5 write teks1 gotoxy 10,6 write teks2 gotoxy 10,7 write teks3 gotoxy 10,8 write teks4 gotoxy 10,9 write teks2 ; --- input user --gotoxy 28, 7 mov ah, 0ah lea dx, tmp1 int 21h mov BL, p1 mov user[ bx ], "$" ; --- input pass --gotoxy 28, 8 mov ah, 0ah lea dx, tmp2 int 21h mov BL, p2 mov pass[ bx ], "$" ; --- pengujian program --lea si, user lea di, userb mov cx, 9 ; bandingkan 9 huruf rep cmpsb ; repeat compares byte 10
benar2: gotoxy 12, 9 write psnbenar jmp akhir salah: gotoxy 12, 9 write psnsalah akhir: int 20h end var Benar, Benar1 dan Salah disebut dengan ³Label³, yaitu pengenal (identifier) yang merujuk pada perintah lanjutan yang berhubungan dengan kondisi program. Satu hal penting yang perlu Anda pahami adalah, pada pemrograman Assembly masih menggunakan teknik lompatan dengan menggunakan ³jmp´ (jump) untuk menuju kondisi yang sesuai. Perintah ³JE´ pada program di atas berarti ³Jump If Equal³, artinya pada saat pengujian terpenuhi atau kondisi benar, maka arah lompatan akan dituju, sedangkan perintah dibawahnya, atau dibawah JE adalah perintah yang akan dilakukan apabila kondisi tidak terpenuhi (false). Kesimpulan : 1. Pengujian harus menggunakan register SI (Source Index) dan DI (Destination Index) 2. Pembandingan String harus menggunakan perintah cmpsb (compares byte) 3. ³JE´ digunakan untuk melompat pada perintah yang sesuai (benar) setelah diuji 4. ³JMP´ adalah perintah lompatan umum pada sebuah label yang diletakkan pada program. 5. Gunakan salah satu dari
³JE´ (Jump If Equal) atau ³JNE´ (Jump if Not Equal) pada program. Oke, selamat belajar program selanjutnya. ASM 7 - Branching 2 Berikutnya kita coba belajar lebih lanjut tentang pengujian pada Assembly, setelah materi sebelumnya kita telah mencoba untuk melakukan pengujian sederhana, berikutnya kita coba pengujian untuk kondisi yang lebih banyak, karena beberapa alternatif yang dimasukkan pada pengujian. Desain layout yang kita siapkan terlebih dahulu adalah sebagai berikut : Entrian data yang akan dimasukkan pada program adalah ³Kode´ untuk Kode Barang dan ³Kd.Suplier´ untuk kode suplier. Anda dapat menyiapkan dulu tampilan program dan program entri datanya. include bantu.mac .model small .code org 100h var: jmp mulai teks1 db " Data Barang $" teks2 db "---------------------------- $" teks3 db " Kode : [ ] $" teks4 db " Nama : $" teks5 db " Satuan : $" teks6 db " Harga : Rp. $" teks7 db " Stok : $" teks8 db "Kd.Suplier : [ ] $" teks9 db " Stok : $" tmp1 db 4 p1 db 0 kode db 4 dup(?) tmp2 db 3 p2 db 0 kodes db 3 dup (?) mulai: clrscr gotoxy 13, 5 write teks1 gotoxy 13, 6 write teks2 gotoxy 13, 7
write teks3 gotoxy 13, 8 write teks4 gotoxy 13, 9 write teks5 gotoxy 13, 10 write teks6 gotoxy 13, 11 write teks7 gotoxy 13, 12 write teks8 gotoxy 13, 13 write teks9 gotoxy 13, 14 write teks2
kode db 4 dup(?) kode1 db "001$" nama1 db "Televisi 21 inch $" satuan1 db "unit$" harga1 db "1.250.000$" stok1 db "20$" kode2 db "002$" nama2 db "DVD Player$" satuan2 db "unit$" harga2 db "350.000$" stok2 db "5$" psnsalah db "Maaf, Kode Tidak Ada !$"
; --- input kode barang --gotoxy 27, 7 mov ah, 0aH lea dx, tmp1 int 21h mov bl, p1 mov kode[bx], "$" ; --- isi kode customer --gotoxy 27, 12 mov ah, 0ah lea dx, tmp2 int 21h mov bl, p2 mov kodes[bx], "$" int 20h end var Setelah proses entri data berakhir, Anda perlahan dapat menambahkan kode yang diuji pada program nantinya. Sebagai bahan latihan, kita tempatkan 2 (dua) kode barang sebagai sumber pengujian. Tambahkan kode tersebut pada bagian ³var´ seperti pada baris program berikut : var: jmp mulai teks1 db " Data Barang $" teks2 db "---------------------------- $" teks3 db " Kode : [ ] $" teks4 db " Nama : $" teks5 db " Satuan : $" teks6 db " Harga : Rp. $" teks7 db " Stok : $" teks8 db "Kd.Suplier : [ ] $" teks9 db " Stok : $"
tmp2 db 3 p2 db 0 kodes db 3 dup (?) kodes1 db "A1$" namas1 db "Ali Kesana$" kodes2 db "D1$" namas2 db "Dini Kesini$" Modifikasi program Anda sebelumnya dengan menggantinya menjadi seperti pada tambahan program yang baru saja kita tuliskan. Berikutnya kita akan menambahkan baris pengujian untuk Kode barang, seperti pada program berikut : mulai: clrscr gotoxy 13, 5 write teks1 gotoxy 13, 6 write teks2 gotoxy 13, 7 write teks3 gotoxy 13, 8 write teks4 gotoxy 13, 9 write teks5 gotoxy 13, 10 write teks6 gotoxy 13, 11 write teks7 gotoxy 13, 12 write teks8 gotoxy 13, 13 write teks9 gotoxy 13, 14 write teks2 ; --- input kode --gotoxy 27, 7 mov ah, 0aH
tmp1 db 4 p1 db 0 11
lea dx, tmp1 int 21h mov bl, p1 mov kode[bx], "$" ; --- pengujian kode1 --lea si, kode lea di, kode1 mov cx, 3 rep cmpsb je benar1 jmp ujilagi benar1: gotoxy 26,8 write nama1 gotoxy 26, 9 write satuan1 gotoxy 30, 10 write harga1 gotoxy 26, 11 write stok1 jmp isikode ujilagi: ; ----- uji kode 2 ----lea si, kode lea di, kode2 mov cx, 3 rep cmpsb je benar2 jmp salah benar2: gotoxy 26,8 write nama2 gotoxy 26, 9 write satuan2 gotoxy 30, 10 write harga2 gotoxy 26, 11 write stok2 jmp isikode salah: gotoxy 28, 6 write psnsalah jmp akhir isikode: ; ----------------------------------gotoxy 27, 12 mov ah, 0ah lea dx, tmp2 int 21h mov bl, p2 mov kodes[bx], "$" ; --- pengujian kode suplier --lea si, kodes lea di, kodes1 mov cx, 2
rep cmpsb je sup1 jmp akhir sup1: gotoxy 26, 13 write namas1 jmp akhir akhir: int 20H end var Setelah memasukkan ³kode´, program akan melakukan pengujian. Jika kode yang dimasukkan sesuai yang diinginkan, atau pengujian bernilai benar, maka program akan melompat (jump) ke label ³benar1. Jika ternyata kode tidak cocok, maka akan dilanjutkan ke pengujian ke-dua, yaitu label ³ujilagi´. Namun apabila sekali lagi kode yang dimasukkan tidak sesuai yang diinginkan, yaitu kode ³001 atau ³002, maka program akan melakukan lompatan ke label ³salah´ dan menuju ke akhir program melalui label ³akhir´. Pada program di atas, pengujian yang diperbolehkan masih menggunakan 1 (satu) kode Suplier, untuk kode yang berikutnya dapat Anda lanjutkan sendiri bukan ? ASM - Daftar Interupsi Daftar Interupsi BIOS Berikut adalah daftar interupsi BIOS yang sering dipergunakan : No. Interrupt Service Number Kegunaan Input Output 10 H 01 H Menentukan Bentuk Kursor AH = 01 H CH = Sel Awal (0-7) CL = Sel Akhir (0-7) Bentuk Kursor baru 10 H 02 H Menentukan Posisi Kursor AH = 02 H BH = No. Hal Layar DH = Baris Kursor DL = Kolom Kursor Kursor di posisi yang baru 10 H 03 H Mengetahui Posisi dan Bentuk Kursor AH = 03 H BH = No. Hal Layar DH = Baris DL = Kolom CH = Sel awal 12
CL = Sel akhir 10 H 05 H Mengaktifkan halaman Layar AH = 05 H AL = No Hal Layar Ganti Halaman Layar 10 H 06 H Hapus layar ke atas AH = 06 H AL = Banyak baris yang dihapus (0 = semua) BH = Warna Layar CH = Baris batas atas CL = Kolom batas atas DH = Baris batas bawah DL = Kolom batas bawah Layar akan terhapus 10 H 07 H Hapus layar ke bawah AH = 07 H AL = Banyak baris yang dihapus (0 = semua) BH = Warna Layar CH = Baris batas atas CL = Kolom batas atas DH = Baris batas bawah DL = Kolom batas bawah Layar akan terhapus 10 H 08 H Mengambil warna dan karakter ASCII di posisi kursor AH = 08 H BH = No. Hal. Layar AL = Kode ASCII AH = Warna karakter 10 H 09 H Menulis karakter dengan warna di posisi kursor AH = 09 H AL = Kode karakter ASCII BH = No. Hal Layar BL = Warna karakter CX = Banyak yang akan dicetak Karakter tertulis di layar 12 H Mengetahui Besar Memory AX = besar memory dalam Kbyte 19 H Melakukan Warm boot Booting Ulang Daftar Interupsi DOS Interupsi DOS diawali dari nomor 20H. Berikut ini daftar interupsi DOS yang sering dipergunakan. No. Interrupt Service No. Kegunaan Input Output 20 H 00 H Mengakhiri program .COM Kembali ke DOS 21 H 01 H Input 1 Karakter (Echo) AH = 01 H AL = Input tercetak di layar 21 H 02 H Output 1 Karakter AH = 02 H
DL = Kode ASCII Karakter tercetak dilayar 21 H 06 H Input 1 Karakter, Output 1 karakter AH = 03 H DH = FF H DL = FF H AL = Kode ASCII AL = Hasil input tampil kode ASCII 21 H 07 H Input 1 karakter tanpa echo tidak mengecek CTRL-C AH = 07 H AL = Kode ASCII hasil input 21 H 08 H Input 1 karakter tanpa echo mengecek CTRL-C AH = 08 H AL = Kode ASCII hasil Input 21 H 09 H Mencetak 1 baris string dan harus diakhiri dengan karakter $ AH = 09 H DS = segment variable yang akan dicetak DX = offset variable yang akan dicetak String tercetak di l ayar 21 H 0A H Input suatu string AH = 0A H DS = Segment Buffer DX = Offset buffer Buffer terisi 21 H 0E H Mengganti drive yang aktif AH = 0E H DL = 00 H (00 H = A, 01 = B, 02 = C) Drive baru aktif 21 H 19 H Mengambil drive yang aktif AH = 19 H D rive aktif 21 H 25 H Set Vector interrupt AH = 25 H AL = No. Interrupt DX = Offset address of new interrupt handler DS = segment address of new interrupt handler 21 H 2A H Mengambil tanggal sistem AH = 2A H CX = Tahun (BCD) DH = Bulan (BCD) DL = Hari (BCD) 21 H 2B H Set tanggal sistem AH = 2B H CX = Tahun DH = Bulan DL = Hari AL = 0 (sukses) AL = FF H (gagal) 21 H 2C H Mengambil waktu sistem AH = 2C H CH = Jam (BCD) CL = Menit (BCD) DH = Detik (BCD) DL = 1/100 detik (BCD)
21 H 2D H Set waktu sistem AH = 2D H CH = Jam CL = Menit DH = Detik DL = 1/100 detik AL = 0 (sukses) AL = FF H (Gagal) 21 H 30 H Mengambil versi DOS AH = 30 H AL = Angka mayor AH = Angka minor BX = CX = 0 21 H 35 H Mengambil Vector Interrupt AH = 35 H AL = Interrupt No. BX = offset address of interrupt handler ES = segment address of intr. handler 21 H 39 H Membuat sub directory AH = 39 H DS = Segment dari nama direktori DX = offset dari nama direktori CF = 0 (sukses) CF = 1 (gagal) AH = kode kesalahan 21 H 3A H Menghapus sub directory AH = 3A H DS = Segment dari nama direktori DX = offset dari nama direktori CF = 0 (sukses) CF = 1 (gagal) AH = kode kesalahan 21 H 3B H Pindah direktory AH = 3B H DS = Segment dari nama direktori DX = offset dari nama direktori CF = 0 (sukses) CF = 1 (gagal) AH = kode kesalahan 21 H 41 H Menghapus sebuah file AH = 41 H DS = Segment dari nama direktori DX = offset dari nama direktori CF = 0 (sukses) CF = 1 (gagal) AH = kode kesalahan 21 H 43 H Mengganti atribut file AH = 43 H DS = Segment dari nama direktori DX = offset dari nama direktori Jika AL = 0 Jika AL = 1 CF = 0 (sukses) 13
CF = 1 (gagal) AH = kode kesalahan CX = atribut file CX = atribut baru 21 H 56 H Mengganti nama file AH = 56 H DS = Segment nama file asal DX = offset nama file asal ES = Segment nama file pengganti DI = Offset nama file pengganti CF = 0 (sukses) CF = 1 (gagal) AL = Kode kesalahan 27 H Terminate and stay resident DX = pointer to last byte of program _________________________ _______________ ASM 8 - Operasi Karakter 1 Setelah mencoba untuk melakukan inputan berupa string dan menguji string seperti pada pertemuan sebelumnya. Materi inputan yang juga perlu kita tilik adalah operasional bagi data µkarakterµ. Bagaimana melakukan inputan dan setelah itu pengujiannya. A. INPUTAN KARAKTER Inputan karakter agak banyak versinya, ada yang inputan tanpa menampilkan (tanpa echo) karakter yang diketikkan keyboard, ada juga yang menampilkannya (with echo). 1. Input µWith-Echo¶ AH = 01H INT 21H AL = 2. Input µNo-Echo¶ AH = 07H INT 21H AL = Implementasi pada program untuk inputan dengan menampilkan huruf yang dimasukkan (with-echo) terdapat pada program berikut : include bantu.mac .model small .code org 100H var: jmp mulai teks1 DB "Enter Sex (M/F) : $"
mulai: clrscr gotoxy 5,5 write teks1 ;-- input char wi th echo -mov ah, 01 int 21H
register ³AL³. B. PENGUJIAN KARAKTER Bagaimana untuk melakukan pengujian pada program inputan karakter yang lebih kompleks ? Anda hanya menggunakan perintah ³CMP´ dan melakukan lompatan (JMP) pada hasil pengujian yang Anda inginkan. Berikut adalah program pengembangan dari sebelumnya. include bantu.mac
ditampilkan pada posisi hasil inputan, seakan user menginputkan string, padahal user memasukkan karakter.
;-- hasil inputan -gotoxy 5, 6 write teks2 writec AL, 07H
; --jika inputan salahwrite Teks4 jmp akhir
Akhir: int 20H end var
Pria: CetakS Teks2 jmp akhir
Tidak terlalu susah bukan ? Anda dapat saja menggunakan inputan dengan echo atau tanpa echo, keduanya akan menghasilkan inputan pada
Wanita: CetakS Teks3
Asm 9 - Operasi Karakter 2 Pada program sebelumnya, terdapat beberapa pengujian untuk jenis kelamin yang berkali-kali untuk kasus huruf besar dan huruf kecil. Bagaimana jika menggunakan huruf ³m´ atau ³M´ untuk ³Male´, dan huruf ³f´ atau ³F´ untuk ³Female´. Masalah tersebut akan menjadi rumit apabila pengujian sangat banyak, karena harus menempatkan jenis pengujian untuk inputan huruf kecil dan besar. Bagaimana mengatasi hal tersebut ? Kita dapat mengatasinya dengan menggunakan varian lompatan pengujian selain ³JE´ dan ³JNE´. Berikut ini adalah keseluruhan varian perintah lompatan pengujian pada assembly. Perintah Arti Equivalent JE Jump if Equal = JNE Jump if Not Equal <> JG Jump if Greater > JGE Jump if Greater or Equal >= JL Jump if Less < JLE Jump if Less or Equal <= Bentuk pengujian tersebut dapat kita manfaatkan untuk kasus pengujian jenis kelamin seperti pada program sebelumnya. Logika yang dapat kita gunakan adalah kita melakukan proses ³uppercase´ artinya jika inputan berupa huruf kecil akan di ³upper´ untuk menjadi huruf besar, yang akhirnya pengujian akan lebih sederhana, hanya menggunakan huruf besar. Berikut adalah implementasinya dalam program. include bantu.mac
Akhir: int 20H end var Hasil pengujian akan
.model small .code org 100H
int 20H end var Hasil kompilasi pada program di atas adalah : Untuk mencoba inputan tanpa echo (no-echo) dapat Anda rubah nomor service pada register AH dengan ³07H´ atau ³07, hasil program akan tampak di bawah ini : Seperti petunjuk telah disampaikan sebelumnya, hasil inputan tersimpan pada register ³AL³, jadi Anda dapat mencetaknya sendiri hasil tersebut, seperti pada program di bawah ini. include bantu.mac .model small .code org 100H var: jmp mulai teks1 DB "Enter Sex (M/F) : $" teks2 DB "Returning value : $" mulai: clrscr gotoxy 5,5 write teks1 ;-- input char -mov ah, 07 int 21H
.model small .code org 100H var: jmp mulai teks1 DB "Enter Sex (M/F) : $" teks2 DB "Male $" teks3 DB "Female $" teks4 DB "XXX $" mulai: clrscr gotoxy 5,20 write teks1 ;--input char-mov ah, 07h int 21h ;--pengujian char-cmp AL, "m" je Pria cmp AL, "M" je Pria cmp AL, "f" je Wanita cmp AL, "F" je Wanita
14
var: jmp mulai teks1 DB "Enter Sex (M/F) : $" teks2 DB "Male $" teks3 DB "Female $" teks4 DB "XXX $" mulai: clrscr gotoxy 5,20 write teks1 ;--input char-mov ah, 07h int 21h ;--pengujian char-cmp AL, "a" jge ujilagi jmp besar ujilagi: cmp AL, "z" jle upper jmp salah upper: sub AL, 32 besar: cmp AL, "M" je Pria cmp AL, "F" je Wanita salah: write Teks4 jmp akhir Pria: write Teks2 jmp akhir Wanita: write Teks3 Akhir: int 20H end var Penjelasan : 1. Kode ASCII untuk huruf ³A´ adalah 65, sedangkan untuk ³a´ adalah 97 2. Pada program di atas terdapat pengujian cmp AL, ³a´, artinya kita bandin gkan dulu hasil inputan dengan huruf ³a´, jika cocok program akan berlanjut ke ujilagi, yaitu untuk melakukan pengujian lanjutan cmp AL, ³z´. Apakah diantara ³a´ dan ³z´ ? mungkin seperti itulah kesimpulan dari kedua program tersebut. 3. Jika ³ya´, maka program
akan ke uppercase, fungsinya untuk diperbesar kode ASCIInya, kita tambahkan 32 (sub AL, 32) 4. Setelah itu akan menuju pada label ³besar´, dan melakukan pengujian dengan huruf besar semua, apakah sama dengan ³F´ atau ³M³ 5. Apa yang terjadi ji ka yang dimasukkan adalah huruf besar ? Otomatis pada saat pengujian cmp AL, ³A´ akan melompat ke label ³besar³. Asm 10 - Looping 1 Aplikasi yang kita buat masih belum lengkap jika belum mengenal Looping atau perulangan. Kadang beberapa perintah perlu dil akukan perulangan untuk melakukan sebuah operasional yang tidak mungkin atau tidak perlu ditulis secara manual secara programming biasa. Sebagai contoh kasus adalah pencetakan angka 1 sampai 10, tidak mungkin melakukan perintah pencetakan sebanyak 10 kali, yaitu dengan menuliskan perintah cetak secara manual sebanyak 10 kali. Dengan looping kia dapat melakukannya hanya dengan menuliskan program 1 kali, namun diulang sebanyak yang kita inginkan, bisa 10 atau bahkan 100 kali. Salah satu perintah perulangan yang kita pelajari pada materi ini adalah ³LOOP³. Perulangan dengan ³Loop´ akan melakukan perulangan sesuai nilai yang dituliskan pada register CX. Tentukan nilai pada CX dan program akan berulang sebanyak nilai tersebut. include bantu.mac .model small .code org 100h
mov cx, 5 mutar: gotoxy kol, 5 writec "a", 07H inc kol loop mutar int 20h end var Hasil yang diperoleh pada program di atas adalah : Penjelasan source rogram : 1. Kita membutuhkan variabel ³kol³, yang diberi nilai awal 20, digunakan untuk menentukan nilai awal pencetakan hasil program 2. Banyaknya perulangan sebanyak 5 kali, letakkan pada register CX, perintah program ³MOV CX, 5 3. Buat label ³mutar´ yang dipergunakan untuk melakukan perulangan 4. Lakukan pencetakan huruf ³a´ dengan warna karakter ³07H´ 5. Tambahkan nilai pada variabel kol, gunakan perintah ³inc´ (increment), yang akan menambahkan nilai secara bertahap 1 tingkat. 6. Ulang baris program pencetakan, gunakan perintah ³Loop Mutar³ ²²²²²²²²²± Pengembangan berikutnya adalah kita mencoba untuk mencetak secara vertikal, selain itu huruf yang dicetak juga meningkat 1 huruf. Silahkan mengamati pada program berikut : include bantu.mac .model small .code org 100h var: jmp mulai baris db 5 huruf db "a" mulai: clrscr mov cx, 5
var: jmp mulai kol db 20 mulai: clrscr 15
mutar: gotoxy 20, baris writec huruf, 07H
inc baris inc huruf loop mutar int 20h end var Hasil program adalah : Penjelasan source program : 1. Variabel yang dibutuhkan bertambah, karena terdapat perubahan nilai pada baris dan huruf, oleh karena itu dibuatlah variabel ³baris´ dan ³huruf³ 2. Banyaknya perulangan 5 kali, dituliskan pada register CX 3. Buat label ³mutar³ 4. Naikkan nilai pada baris dan huruf, gunakan perintah ³inc´ atau increment 5. Lakukan perulangan dengan menuliskan ³loop mutar³ Baiklah kita akhiri dulu sessi kali ini, untuk perulangan lebih lanjut dapat menuju pada materi berikutnya. Asm 11a - Mencetak Angka Permasalahan lain yang dihadapi para pemrogram assembly adalah pencetakan angka ke layar. Kondisi kerumitan muncul karena pada assembly tidak terdapat nomor interupsi untuk melakukan pencetakan deretan angka. Pilihan yang ada hanyalah pencetakan untuk karakter dan string. Pencetakan karakter dapat menggunakan Interupsi 10H dengan service 09, selain itu juga dapat menggunakan Interupsi 21H dengan service 02. Untuk pencetakan string hanya menggunakan satu interupsi saja, yaitu Interupsi 21H layanan 09. Apa yang harus kita lakukan untuk pencetakan Angka ? berikut adalah sedikit trik yang dapat dilakukan pada pemrograman assembly. .model small .code org 100h var: jmp mulai
angka dw 1234 mulai: mov ax, angka ; masukkan isi angka ke ax mov bx, 10 ; pembagi mov cx, 0 ; kosongkan cx ulang: mov dx, 0 ; kosongkan dx agar tidak menjadi pembagi div bx ; pembagian ax/bx push dx ; masukkan hasil pembagian pada dx inc cx ; mengetahui berapa kali looping terjadi cmp ax, 0 ; membandingkan ax jne ulang ; kondisi salah, ulang sekali lagi cetak: pop dx ; keluarkan dx dari stack add dl, '0' ; konversikan ke dalam char mov ah, 02 ; pencetakan int 21H loop cetak ; ulang terus sampai nilai CX=0 int 20h end var Langkah yang dapat kita lakukan hanyalah menggunakan trik untuk melakukan proses pencetakan tersebut. Logika yang dapat diterapkan pada program tersebut adalah sebagai berikut : 1. Isikan register AX dengan angka yang akan dicetak, BX diisi dengan nilai pembagi, yaitu 10. Register CX dikosongkan. 2. Kosongkan DX untuk menampung hasil pembagi 3. Lakukan pembagian pada AX dengan BX, terus-menerus sampai AX=0. Melakukan pembagian secara terus-menerus dengan pembagi 10 ini, digunakan untuk mendapatkan angka satuan. 4. Hasil angka satuan nantinya dimasukkan ke dalam stack, dengan melakukan PUSH DX 5. Proses pencetakan dimulai dari mengeluarkan isi register DX dengan perintah POP, dan lakukan penambahan pada DL, 16
karena DL harus berisi kode ASCII karakter yang akan dicetak. 6. Lakukan pencetakan berulang-ulang sebanyak CX yang diulang pada looping sebelumnya. Berikutnya Anda dapat membuatnya beberapa perintah tersebut menjadi MACRO, agar dapat dipanggil suatu saat pada program tanpa mempedulikan rincian program yang ada. Letakkan pada file ³Bantu.MAC´, sehingga file berisi Macro tersebut akan semakin lengkap fungsifungsinya dan berdayaguna. WriteA MACRO angka LOCAL ulang, cetak push push push push
ax bx cx dx
mov ax, angka ; masukkan isi angka ke ax mov bx, 10 ; pembagi mov cx, 0 ; kosongkan cx ulang: mov dx, 0 ; kosongkan dx agar tidak menjadi pembagi div bx ; pembagian ax/bx push dx ; masukkan hasil pembagian pada dx inc cx ; mengetahui berapa kali looping terjadi cmp ax, 0 ; membandingkan ax jne ulang ; kondisi salah, ulang sekali lagi cetak: pop dx ; keluarkan dx dari stack add dl, '0' ; konversikan ke dalam char mov ah, 02 ; pencetakan int 21H loop cetak ; ulang terus sampai nilai CX=0 pop dx pop cx pop bx pop ax ENDM Anda dapa melakukan pemanggilannya dalam
program akan tampak dengan lebih sederhana, seperti pada program berikut : include bantu.MAC
org 100h
.model small .code org 100h
mulai: clrscr
var: jmp mulai angka dw 1234 mulai: Clrscr Gotoxy 20, 5 WriteA angka int 20H end var
Asm 11b - Operasi Matematik Setelah membuat pencetakan untuk angka, langkah berikutnya adalah mempelajari operasional perhitungan matematik. mengapa harus membuat pencetakan angka terlebih dahulu ? dikarenakan hasil dari operasional matematik nantinya tidak akan dapat dicetak, karena kendala pada assembly adalah pencetakan untuk angka lebih dari 1 digit, hanya disediakan interupsi untuk pencetakan string dan pencetakan karakter. Jika Anda belum mendapatkan langkah untuk melakukan pencetakan angka, maka ada baiknya Anda buat terlebih dahulu MACRO pencetakan angka-nya dan mengamati cara kerja dari sub-rutin tersebut. Operasional matematik pada assembly dapat dilakukan dengan mudah, berikut langkah-langkahnya : 1. Operasi Penjumlahan Penjumlahan pada assembly dilakukan dengan 2 (dua) statement, yaitu : ADD dan INC. Statement ADD merupakan singkatan dari addition, sedangkan INC singkatan dari increment. include bantu.mac .model small .code
var: jmp mulai angka dw 0
; -- menggunakan add -gotoxy 10, 5 mov angka, 137 add angka, 5 writea angka ; -- menggunakan inc -gotoxy 10, 6 mov angka, 137 inc angka writea angka int 20h end var 2. Hasil pada program di atas adalah : 3. Operasi Pengurangan Seperti pada penjumlahan, operasional matematik pengurangan j uga dilakukan dengan 2 (dua) statement, yaitu SUB yang berarti substraction dan DEC yang berarti decrement. include bantu.mac .model small .code org 100h var: jmp mulai angka dw 0 mulai: clrscr ; -- menggunakan sub -gotoxy 10, 5 mov angka, 137 sub angka, 10 writea angka ; -- menggunakan dec -gotoxy 10, 6 mov angka, 137 dec angka writea angka int 20h end var 4. Hasil dari program di atas adalah :
17
5. Operasi Perkalian Untuk operasi perkalian, assembly juga menggunakan perintah ³MUL´ yang berarti multiply. include bantu.mac .model small .code org 100h var: jmp mulai angka dw 0 mulai: clrscr ; -- operasional perkalian 1 -gotoxy 10, 5 mov angka, 5 mov ax, angka mov bx, 3 mul bx writea ax ; -- operasional perkalian 2 -gotoxy 10, 6 mov ax, 5 mov bx, 3 mul bx writea ax int 20h end var 6. Hasil pada kedua bagian program di atas adalah sama, yaitu ³15, seperti pada gambar berikut : Satu hal yang penting untuk dipahami pada operasional perkalian adalah nilai yang dihitung adalah perkalian antara register AX dan register BX. Operasional perkalian nantinya akan menghasilkan angka yang juga disimpan pada register AX. 7. Operasi Pembagian Operasional matematik berikutnya yang tidak kalah pentingnya adalah pembagian. Statement untuk melakukan operasional pembagian adalah dengan menggunakan ³DIV´ yang merupakan singkatan dari DIVIDE. include bantu.mac .model small .code
org 100h mulai: clrscr ; -- operasional pembagian -gotoxy 10, 5 mov dx, 0 mov ax, 300 mov bx, 100 div bx writea ax int 20h end mulai 8. Hasil dari operasional program di atas adalah : Kondisi yang sama ternyata juga menimpa operasional pembagian. Data yang akan dibagi diletakkan pada register AX dan hasil pembagian juga diletakkan pada register AX. 9. Namun ada satu hal lain yang juga patut Anda pahami. Mengapa register DX pada awal operasional harus dikosongkan ? Cobalah baris program ³MOV DX, 0 untuk sementara Anda non-aktifkan, hasil program akan mengalami kesalahan seperti berikut : Register DX ternyata harus dikosongkan, agar tidak menjadi pembagi pada operasional DIV tersebut.
18