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.

modul bahasa asembly

PENGENALAN DEBUG DALAM ASSEMBLER

 Register
Untuk mempelajari bahasa assembler, anda harus menghafalkan semua register dan mengerti apa kegunaannya, karena anda akan selalu berhubungan dengan register – register tersebut. Register adalah sebagian kecil memory komputer yang dipakai untuk tempat penampungan data dengan ketentuan bahwa data yang terdapat dalam register dapat diproses dalam berbagai operasi dengan melihat berapa besar kemampuan menampung register tersebut.
Secara umum register dapat dibagi dalam lima golongan yaitu :
1. General Purpose Register
1.1 Register AX
Register AX merupakan register aritmatika karena register ini selalu dipakai dalam operasi pertambahan,pengurangan,perkalian dan pembagian
1.2 Register BX
Register BX merupakan salah satu dari dua register base addressing mode, yang dapat mengambil atau menulis langsung dari/ke memory
1.3 Register CX
Register CX merupakan suatu counter untuk meletakan jumlah lompatan pada loop-loop yang anda lakukan
1.4 Register DX
Register DX merupakan register yang mempunyai tugas:
• Membantu AX dalamoperasi perkalian pembagian
• DX meruapakan register offset dari DS
• Menunjukkan no. port pada operasi port.
2. Segment Register
2.1 Register CS : Code Segment Register
2.2 Register DS : Data Segment Register
2.3 Register SS : Stack Segment Register
2.4 Register ES : Extra Segment Register
3. Pointer Register
3.1 IP : Instruction Pointer Register
Instruction Pointer berfungsi sebagai tempat menyimpan alamat dari kode yang akan dieksekusi selanjutnya oleh mikroprosesor. Dalam kerjanya IP bekerja dengan code segmen (CS) untuk menghasilkan alamat relative dari suatu instruksi.
3.2 SP : Stack Pointer Register
3.3 BP: Base Pointer Register
4. Index Register
4.1 SI : Source Index Register
4.2 DI : Destination Index Register
5. Flag Register

 Program Debug
Untuk menjalankan utility DEBUG, anda cukup mengetik DEBUG dari prompt. Sedang bila ingin membuka sebuah file langsung untuk dioperasikan DEBUG, anda cukup menambahkan nama file itu sebagai command tail. Contohnya :
A> DEBUG AGUS.COM
1. Perintah Debug
a. Q (Quit)
Bila anda mengetikan huruf Q dan menekan enter, maka akan segera kembali ke dos prompt.
b. H (Hexa)
Perintah Hexa adalah perintah yang melaksanakan penjumlahan dan pengurangan terhadap dua bilangan Hexa. Bentuk umum instruksi adalah H operand1,operand2
c. R (Register)
Perintah R digunakan untuk mengetahui isi masing-masing register pada saat mengetik R dan menekan enter
d. A (Assembler)
Perintah Assembler berguna untuk tempat menulis program Assembler.
-A100
0FD8:100
e. N (Name)
Perintah ini digunakan untuk memberi nama suatu program assembler
f. RCX (Register CX)
Perintah ini digunakan untuk mengetahui dan memperbaruhi isi register CX yang merupakan tempat penampungan panjang program yang sedan aktif
g. RIP (Register IP)
Perintah ini digunakan untuk memberitahu komputer untuk memulai memproses program dari titik tertentu.
h. W (Write)
Perintah ini digunakan untuk menulis/ menyimpan program
i. G (Go)
Perintah ini digunakan untuk menjalankan suatu program
j. T (Trace)
Perintah ini digunakan untuk memproses sebaris program saja.
k. U (Unassemble)
Perintah ini digunakan untuk melihat listing program yang sedang aktif.

2. Perintah Dasar Assembler
a. MOV
Perintah MOV adalah perintah untuk mengisi, memindahkan, memperbaruhi isi suatu register, variable ataupun lokasi memory
Adapun tata penulisan perintah MOV adalah :
MOV [operand A], [Operand B]
Contoh :
MOV AH,02
Operand A adalah Register AH
Operand B adalah bilangan 02
Hal yang dilakukan oleh komputer untuk perintah diatas adalah memasukan 02 ke register AH.
b. INT (Interrupt)
Bila anda pernah belajar BASIC, maka pasti anda tidak asing lagi dengan perintah GOSUB. Perintah INT juga mempunyai cara kerja yang sama dengan GOSUB, hanya saja subroutine yang dipanggil telah disediakan oleh memory komputer yang terdiri 2 jenis yaitu :

- Bios Interrupt ( interput yang disediakan oleh BIOS (INT 0 – INT 1F))
- Dos Interrupt ( Interrupt yang disediakan oleh DOS (INT 1F – keatas))
 Contoh Program Sederhana
- A100
0FD8:0100 MOV AH,02
0FD8:0102 MOV DL,41
0FD8:0104 INT 21
0FD8:0106 INT 20
0FD8:0108
- Jika sudah Ketikan perintah G ( Go ) maka akan tampil huruf A
- Cara menyimpan program :
- RIP
IP 102
: 100 - diisi
- RCX
CX 0000
: 8 --> diisi ( panjangnya program)
- N Coba.Com memberi nama program
- W Menulis program


LOOPING DAN STACK
 Looping
Dalam Assembler perintah untuk melakukan perulangan digunakan perintah LOOP. Yang mempunyai tata penulisan sebagai berikut :
Loop [lokasi memory]
Adapun syarat lain untuk operasi Loop adalah harus mengisi register CX untuk setiap kali pengulangan. Coba anda lihat contoh program looping dibawah ini :

MOV CX,05
:0103 MOV AH,02
MOV DL,41
INT 21
LOOP 0103
INT 20

Jika program diatas dijalankan maka akan terjadi perulangan sebanyak lima kali. Hal ini karena isi dari register CX adalah 5 dan program akan looping ke memory segment 0103 yaitu tempat yang berisikan perintah MOV AH,02


Untuk setiap kali looping komputer akan mengurangi isi register CX satu sampai dengan CX menunjukan nol dan komputer akan melanjutkan ke baris berikutnya dibawah loop. Jika anda meletakan Loop ke tempat MOV CX,05 maka hasil running program tidak akan berhenti.
 Stack
Secara umum stack adalah tempat peletakan sementara isi register. Stack pada file.COM terdapat di akhir segment dan ketika pertama kali dijalankan program penunjuk stack (SP) akan langsung ke byte terakhir dari segment.
Operasi Stack mempunyai dua fungsi yaitu fungsi untuk memasukan isi suatu register/variable ke dalam stack dan mengeluarkan isi register / variable dari Stack. Adapun perintah untuk memasukan isi register pada stack adalah perintah PUSH dengan tata penulisannya adalah :
PUSH [operand 16 bit]
Perintah lain untuk operasi stack adalah perintah yang berguna untuk mengeluarkan isi dari register/variable dari stack digunakan perintah POP dengan tata penulisannya adalah :
POP [operand 16 bit]
Untuk lebih jelasnya bisa anda perhatika program dibawah ini :
MOV CX,009 ;9 baris
MOV DL,31 ;angka 1
MOV AH,02
INT 21
PUSH DX
PUSH CX
MOV CX,001A ;26 kolom
MOV DL,61 ;cetak huruf a
INT 21
INC DL ; a jadi b
LOOP 0110
MOV DL,0D ;
INT 21
MOV DL,0A
INT 21
POP CX
POP DX
INC DL
LOOP 0107
INT 20








Pada baris kelima dan keenam terlihat bahwa anda melakukan operasi penyimpanan register ke stack dan pada baris keenambelas anda mengambil isi stack menggunakan perintah POP. Bila anda menggambarkan stack pada akhir segment. Anda dapat menunjukan bahwa ketika anda melakukan push terhadap register DX yang seandainya berisikan bilanagan 0021 H maka pada stack akan terlihat :
0000
0100

Penunjuk(SP)
FFFD
FFFF

Pada saat perintah PUSH CX dengan register CX berisikan angka 0009, maka akan terlihat di Stack :

0000
0100

Penunjuk(SP) FFFB
FFFD
FFFF

Pada saat perintah POP CX, keadaan stack akan kembali lagi pada saat tampilan stack yang pertama. Dari pembayangan diatas dapat disimpulkan bahwa pada operasi stack yang pertama masuk ke stack adalah yang terakhir keluar dari stack dan yang terakhir masuk ke stack, maka pertama yang keluar dari stack ( LIFO).
PENGENALAN TASM DAN OPERASI ARITMATIKA

 Program Tanpa Debug
Selain kita bisa menggunakan DEBUG.COM dalam membuat program assembler kita juga bisa membuat program assembler tanpa menggunakan DEBUG.COM, dimana untuk keperluan itu diperlukan beberapa program yaitu :
- Text Editor
Text editor ini digunakan untuk membuat/menulis program assembler. Adapun contoh dari editor ini adalah SideKick , Notepad, Norton Editor, dll.
- Compiler
Yang dimaksud dengan Compiler adalah suatu program yang menterjemahkan program assembler dalam ASCII file ke bentuk file object, dalam assembler kita gunakan TASM. Contohnya :
TASM CETAK.ASM CETAK.OBJ
- Linker
Yang dimaksud dengan Linker adalah suatu program yang menterjemahkan program object ke bentuk file eksekusi (berextension .COM atau . EXE), dalam assembler kita gunakan TLINK. Contohnya :
TLINK /T CETAK
 Struktur Program Dalam TASM

Secara umum struktur penulisan suatu segment dapat dilukiskan sebagai berikut :
[nama segment] segment
ASSUME CS:[segment] DS:[segment] SS:[segment] ES:[segment]
Org 100H
[label] :
-
Program Assemblernya
-
[nama segment] ends
End [label]
Contohnya :
.MODEL SMALL
.CODE
ORG 100H
Start : Mov CX,05
Mov DL,41H
Label1 : Mov Ah,02H
Int 21H
Inc DL
Loop label1
Int 20H
End Start
Setelah program diatas dicompile dengan menggunakan TASM dan dilinker menggunkan TLINK /T , kemudian untuk menjalankan programnya kita tinggal mengetikan nama filenya saja. Contohnya : CETAK
 Operasi Aritmatika
Dalam Assembler operasi aritmatika yang dibahas adalah operasi pertambahan , pengurangan, perkalian dan pembagian.
- Operasi Pertambahan
• Pertambahan dengan 1
Adapun perintah untuk pertambahan dengan 1 dalam assemblera adalah INC, dengan tata penulisan perintah INC adalah :
INC [Register/Variable]
Contoh programnya :
MOV CX,05
MOV DL,41
# MOV AH,02
INT 21
INC DL
LOOP #
INT 20
• Pertambahan Selain 1
Perintah yang digunakan untk pertambahan selain 1 dalam assembler yaitu ADD, dengan tata penulisan perintah ADD adalah:
ADD [operand1],[operand2]


- Operasi Pengurangan
• Pengurangan Dengan Satu
Perintah yang digunakan untuk penguarangan satu ini adalah perintah DEC, jika kita tulis biasa sama dengan A = A – 1. Tata penulisan dari perintah DEC adalah :
DEC [Variable/Register]
Contoh Program :
MOV CX,05
MOV DL,5A
# MOV AH,02
INT 21
DEC DL
LOOP #
INT 20
• Pengurangan Selain Satu
Bila dalam pertambahan kita gunakan ADD maka dalam pengurangan selain satu digunakan SUB dengan tata penulisannya adalah :
SUB [operand1],[operand2]
- Perkalian
Operasi perkalian dalam assembler dapat menggunakan perintah MUL yang berarti perkalian. Adapun tata penulisannya adalah :
MUL [Register]
Bila memerintahkan dengan perintah MUL, maka yang dilakukan komputer adalah :
• Mengambil nilai register terlampir pada perintah MUL. Contoh MUL BL, maka isi register BL yang diambil
• Kemudian komputer mengambil isi register AL dan dikalikan dengan isi register BL
• Hasilnya dapat dilihat pada register AX. Langkah diatas adalah oprasi 8 bit, sedang untuk operasi 16 bit yang dilakukan komputer adalah :
• Mengambil nilai register terlampir yang besarnya 16 bit. Contohnya : MUL BX
• Kemudian komputer mengambil isi register AX dan dikalikan dengan isi register BX
• Hasilnya dapat dilihat pada register OX
Contoh programnya :
MOV AH,02
MOV BH,32
MOV AL,01
MUL BH
MOV DL,AL
INT 21
INY 20
- Pembagian
Seperti juga perkalian, pembagian pun membedakan cara kerja pembagian dengan 8 bit dan 16 bit. Adapun cara kerja operasi pembagian adalah :
- Pembagian 8 Bit - Pembagian 16 Bit
Tata penulisan : Tata Penulisan:
DIV [Register 8 bit] DIV [Register 16 Bit]

Contoh : Contoh:
DIV BL DIV BX
Dibagi dengan AX Dibagi dengan
DX:AX
Hasil dilihat di AL Hasil dilihat di DX
Sisa dilihat di AH Sisa dilihat di AX

Contoh Programnya :
MOV BL,0A
MOV AX,0101
DIV BL
MOV AH,02
MOV DL,AL
INT 21
INT 20

MENCETAK STRING DAN MENGINPUT STRING
 Mencetak String
Sebelum kita mencetak sebuah string terlebih dahulu kita harus mendefinisikan variablenya. Variabel dalam bahasa assembler dapat dibagi menjadi 2 jenis variabel, yaitu :
- Variabel yang dapat dimodifikasi isinya.
Variabel ini adalah variabel yang memakan tempat pada memory, besar memory yang dipakai variabel ini ditentukan oleh besarnya variabel tersebut. Adapun besaran-besaran variabel tersebut adalah :
• DB (Define Byte), mendefinisikan variabel per byte
• DW (Define Word), mendefinisikan variabel per wprd
• DD (Define Double Word), mendefinisikan variabel per 2 word


Tata penulisan variabel jenis ini adalah dengan :
Label [DB/DW/DD] [Isi Variabel]
Contohnya :
Satu db ‘Ini Adalah Sebuah Variabel $’
- Variabel yang tidak dapat dimodifikasi isinya.
Jenis variabel ini tidak akan memakan memory pada komputer, jenis variabel ini hanya dapat dipakai dalam assembler menggunakan compiler. Untuk mendefinisikan jenis variabel ini anda cukup menggantikan besaran pada variabel yang dapat dimodifikasikan isinya menjadi kata equ.
Pada bagian ini akan dibahas bagaimana cara mencetak sebuah kalimat ke layar menggunakan Int 21 Hexa service number 09h. Adapun syarat-syarat untuk menggunakan Int 21 H service 09H ini adalah :
- Masukan Service number Interupt ke register AH.
- Masukan segment dari variabel tempat menampung kata yang akan dicetak ke DS dan offset-nya ke DX dan kata-kata yang dicetak tersebut harus diakhiri dengan tanda dollar ‘$’.
Contoh Programnya :
.MODEL SMALL
.CODE
ORG 100H
START : JMP MULAI
;Disini data dimulai
KATA DB ‘TEST KATA-KATA’,13,10
DB ‘SATU $’
MULAI : MOV AH,09H
MOV DX,OFFSET KATA ; ATAU LEA DX,KATA
INT 21H
INT 20H
END START
 Input Satu Karakter
Untuk input 1 karakter dengan ECHO kita akan menggunakan Interrupt 21H dengan service number 01H. Adapun syarat-syarat menggunakan Interupt 21H service number 01H ini adalah :
- Pada saat sebelum dilakukan proses, register AH harus berisi service number dari interupt 21H yaitu 01H
- Selama proses, proses dapat dihentikan dengan menekan tombol control dan tombol break atau C secara bersamaan.
- Hasil input dari keyboard akan diletakan di register AL
Contoh Programnya :
.MODEL SMALL
.CODE
ORG 100H
START :JMP MULAI
TANYA DB ‘JAWAB SAJA PERTANYAAN INI : ‘,13,10
DB ‘MASUKAN SATU KARAKTER : $’,13,10
HASIL DB ‘KARAKTER ITU : $’
MULAI : MOV AH,09H
LEA DX,TANYA ;MENCETAK TANYA
INT 21H
MOV AH,01H ;SERVICE UNTUK INPUT 1 CHAR
INT 21H
MOV AH,09H
LEA DX,HASIL ;MENCETAK HASIL
INT 21H
MOV AH,02H
MOV DL,AL ;CETAK HASIL INPUT
INT 21H
INT 20H
END START

 Input Lebih Dari Satu Karakter (String)
Untuk melakukan input lebih dari satu karakter, digunakan Int 21H dengan service number 0AH yang mempunyai syarat proses sebagai berikut :
- Register Ah harus berisikan service number dari interupt 21H tersebut 0AH
- Harus mendefinisikan sebuah variabel tempat menampung masukan dengan tata penulisan variabel sebagai berikut :
[label] db nn,mm,nn dup(?)
dengan aturan tata penulisan tersebut adalah :
 nn adalah jumlah terbanyak karakter yang dapat dimasukan + 1, guna + 1 adalah untuk tempat 0D Hexa
 mm adalah indikator dari beberapa banyak karakter yang dimasukan . mm ini secara otomatis oleh komputer setiap kali kita melakukan input, sehingga pada saat kita mendefinisikan variabel tempat menampung mm ini dapat dikosongkan dengan menggunakan tanda tanya (?) yang artinya satu byte memory yang tidak diisi. Jumlah maksimum mm adalah nn – 1.
- DS:DX harus berisi segment dan offset awal variabel diatas.
Contoh Programnya :
.MODEL SMALL
.CODE
ORG 100H


START : JMP MULAI
TANYA DB ‘MASUKAN STRING : $’,13,10
TAMPUNG DB 11,?,11 DUP(?)
JAWAB DB ‘STRING TADI ADALAH : $’
MULAI : MOV AH,09H
MOV DX,OFFSET TANYA ;CETAK TANYA
INT 21H
MOV AH,0AH ;INPUT STRING
MOV DX,OFFSET TAMPUNG
PUSH DX ; ISI DX KE STACK
INT 21H
MOV BX,OFFSET TAMPUNG
INC BX ; BX = BX + 1
MOV DL,[BX] ; ISI DX DENGAN [BX]
XOR DH,DH ;DH = 0
INC BX
ADD BX,DX
MOV DL,’$’
MOV [BX],DL ;MASUKAN DL KE [BX]
MOV DX,OFFSET JAWAB ;CETAK JAWAB
MOV AH,09H
INT 21H
POP DX ;AMBIL DX DARI STACK
INC DX
INC DX
MOV AH,09H
INT 21H
INT 20H
END START

String yang kita input tadi dengan nama variable TAMPUNG akan dimasukan kedalam register BX, kemudian BX = BX + 1. Kemudian setelah mendapat indikator tersebut, taruh di register DL dan mengosongkan register DH (XOR DH,DH). Gunakan tampilan dibawah ini untuk memperjelas posisi BX terhadap variable tampung.

TAMPUNG db 11,I,?,?,?,?,?,?,?,?,?,?,?
Catatan : I = Indikator

Tambahkan satu supaya menunjuk kepada awal kata yang anda masukan dengan perintah INC BX.

TAMPUNG db 11,I,?,?,?,?,?,?,?,?,?,?,?
Catatan : I = Indikator

Setelah itu tambahkan BX dengan DX supaya menunjuk kepada huruf terakhir masukan. Ganti )D H dengan ‘$’ supaya bisa dicetak menggunakan Int 21H dengan 09 H. Kemudian string input yang kita masukan bisa dicetak.
KONDISI / LOMPAT
 Lompatan Tak Bersyarat
Secara fisik anda hanya dapat melihat bahwa lompatan tak bersyarat terdiri dari satu macam, tapi bila dianalisis jumlah byte yang dipakai untuk lompatan tak bersyarat dapat dikelompokan menjadi 2 macam yaitu :
- Lompatan Dekat (Near Jump)
- Lompatan Jauh (Far Jump)
Adapun secara fisik perintah lompat dapat ditulis sebagai berikut :
JMP [lokasi memory]
Contoh :
JMP 200
Perintah ini adalah untuk melakukan lompatan kearah lokasi memory segment:0200
 Perbandingan Lompatan Bersyarat
Untuk lompatan bersyarat, terdapat beberapa jenis lompatan yang kegunaanya dapat disesuaikan dengan keperluan yang dibutuhkan. Untuk perbandingan Operand dengan menggunakan perintah perbandingan (Compare). Adapun tata penulisan perintah perbandingan adalah :
CMP [operand1],[operand2]
Contohnya :
CMP AX,0102
Perintah ini digunakan untuk membandingkan AX dengan 0102
 Lompatan Bersyarat
- JE (Jump If Equal)
Perintah ini berlaku bila pada saat pembandingan kedua opearnd sama. Contohnya :
CMP AX,0102
JE 0102
- JNE (Jump If Not Equal)
Perintah ini berlaku bila pada saat perbandingan kedua operand tidak sama. Contohnya :
CMP AX,0102
JNE 0102
- JG (Jump If Greater Than)
Perintah ini berlaku bila pada saat perbandingan operand pertama menunjukan lebih besar dari operand pertama. Kebalikannya adalah JNG (Jump If Not Greater)
- JGE (Jump If Greater Or Equal)
Perintah ini berlaku bila pada saat perbandingan operand pertama menunjukan lebih besar atau sama dengan dari operand pertama. Kebalikannya adalah JNGE (Jump If Not Greater)

• Masih banyak lagi perintah-perintah lompat bersyarat ini, perintah-perintah diatas hanya sebagian kecil dari perintah-perintah lompat bersyarat.

PROCEDURE DAN MACRO

 Subroutine/Procedure
Bila anda mempunyai masalah anda harus menulis suatu perintah berulang-ulang, maka dengan operasi subroutine anda dapat menyingkat kerja yang ada diprogram tersebut hingga setelah program. Struktur dari subroutine/procedure bisa anda lihat dibawah ini :
[nama subroutine] PROC [NEAR/FAR]
Disini Letak Program Anda
RET
[nama subroutine] ENDP
Adapun maksud dari NEAR dan FAR adalah :
- NEAR
Berarti subroutine tersebut bersifat dekat atau subroutine itu hanya akan dipanggil paling jauh satu segment.
- FAR
Berarti subroutine ini dapat dioperasikan antar segment karena untuk memanggil subroutine dapat dilakukan lebih jauh dai 1 segment.
Untuk memanggil subroutine, digunakan perintah CALL yang dapat didefinisikan dengan :
CALL [nama subroutine]
Adapun yang dilakukan komputer ketika memproses CALL adalah :
- Memasukan alamat pemanggil ke Stack dengan besar 2 byte bila subroutine tersebut NEAR dan 4 byte bila subroutine tersebut FAR.
- Mencari alamat subrotine yang dipanggil dan siap melakukan perintah yang diperintahkan oleh subroutine.
Perintah RET berarti komputer akan mengembalikan penunjuk program (IP) ke program pemanggil. Adapun yang dilakukan komputer ketika menerima instruksi RET adalah :
- Mengambil alamat pemanggil dari STACK dengan besar 2 byte bila subroutine NEAR dan 4 byte bila subroutine FAR.
- Meloncat ke arah alamat tersebut.
Contoh Programnya :
.MODEL SMALL
.CODE
ORG 100H
START : JMP MULAI
KOLOM DB 00
BARIS DB 00
MULAI : CALL BERSIH
CALL POSISI
INT 20H
HAPUS PROC NEAR
MOV AH,06H
MOV CX,0000H
MOV AL,00H
MOV BH,07H
MOV DH,24
MOV DL,79
INT 10H
RET
CLS ENDP
POSISI PROC NEAR
MOV DH,BARIS
MOV DL,KOLOM
MOV AH,02H
MOV BH,00
INT 10H
RET
POSISI ENDP
END START




























SOAL – SOAL PRAKTIKUM

I. Minggu Pertama
1. Apa yang anda ketahui tentang register secara umum dan sebutkan beberapa golongan secara umum ?
2. Jelaskan fungsi-fungsi perintah dibawah ini yang terdapat dalam Debug :
- A
- N
- RCX
- RIP
- W
- G

3. Jelaskan fungsi dari perintah-perintah di bawah ini :
- mov
- int
- push
- pop
4. Buatlah program sederhana dengan menggunakan Debug.com untuk menampilkan :
a. mAjAlEnGkA
b. 1a2b3c4d5e











I. Minggu Pertama
1. Register adalah sebagian kecil emori komputer yang dipakai untuk tempat penampungan data dengan ketentuan bahwa data yang ada dalm komputer tersebut dapat diproses dalam berbagai. Secara umum register dapat dibagi dalam lima golongan, antara lain :
- General Purpose Register (ax,bx,cx,dx).
- Segment Register (cs,ds,ss,es).
- Pointer Register (ip,sp,bp).
- Flag Register.
2. Fungsi-fungsi dari perintah dibawah ini dalam debug.com adalah
- A : perintah assembler yang berguna untuk tempat menulis program ASM
- N : memberi nama suatu program
- RCX : perintah untuk mengetahui dan memperbaharui isi dari register cx yang merupakan tempat paenampungan panjang program yang sedang aktif sebelum program dijalankan.
- RIP : perintah yang memberitahu komputer untk memulai proses program pada titik tertentu.
- W : perintah untuk menulis atau menyimpan program.
- G : perintah untuk menjalankan program.
3. Fungsi dari perintah-perintah :
- mov : perintah untuk mengisi, memindahkan, memperbaharui isi suatu register variabel atau suatu lokasi memori.
- int : perintah untuk memanggil suatu subroutin yang berada ataupun suatu lokasi memori.
- push : perintah untuk memasukkan isi register kedalam stack
- pop : perintah untuk mengeluarkan isi register dari stack




4. Program
a. mAjAlEnGkA

-debug
a100
mov ah,02
mov dl,47
int 21
mov dl,75
int 21
mov dl,4e
int 21
mov dl,61
int 21
mov dl,64
int 21
mov dl,52
int 21
mov dl,4d
int 21
mov dl,61
int 21
int 20








b. a2b3c4d5e

- debug
a100
mov ah,02
mov cx,05
mov bx,3161
* mov dl,bh
int 21
mov dl,bl
int 21
inc bh
inc bl
loop *
int 20

catt : * alamat offset
segmen : offset













II. Minggu Kedua
1. Apa yang dimaksud dengan compiler dan lingking dalam assembler dan jelaskan sintaks dari compiler dan lingker assembler tersebut ?
2. Tuliskan structure proram assembler dalam TASM ?
3. Sebutkan dan jelaskan macam-macam perintah dalam assembler dibawah ini :
a. Penambahan
b. Pengurangan
c. Perkalian
d. Pembagian
4. Buatlah program operasi aritmatika untuk menampilkan :
a. 2 + 3 = 5
b. 3 * 3 = 9


















II. Minggu Kedua
1. Compiler adalah suatu program yang menterjemahkan program assembler dalam ASCI file ke bentuk object.
Sintaks : TASM namafile.asm namafile.obj
Linker adalah suatu program yang menterjemahkan program-program object ke suatu program yang bisa dieksekusi.
Sintaks : TLINK/T namafile.obj
2. Structure Program assembler :
[nama segment] segment
assume cs : [segment] dc: [segment] ss: [segment] es : [segment]
org 100h
[label]
program assemblernya
[nama segment] ends
end [label]

3. a. Operasi pertambahan
- pertambahan dengan 1 kita gunakan INC [register/variabel]
- pertambahan selain 1 kita gunakan ADD [operand1],[operand2]
b. Operasi pengurangan
- pengurangan dengan 1 kita gunakan DEC [register/variabel]
- pengerangan selain 1 kita gunakan SUB [operand1],[operand2]
c. Operasi perkalian
Mengguanakan MUL [register]
- mengambil nilai register yang terlampir pada perintah MUL
- komputer mengambil isi register AL, kemudian dikalikan dengan nilai register tadi
- hasilnya dilihat ada register AX
d. Oprasi pembagian
- menggunakan DIV [register]
- hasil pembagi ada diregister AL dan sisanya di AH
4. Program
a. 3 + 4 = 7

.model small
.code
org 100h
start : mov ax,03h
int 10h
mov ah,02h
mov bh,33h
mov bl,34h
mov dl,bh
int 21h
mov dl,2b
int 21h
mov dl,bl
int 21h
mov dl,3d
int 21h
sub bl,30h
add bh,bl
mov dl,bh
int 21h
int 20h
end start






b. 3 x 3 = 9

.model small
.code
org 100h
start : mov ax,03h
int 10h
mov ah,02h
mov bh,33h
mov bl,33h
mov dl,bh
int 21h
mov dl,78h
int 21h
mov dl,bl
int 21h
mov dl,3dh
int 21h
sub bh,30h
mov al,03h
mul bh
add al,30h
mov dl,al
mov ah,02h
int 21h
int 20h
end start




IV. Minggu Keempat
1. Sebutkan dan jelaskan 2 macam lompatan dalam assembler ?
2. Apa fungsi dari :
a. JMP
b. CMP
c. JE
d. JNE
3. a. Buatlah Program assembler dengan TASM dengan tampilan :
Masukkan angka [1..3] :
Ket : jika kita masukan :
1, maka akan muncul Saya Laki-laki
2, maka akan muncul Saya Perempuan
selain itu maka akan muncul Saya Bukan Keduanya
Gunakan CMP, JE, JNE
b. Buatlah program menu dengan tampilan
** MENU UTAMA**
<>
-----*************-----
1. Sarapan Apgi
2. Makan Siang
3. Makan Malam
4. Exit
------------------------------
Tentukan Pilihan Anda [1..4] :







Jika :
1, akan tampil : Nasi Goreng
Udang Goreng
Teh Manis
2, akan tampil : Nasi Putih
Cumi Rebus
Ikan Bakar
Air Putih
3, akan tampil : Nasi putih
Kerang Rebus
Kepiting Panggang
Air Putih
4, Exit


















IV. Minggu Keempat
1. Dua jenis lompatan dalam assembler adalah
a. lompatan tak bersyarat
yaitu kondisi akan melompat ke suatu alamat memori tanpa syarat
b. lompatan bersyarat
yaitu kondisi akan melompat ke suatu alamat memori dengan suatu
syarat
2. Fungsi dari perintah-perintah :
a. JMP
Perintah ini adalah untuk melakukan lompatan kearah lokasi memori segment
b. CMP
Perintah ini digunakan untuk membandingkan kedua operand
c. JE
Perintah ini untuk melakukan lompatan kearah lokasi memori segment jika perbandingan kedua operand sama

d. JNE
Perintah ini untuk melakukan lompatan kearah lokasi memori segment jika perbandingan kedua operand tidak sama









3. a. Program
.model small
.code
org 100h
start : jmp mulai
kt1 db “Masukkan Angka [1..3] : $”,13,10
kt2 db “Saya Laki-laki $”,13,10
kt3 db “Saya Perempuan $”,13,10
kt4 db “Saya Bukan Keduanya $”,13,10
mulai : mov ax,03h
int 10h
mov ah,09h
lea dx,kt1
int 21h
mov ah,01h
cmp al,’1’
je laki
cmp al,’2’
je wanita
cmp al,’3’
je bukan
laki : mov ah,09h
lea dx,kt2
int 21h
jmp selesai
wanita : mov ah,09h
lea dx,kt3
int 21h
jmp selesai


bukan : mov ah,09h
lea dx,kt4
int 21h
jmp selesai
selesai : int 20h
end start


b. program

.model small
.code
org 100h
start : jmp mulai
menu db “** MENU UTAMA **”13,10
db “<>”,13,10
db “********************”,13,10
db “1. Sarapan Pagi “,13,10
db “2. Makan Siang”,13,10
db “3. Makan Malam”,13,10
db “4. Exit”,13,10
db “------------------------------“,13,10
db “Tentukan Pilihan Anda [1..4] : $”
jwb1 db “1. Nasi Goreng”,13,10
db “2. Udang Goreng”,13,10
db “3. The Manis $”
jwb2 db “1. Nasi Putih”,13,10
db “2. Cumi Rebus”,13,10
db “3. Ikan Bakar”,13,10
db “4. Air Putih $”

jwb 3 db “1. Nasi Putih”,13,10
db “2. Kerang Rebus”,13,10
db “3. Kepiting Panggang:,13,10
db “4. Air Putih $”
mulai : mov ax,03h
int 10h
mov ah,02h
lea dx,menu
int 21h
mov ah,01h
cmp al,’1’
je pil1
cmp al,’2’
je pil2
cmp al,’3’
je pil3
jmp selesai
pil1 : mov ah,09h
lea dx,jwb1
int 21h
jmp selesai
pil2 : mov ah,09h
lea dx,jwb2
int 21h
jmp selesai
pil3 : mov ah,09h
lea dx,jwb3
jmp selesai
selesai : int 20h
end start

V. Minggu Kelima
1. Tuliskan structure dari subroutine/procedure ?
2. Buatlah program dengan menggunakan macro untuk mencetak string denga tampilan sebagai berikut :
a. Selamat Datang
Di Lab SI
Univ Gunadarma
b. Masukkan Kata : < DARMA >
AMRAD
AMRA
AMR
AM
A
3. Buatlah program dengan menggunakan procedure dengan tampilan sebagai berikut :
Masukkan suatu kalimat : Yudhi
Yudhi
Yudh
Yud
Yu
Y










V. Minggu Kelima
1. Struktur subroutine/procedure :
[nama subroutine] proc [near/far]
isi program
ret
[nama subroutine] endp
2. a. Cetak makro kalimat
mov ah,09h
mov dx,offset kalimat
int 21h
endm
.model small
.code
.org 100h
start : jmp mulai
kt1 db “Selamat Datang $”
kt2 db 13,10, “Di Lab SI $”
kt3 db 13,10, “Univ Gunadarma $”
mulai : cetak kt1
cetak kt2
cetak kt3
int 20h
end start








b. Cetak makro kalimat
mov ah,09h
mov dx,offset kalimat
int 21h
endm
.model small
.code
org 100h
mulai : jmp proses
kt1 db “ Masukkan Nama Anda : $”
jwb db 11,?,11 dup(?)
proses : mov ax,03h
int 10h
cetak kat1
mov ah,0ah
lea dx,jwb
int 21h
push dx
lea bx,jwb
inc bx
mov dl,[bx]
xor dh,dh
mov dl,bx
movsi,bx
mov cx,dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h

B : push cx
mov cx,si
A : dec bx
mov ah,02h
mov dl,[bx]
int 21h
loop A
mov dl,0dh
int 21h
mov dl,0ah
int 21h
sub bx,31
dec si
pop cx
loop B
int 20h
end mulai














3. Program
.model small
.code
org 100h
mulai : jmp proses
kt1 db “Masukkan Nama Anda : $”
jwb db 11,?,11 dup(?)
proses : mov ax,03
int 10h
mov ah,09h
lea dx,kt1
int 21h
mov ah,0ah
lea dx,jwb
int 21h
push dx
lea bx,jwb
inc bx
mov dl,[bx]
xor dh,dh
mov dl,bx
mov si,bx
mov cx,dx
call bawah
B : push cx
mov cx,si





A : inc bx
mov ah,02h
mov dl,[bx]
int 21h
loop A
call bawah
sub bx,si
dec si
popcx
loop b
int 20h
end mulai
bawah proc near
mov ah,02h
mov dl,0ah
int 21h
mov dl,0dh
int 21h
ret
bawah endp










III. Minggu Ketiga
1. Jelaskan fungsi berikut ini :
a. int 21h service number 09h
b. int 21h service number 01h
c. int 21h service number 0ah
2. Buatlah program dengan tampilan sebagai berikut :
a. ***SELAMAT DATANG ***
*DI LAB SISTEM INFORMASI*
**GUNADARMA**
b. Masukkan var ke-1 : 4
Masukkan var ke-2 : 3
Jumlah var tersebut adalah : 7
3. Buatlah proran dengan tampilan seperti dibawah ini :
Masukkan Nama Anda : Yudhi
Nama Anda adalah : Yudhi
















III. Minggu Ketiga
1. Fungsi dari INT 21
- service number 09H : digunakan untuk mencetak string
- service number 01H : digunakan untuk menginput karakter
- service number 0AH : digunakan untuk menginput string
2. a. Program
.model small
.code
org 100h
start : jmp mulai
kt1 db “Selamat Datang $”
kt2 db 13,10, “Di Lab Sistem Informasi $”
kt3 db 13,10, “ Gunadarma $”
mulai : mov ah,09h
lea dx,kt1
int 21h
lea dx,kt2
int 21h
lea dx,kt3
int 21h
int 20h
end start
b. program
.model small
.code
org 100h
start : jmp mulai
kt1 db “Masukkan var ke-1 : $”,13,10
kt2 db “Masukkan var ke-1 : $”,13,10
kt3 db “Penjumlahan 2 var : $”,13,10

mulai : mov ah,09h
lea dx,kt1
int 21h
mov ah,01h
sub al,30h
mov bl,al
xor al,al
mov ah,09h
lea dx,kt2
int 21h
mov ah,01h
int 21h
mov al,30h
mov bh,al
add bh,al
mov ah,09h
lea dx,kt3
int 21h
mov ah,02h
add dl,30h
mov dl,bh
int 21h
int 20h
end start










3. Program
.model small
.code
org 100h
start : jmp mulai
kt1 db “Masukkan Nama Anda :$”
kt2 db 13,10, “Nama Anda Adalah : $”
var db 11,?,11 dup(?)
mulai : mov ax,03h
int 10h
mov ah,09h
lea dx,kt1
int 21h
mov ah,0ah
lea dx,var
int 21h
mov ah,09h
lea dx,kt2
int 21h
lea bx,var
mov dl,[bx]
xor dh,dh
mov cx,dx
A : inc bx
mov ah,02h
mov dl,[bx+1]
int 21h
loop A
int 20h
end start