Senin, 30 November 2009

tutorial praktek assembly

MEMBUAT PROGRAM COM


MODEL PROGRAM COM
Program .COM hanya menggunakan 1 segment dan bisa anda buat dengan 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


Supaya lebih jelas bentuk dari program ideal, marilah kita telusuri lebih lanjut dari bentuk program ini.


.MODEL SMALL
Tanda directive ini digunakan untuk memberitahukan kepada assembler bentuk memory yang digunakan oleh program kita. Supaya lebih jelas model-model 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 dibuat digunakan model SMALL dan bukannya TINY ? Hal ini disebabkan karena banyak dari compiler bahasa tingkat tinggi yang tidak bisa berkomunikasi dengan model TINY, sehingga kita menggunakan model SMALL sebagai pemecahannya.


.CODE
Tanda directive ini digunakan untuk memberitahukan kepada assembler bahwa kita akan mulai menggunakan Code Segment-nya disini. Code segment ini digunakan untuk menyimpan program yang nantinya akan dijalankan.


ORG 100h
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 syntaxnya 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 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


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.

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).


MODEL PROGRAM EXE
Pada program COM, kita tidak perlu mendefinisikan tempat tertentu untuk segment DATA 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 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

.STACK 200h

.DATA

+--------------+

Tempat

Data Program

+--------------+

.CODE

Label1:

MOV AX,@DATA

MOV DS,AX

+---------------+

Tempat
Program

+---------------+

MOV AX,4C00h

INT 21h

END Label1



----------------------------------------------------------

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.

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 secara manual agar menunjuk pada segment data melalui perintah:

MOV AX,@DATA
MOV DS,AX

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.


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 juga 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.

Contoh:

Bilangan BCD 8 + 6 = ...

MOV AL,8h
MOV AH,6h
ADD AL,AH ; AX = 060Eh
AAA ; AX = 0704h

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.

Contoh:

Hexa dari BCD 53 adalah ...

MOV AH,05
MOV AL,03
AAD ; AL=0035h yaitu hexa dari BCD 53


Mnemonic : AAM (ASCII Adjust For Multiplication)

Tersedia pada : 8088 keatas
Syntax : AAM

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:

Bilangan BCD ; 12 * 9 = ...

MOV AL,12h
MOV BL,09h
MUL BL ; AX = 00A2h
AAM ; AX = 1002h

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.

Contoh:

Bilangan BCD 11 - 5 = ...

MOV AL,11h
MOV BL,5h
SUB AL,BL ; AX = 000C
AAS ; AX = FF06


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.


Mnemonic : ADD

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.

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.

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

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.


Mnemonic : CALL

Tersedia pada : 8088 keatas
Syntax : CALL nama-procedure

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 RET, setelah itu:

- POP IP
- POP CS bila procedure bertipe Far.

- Kembali ke program induk/pemanggil.


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

1CFE:0160 .......
1CFE:1066 N_PROC PROC NEAR
....…
.......

RET ; Pop IP(=0128)

N_PROC ENDP

1FFF:0179 F_PROC PROC FAR
.......
.......

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.

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.

Contoh:

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.

MOV AX,AlmStack
MOV DX,AlmOffset
CLI
MOV SP,DX
MOV SS,AX
STI


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:

Pada kebanyakan operasi, Carry flag dijadikan sebagai tanda berhasil atau tidaknya operasi tersebut. Biasanya 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

Operasi

POP AX

CMC

ADC AX,0

LOOP Ulang


Pada hasil akhir dari proses ini register AX akan berisi banyaknya operasi yang berhasil dilakukan.



Mnemonic : CMP (Compare)

Tersedia pada : 8088 keatas

Syntax : CMP operand1,operand2

Pengaruh flag : OF, SF, ZF, AF, PF, CF
Fungsi : Membandingkan "operand1" dengan "operand2". Adapun cara yang dilakukan adalah dengan mengurangkan "operand1" dengan "operand2" (operand1- operand2). "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

Syntax : CMPSB

Pengaruh flag : OF, SF, ZF, AF, PF, CF

Fungsi : Untuk membandingkan satu byte pada alamat DS:SI dengan ES:DI.
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 : CMPSW (Compare Strings Word)

Tersedia pada : 8088 keatas

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.



Contoh:
Anda dapat memanfaatkan fungsi CWD ini untuk mendapatkan bilangan absolute.


Absolut MACRO Bil

MOV

TEST AX,10000000b ; Apakah AX negatif?

JZ Selesai ; Ya, selesai

CWD ;

XOR AX,DX ; Jadikan positif

SUB AX,DX ;

Selesai:

ENDM



Mnemonic : DAA (Decimal Adjust After Addition)

Tersedian pada : 8088 keatas

Syntax : DAA

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 = ...



MOV AH,45h

MOV AL,27h

ADD AL,AH ; AL = 6C

DAA ; AL = 72




Mnemonic : DAS (Decimal Adjust After Substraction)

Tersedia pada : 8088 keatas

Syntax : DAS

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 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.

Contoh:



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.

Contoh:


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

CMP BX,0

JNZ Loop1




Mnemonic : DIV (Divide)
Tersedia pada : 8088 keatas
Syntax : DIV Sumber

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,


anda bisa membaginya dengan tiga. Bila merupakan kelipatan 3, maka sisa pembagian akan 0, sebaliknya jika bukan kelipatan tiga, sisa pembagian tidak akan 0. Macro ini akan menjadikan AL=1 bila bilangan yang ditest merupakan kelipatan tiga dan sebaliknya akan bernilai 0.



Lipat3 MACRO Bil

MOV AX,Bil

MOV BX,3

DIV BX

CMP AX,0 ; Apakah ada sisa pembagian ?

JE Tiga ; Tidak ada sisa , kelipatan 3

MOV AL,0

Tiga :

MOV AL,1

ENDM

INTERRUPT 21h - Service 01h

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.

Register Input : Register Output :

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 02h

Write Character To Standard Output

Fungsi : Untuk mencetak satu buah karakter pada layar.

Register Input : Register Output : Tidak ada

AH = 02h

DL = Kode ASCII



INTERRUPT 21h - Service 07h

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

Ctrl+Break juga akan diabaikan.

Register Input : Register Output :

AH = 07h AL = Kode ASCII




INTERRUPT 21h - Service 08h

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.

Register Input : Register Output :

AH = 08h AL = Kode ASCII




INTERRUPT 21h - Service 09h

Write String To Standard Output

Fungsi : Untuk mencetak string ke layar.

Register Input : Register Output : Tidak ada

AH = 09h

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 dapat 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 diakses 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

; 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

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 string 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

var: jmp mulai
teks1 db “Hello World .. $”
teks2 db “How Green Are You ? .. $”

mulai: clrscr
gotoxy 10, 5

; 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 string —–
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

; — 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
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 ], “$”

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 dilakukan 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 : [ ] $"

tmp1 db 10
p1 db 0
user db 10 dup (?)

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
je benar1
jmp salah

benar1: ;-- uji password --
lea si, pass
lea di, passb
mov cx, 5 ; bandingkan 5 huruf
rep cmpsb ; repeat compares byte
je benar2
jmp salah

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

; --- 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 : $"

tmp1 db 4
p1 db 0
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 !$"

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
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
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 layar
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 Drive 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)
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 with echo --
mov ah, 01
int 21H

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

;-- hasil inputan --
gotoxy 5, 6
write teks2
writec AL, 07H

Akhir: int 20H
end var

Tidak terlalu susah bukan ? Anda dapat saja menggunakan inputan dengan echo atau tanpa echo, keduanya akan menghasilkan inputan pada 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

.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

; --jika inputan salah-
write Teks4
jmp akhir

Pria: CetakS Teks2
jmp akhir

Wanita: CetakS Teks3

Akhir: int 20H
end var
Hasil pengujian akan ditampilkan pada posisi hasil inputan, seakan user menginputkan string, padahal user memasukkan karakter.


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

.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, "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 bandingkan 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 ASCII-nya, 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 jika 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 dilakukan 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

var: jmp mulai
kol db 20

mulai: clrscr
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

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, 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 fungsi-fungsinya dan berdayaguna.
WriteA MACRO angka
LOCAL ulang, cetak

push ax
push bx
push cx
push 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

.model small
.code
org 100h

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
org 100h

var: jmp mulai
angka dw 0

mulai: clrscr

; -- 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 juga 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 :

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.

Tidak ada komentar:

Posting Komentar