[Type text] Page 1
Daftar Isi
Daftar Isi ... 1
Pertemuan 3: Pengenalan TASM ... 2
P3.1. Teori ... 3
Pengenalan Turbo Assembler ... 3
Struktur Program ... 4
Membuat Program Menggunakan TASM ... 6
Variabel ... 8
Addressing Modes ... 11
P3.2. Studi Kasus ... 23
P3.3. Latihan ... 25
[Type text] Page 2
Pertemuan 3
Pengenalan Turbo Assembler & Addressing
Mode
Objektif:
1. Mahasiswa mengetahui Turbo Assembler
2. Mahasiswa mengetahui perintah-perintah dasar Turbo Assembler
3. Mahasiswa dapat membuat program assembler sederhana menggunakan TASM
[Type text] Page 3
P3.1Teori
PENGENALAN TURBO ASSEMBLER Text Editor
Penulisan program bahasa rakitan dengan TASM dapat menggunakan text editor seperti
Edit (DOS), SideKick (SK), WordStar, atau word processor yang mempunyai fasilitas
pembuatan ASCII file seperti Word Perfect, SPRINT dan lain sebagainya. Selain itu, dapat menggunakan editor Turbo Pascal atau Turbo C namun simpan ekstension file yang disimpan harus diakhiri .ASM bukan .PAS atau .C
Compiler
Yang dimaksud dengan Compiler adalah suatu program yang menerjemahkan program Assembler dalam ASCII file (berekstension .ASM) ke bentuk file Object (berekstension .OBJ) dan menerjemahkan program object ke bentuk program exsekusi (berekstension .COM atau .EXE).
Untuk mengompile source file, misalnya file COBA.ASM menjadi file object dengan extensi .OBJ atau ke bentuk program ekstensi .COM atau .EXE dapat menggunakan file TASM.EXE dengan mengetikkan:
C:\>tasm coba
Turbo Assembler version 2.0 Copyright © 1988, 1990 Borland International
Assembling file : coba.ASM
Error messages : None
Warning messages : None
Passes : 1
Remaining memory : 370k
C:\>dir coba.*
Volume in drive C is S’to Directory of C:\
COBA OBJ 128 08-08-11 10:42p
COBA ASM 128 08-08-11 10:41p
2 file(s) 246 bytes
[Type text] Page 4 STRUKTUR PROGRAM
Untuk program .COM harus menambahkan Org 100h pada baris ketiga dari struktur
program. Hal ini dilakukan karena harus menyisihkan ruang sebesar 100h untuk PSP (Program Segment Prefix), karena program .COM hanya terdiri dari satu segment sedangkan untuk program .EXE harus dapat membuat beberapa segment dan tidak perlu menyediakan baris ketiga dari struktur data seperti contoh di bawah ini:
.MODEL SMALL .CODE
ORG 100H
Label1 : JMP Label2
Tempat program ditulis Label2 :
Tempat program ditulis INT 20H
END Label1
Penjelasan struktur program adalah sebagai berikut:
MODEL SMALL
Tanda directive ini digunakan untuk memberitahukan kepada assembler bentuk memory yang digunakan oleh program. 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.
[Type text] Page 5 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) diletakkan 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. Perintah JUMP yang digunakan pada bagan diatas dimaksudkan agar melewati tempat data program,
[Type text] Page 6 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:
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. Jika program tidak diakhiri atau perintah untuk mengakhiri program tidak dicantumkan maka hal ini akan menyebabkan komputer menjadi hang.
MEMBUAT PROGRAM MENGGUNAKAN TASM
Program yang sudah dibuat di compile ke bentuk file object yang akan dibuat menjadi
.COM ataupun .EXE file. Aturan pemakaian compiler Turbo Assembler adalah sebagai berikut: Contoh:
TASM CETAK.ASM CETAK.OBJ
Maka compiler akan meng-compile file CETAK.ASM dari .ASM file ke format .OBJ file.
Linking
File object yang telah terbentuk dengan TASM, belum dapat dieksekusi secara langsung. Untuk membuat file object ke bentuk file yang dapat dieksekusi (ektensi .COM atau .EXE) bisa menggunakan file TLINK.EXE.
Untuk membuat source program dalam bentuk EXE maka untuk membentuk file dengan ektensi EXE adalah dengan cara sebagai berikut:
C:\>tlink coba
Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International
Bila source program yang dibuat adalah file COM, maka dapat dibuat dengan cara: C:\>tlink/t coba
[Type text] Page 7 Turbo Link Version 3.0 Copyright (c) 1987,
1990 Borland International
Label
Label didefinisikan dengan ketentuan meletakkan tanda titik dua (:) diakhir nama label
tersebut. Ketentuan pemberian nama label adalah sebagai berikut:
Huruf, terdiri dari A-Z (Huruf besar dan kecil tidak dibedakan)
Angka, terdiri dari 0, 1, 2, 3, 4, 5, 6, 7, 8 , 9
Karakter Khusus, yaitu @ . _ $
Panjang Maksimal Nama Label adalah 31 karakter
Tidak diperbolehkan menggunakan spasi
Bukan Keywords Assembler
Label hanya dapat didefinisikan satu kali dalam program
Contoh penulisan label yang benar adalah: mulai: MOV CX, 5
Komentar
Komentar adalah suatu kalimat yang tidak akan diproses oleh compiler dan akan dibiarkan sebagai keterangan atau dokumentasi pada file .ASM. Simbol yang digunakan untuk
menandakan komentar adalah titik-koma (;). Apapun yang dtuliskan dibelakang tanda ';' akan
dianggap sebagai komentar. Contoh :
mulai: MOV BX,7 ; berikan nilai 7 pada BX
Perintah MOV
Perintah MOV digunakan untuk mengcopy nilai atau angka menuju suatu register, variabel atau memory. Adapun syntax untuk perintah MOV ini adalah :
MOV Tujuan, Asal Sebagai contohnya :
[Type text] Page 8 MOV AL,9 ; masukkan nilai 9 pada AL.
MOV AH,AL ; nilai AL=9 dan AH=9
MOV AX,9 ; AX=AH+AL hingga AH=0 dan AL:=9
Penjelasan:
- MOV AL, 9 berfungsi memberikan nilai 9 pada register AL.
- MOV AH, AL nilai register AL dicopykan ke register AH.
- Setelah operasi ini register AL akan tetap bernilai 9,
- Register AH akan sama nilainya dengan AL yaitu 9.
- Pada baris ketiga MOV AX,9; register AX diberikan nilai 9.
Karena AX terdiri atas AH dan AL, maka register AH akan bernilai 0, sedangkan AL akan bernilai 9. Perintah MOV akan mengcopykan nilai pada sumber untuk dimasukan ke Tujuan, nilai sumber tidaklah berubah. Inilah sebabnya MOV(E) akan diterjemahkan disini dengan mengcopy, dan bukan memindahkan.
Perintah INT
Untuk menghasilkan suatu interupsi digunakan perintah INT dengan syntax:
INT NoInt
Dengan NoInt adalah nomor interupsi yang ingin dihasilkan. Sebagai contoh, untuk menghasilkan interupsi 21h, caranya adalah sebagai berikut:
INT 21h
maka computer akan menghasilkan perintah int 21h.
VARIABEL
Variable dalam bahasa assembler dapat dibagi menjadi 2 jenis, yaitu:
1. Variabel yang dapat dimodifikasi isinya
[Type text] Page 9 Variable yang Dapat Dimodifikasi Isinya
Variable ini adalah variable yang memakan tempat pada memory, besar memori yang dipakai variable ini ditentukan oleh besarnya variable tersebut. Variable ini dapat didefinisikan dengan DEBUG ataupun menggunakan compiler. Besaran variabel-variabel tersebut adalah:
- DB (Define Byte), mendefinisikan variable per byte
- DW (Define Word), mendefinisikan variable per word (2 byte)
- DD (Define Double Word), mendefinisikan variable per 2 word
Variabel yang Tidak Dapat Dimodifikasi Isinya
Jenis variable ini tidak akan memakan memory pada computer dan hanya dapat digunakan dalam assembler menggunakan compiler. Untuk mendefinisikan jenis variabel ini, dapat dilihat bentuk umumnya seperti di bawah ini:
Satu equ 2190h Dua equ 2323h
Tata Cara Penulisan Variabel
Untuk menulis variable caranya adalah sebagai berikut: Label (DB/DW/DD) [Isi Variabel]
Contohnya:
Satu db ‘Ini adalah sebuah variable $’
Mencetak Sebuah Kalimat
Untuk mencetak sebuah kalimat ke layar digunakan Interrupt 21 hexa service 09h. Aturan penggunaan Int 21 hexa Service 09 hexa adalah sebagai berikut:
[Type text] Page 10
- Masukkan segment dari variabel tempat menampung kata-kata yang dicetak ke register
DS dan offset-nya ke register DX dan kata-kata yang dicetak tersebut diakhiri dengan tanda dollar ‘$’.
Contoh penerapan interrupt 21 hexa service 09h: CODE_SEG SEGMENT
ASSUME CS:CODE_SEG ORG 100H
START : JMP MULAI ;data dimulai
KATA db ‘Kata-kata ini adalah kata-kata yang dicetak’ , 13, 10
db ‘menggunakan Interrupt 21 hexa service 09 hexa’, 13, 10
db ‘$’
mulai : MOV DX, OFFSET KATA ;mengisi DX dengan OFFSET DATA
MOV AH, 09H ;mengisi AH dengan SERVICE NUMBER
INT 21H
INT 20H ;pemberhentian program
CODE_SEG ENDS END START
[Type text] Page 11 ADDRESSING MODES
Ada 7 (tujuh) macam cara untuk menduplikasikan nilai pada suatu register, variabel ataupun lokasi memory, yaitu:
Tabel 3.1 Addressing Mode
ADDRESSING MODE FORMAT SEGMENT REGISTER
Immediate Data Tidak Ada
Register Register Tidak Ada
Direct Displacement Label DS DS Register Indirect [BX] [BP] [SI] [DI] DS SS DS DS Base Relative [BX] + Displacement [BP] + Displacement DS SS Direct Indexed [DI] + Displacement [SI] + Displacement DS DS Base Indexed [BX] [SI] + Displacement [BX] [DI] + Displacement [BP] [SI] + Displacement [BP] [DI] + Displacement DS DS SS SS
[Type text] Page 12 Penduplikasian atau pengcopian yang tidak diijinkan adalah:
1. Pengcopyan data antar segment register, seperti:
MOV DS,ES
Untuk memecahkan hal ini, anda bisa menggunakan register general purpose sebagai perantara, seperti:
MOV AX,ES MOV DS,AX
Selain dengan cara di atas, anda bisa juga menggunakan stack sebagai perantara, seperti: PUSH ES
POP DS
2. Pemberian nilai untuk segment register(DS, ES, CS, SS) secara langsung, seperti:
MOV ES,0B800h
Untuk memecahkan hal ini, anda bisa menggunakan register general purpose sebagai perantara, seperti:
MOV AX,0B800h MOV ES,AX
3. Pengcopyan data langsung antar memory, seperti:
MOV MemB,MemA
Untuk memecahkan hal ini, anda bisa menggunakan register general purpose sebagai perantara, seperti:
MOV AX,MemA MOV MemB,AX
Pengcopyan data antar register yang berbeda tipenya (8 bit dengan 16 bit) tanpa menggunakan pointer, seperti:
[Type text] Page 13 Immediate Addressing
Pengcopyan data yang tercepat ialah yang dinamakan dengan Immediate Addressing dan Register Addressing. Immediate Addressing adalah suatu pengcopyan data untuk suatu register 8,16 atau 32 bit (80386) langsung dari suatu angka. Contohnya:
MOV AX,50h
MOV EAX,11223344h <80386>
Immediate Addressing dapat juga mendapatkan nilainya melalui suatu constanta yang telah didefinisikan dengan perintah EQU, seperti :
A EQU 67h ;
;
MOV AX,A
Perintah di atas akan mengcopykan nilai 67h untuk register AX.
Register Addressing
Register Addressing adalah suatu proses pengcopyan data antar register. Pengcopyan antar register ini harus digunakan register yang berukuran sama, seperti AL dengan BH, CX dengan AX. Contah perintahnya:
MOV AX,CX
Register Addressing dapat juga dapat juga hanya terdiri atas sebuah register seperti pada perintah:
INC CX.
Berikut contoh program perkalian yang menggunakan prosesor 80386: .MODEL SMALL
.386 ; Untuk prosesor 80386
[Type text] Page 14 ORG 100h
Proses :
MOV EAX,12345678h ; Immediate Addressing
MOV EDX,33112244h ; Immediate Addressing
MOV EBX,EDX ; Register Addressing
MUL EBX ; Register Addressing
END Proses
Aturan perkalian pada pada 80386 ini sama dengan perkalian yang telah kita bicarakan didepan. Pada prosesor 80386 digunakan register-register 32 bit, seperti EAX ,EBX dan EDX seperti program di atas. Untuk menggunakan kelebihan pada komputer 80386 ini harus
menambahkan directive .386.
Direct Addressing
Secara umum Direct Addressing ialah suatu pengcopyan data pada suatu register dan simbol.
Contoh:
TData : JMP Proses A DB 12h B DB 59h
Proses : MOV AL,A ; Direct Addressing
MOV AH,B ; Direct Addressing
Perintah diatas akan mengcopykan data variabel A dan B pada register AL dan AH.
Register Indirect Addressing
Register Indirect Addressing digunakan untuk mengakses suatu data yang banyak dengan mengambil alamat efektif dari data tersebut. Register-register yang dapat digunakan pada addressing ini adalah BX,BP,SI dan DI. Tetapi bila membuat program pada prosesor 80386 (dengan menambahkan directive .386) maka semua register general purpose bisa dipakai. Untuk
[Type text] Page 15 mendapatkan alamat efektif dari suatu data dapat menggunakan perintah LEA (Load Effective Addres) dengan syntax :
LEA Reg,Data
Untuk mengakses data yang ditunjukkan oleh register Reg, setelah didapatkannya alamat
efektif harus menggunakan tanda kurung siku [ ].
Jika pada perintah pengaksesannya tidak disebutkan segmennya, maka yang digunakan adalah segment default. Seperti bila menggunakan register BX sebagai penunjuk offset, maka segment DS yang digunakan. Sebaliknya, bila menggunakan register BP sebagai penunjuk offset, maka segment SS yang digunakan. Berikut contoh program yang menggunakan register inderict addressing dengan mengakses data melalui alamat Efektif:
.MODEL SMALL .CODE ORG 100h TData : JMP Proses Kal DB 'ABCDEF' Proses:
LEA BX,Kal ; Ambil Offset Kal
MOV CX,2 Ulang:
MOV DL,[BX] ; kode ASCII yang ingin dicetak
MOV AH,02h ; Nilai servis ntuk mencetak karakter
INT 21h ; Mencetak karakter
ADD BX,2 ; BX:=BX+2
LOOP Ulang ; Lompat ke Ulang
INT 20h END TData
[Type text] Page 16 Program di atas akan menghasilkan output seperti berikut:
AC
Pertama-tama kita mendefinisikan data untuk variabel 'Kal', dimana data ini nantinya akan disimpan pada memory, seperti berikut:
A B C D E F
Alamat Offset: 103 104 105 106 107 108
Pada perintah LEA BX, Kal, maka register BX akan menunjuk pada alamat efektif dari
variabel Kal, sebagai berikut :
BX=103 _
A B C D E F
Alamat Offset: 103 104 105 106 107 108
Pada perintah MOV CX,2, nilai 2 diberikan kepada register CX untuk digunakan sebagai
counter pada saat LOOP. Kemudian, mengambil nilai yang ditunjukkan oleh register BX yaitu
'A' dengan perintah MOV DL,[BX]. Tanda kurung siku menyatakan bahwa yang diambil adalah
nilai yang ditunjuk oleh register BX BUKAN mengambil nilai BX. Setelah itu kita mencetak karakter tersebut dengan interupsi 21h servis 02 dimana kode ASCII dari karakter yang ingin dicetak telah dimasukkan pada register DL.
Pada perintah ADD BX, 2 artinya menambahkan nilai 2 pada BX sehingga kini BX akan
berjalan sebanyak 2 byte dan menunjuk pada data 'C' sebagai berikut : BX=103
_
A B C D E F
[Type text] Page 17 Kini BX telah menunjuk pada alamat tempat data 'C' berada, sehingga pada pencetakan karakter selanjutnya, yang tercetak adalah karakter 'C'.
Catatan:
satu karakter menggunakan satu byte memory.
Base Relative Addressing
Jenis addressing ini digunakan untuk mengakses suatu tabel dengan mengambil alamat efektifnya. Alamat efektif dari tabel tersebut nanti akan digunakan sebagai patokan untuk mengakses data lain pada tabel tersebut. Register yang digunakan sebagai penunjuk alamat efektif ini adalah register BX,BP,SI dan DI.
Berikut contoh program mengakses data menggunakan Base Relative Addressing: .MODEL SMALL .CODE ORG 100h TData : JMP Proses Tabel DW 11h,50h,0Ah,14h,5Ah Proses: LEA BX,Tabel MOV AX,Tabel ADD AX,[BX]+2 ADD AX,[BX]+4 ADD AX,[BX+6] ADD AX,[BX+8] INT 20h END TData
Pertama-tama program mendefinisikan suatu tabel yang berisi data 11h,50h,0Ah,14h dan 5Ah. Data ini akan disimpan dalam memory sebagai berikut:
[Type text] Page 18 0011 0050 000A 0014 005A
Alamat Offset: 103 105 107 109 10A
Setelah itu alamat efektifnya diambil dengan menggunakan register BX dengan perintah LEA BX, Tabel sehingga BX akan menunjuk pada alamat data yang pertama.
BX=103 _
0011 0050 000A 0014 005A
Alamat Offset: 103 105 107 109 10A
Dengan perintah MOV AX, Tabel maka AX akan berisi nilai pada word pertama
variabel 'Tabel', yaitu 11. Dengan BX yang telah menunjuk pada data pertama (0011) maka dapat dijadikan sebagai patokan untuk mengakses data yang lain.
BX BX+2 BX+4 BX+6 BX+8
_ _ _ _ _
0011 0050 000A 0014 005A
Alamat Offset: 103 105 107 109 10A
Yang perlu diperhatikan adalah bahwa kita mengakses data yang lain terhadap BX tanpa merubah posisi dari penunjuk BX, jadi BX tetap menunjuk pada offset Tabel. Register BX ditambah dengan 2 karena data terdefinisi sebagai word (2 byte). Terlihat bahwa menambah BX di dalam dan di luar kurung siku adalah sama.
Direct Indexed Addressing
Direct Indexed Addressing digunakan untuk mengambil alamat efektif dari suatu data dan mengakses data dengan menggunakan register DI atau SI. Sebagai contoh tanggal dikeluarkannya ROM BIOS oleh komputer.
[Type text] Page 19 Tanggal dikeluarkannya ROM BIOS pada setiap komputer terdapat pada alamat mulai F000h:FFF5h sampai F000h:FFFCh. Pada daerah ini akan terdapat 8 byte (8 huruf) yang berisi tanggal dikeluarkannya ROM BIOS. Tanggal yang tercantum menggunakan format penulisan tanggal Amerika, misalnya 04/03/90 artinya 14 Maret 1990.
Program ini adalah contoh melihat tanggal versi BIOS Komputer: .MODEL SMALL
.CODE ORG 100h Proses :
MOV AX,0F000h ; Masukkan nilai F000 pada AX
MOV ES,AX ; Copykan nilai AX ke ES
MOV BX,0FFF5h ; Penunjuk Offset
XOR SI,SI ; Jadikan SI=0
MOV CX,8 ; Counter untuk LOOP
Ulang:
MOV DL,ES:[BX][SI] ; Ambil isi alamat ES:BX+SI
MOV AH,02h ; Nilai servis mencetak karakter
INT 21h ; cetak karakter
INC SI ; SI:=SI+1
LOOP Ulang ; Lompat ke Ulang sampai CX=0
INT 20h ; Selesai ! kembali ke DOS
END Proses
Bila program dijalankan, maka akan ditampilkan: 18/08/94 <tiap komputer hasilnya dapat berbeda>
Karena tidak dapat mengisikan sebuah nilai secara langsung kepada segment register, oleh karena itu digunakan register AX sebagai perantara sebagai berikut:
MOV AX,0F000h MOV ES,AX
[Type text] Page 20 Setelah itu register BX yang kita gunakan sebagai penunjuk offset, diisi dengan nilai FFF5, sedangkan SI yang nantinya digunakan sebagai displacement (perpindahan) kita jadikan nol. Register CX yang digunakan sebagai counter diisi dengan 8, sesuai dengan jumlah LOOP yang dinginkan:
MOV BX,0FFF5h XOR SI,SI
MOV CX,8
Dengan segment register ES dan offset pada register BX+SI data pada alamat F000:FFF5 dapat diambil. Segment register ES ini harus dituliskan, karena bila tidak dituliskan maka segment yang digunakan adalah segment default atau segment register DS. Register SI
digunakan sebagai perpindahan terhadap register BX, [BX][SI] artinya register BX+SI.
MOV DL,ES:[BX][SI] MOV AH,02h
INT 21h INC SI LOOP Ulang
Proses diulangi sampai 8 karakter tanggal dikeluarkannya ROM BIOS tercetak semua.
Based Indexed Addressing
Jenis addressing ini biasanya digunakan untuk mengakses suatu record atau suatu array 2 dimensi. Contoh program mengakses array dengan base indexed addressing dapat dilihat di bawah ini: .MODEL SMALL .CODE ORG 100h TData : JMP Proses Mahasiswa STRUC
[Type text] Page 21
Nim DW 0 ; 2 byte
Tinggi DB 0 ; 1 byte
Nilai DB 0,0,0,0 ; 4 byte
Mahasiswa ENDS
Absen Mahasiswa 10 DUP (<>) Proses:
LEA BX,Absen ; BX Menunjuk Offset Absen
ADD BX,21 ; BX Menunjuk pada Record ke 4
XOR SI,SI ; SI=0
MOV [BX][SI].Nim ,0099h ; NIM, record ke 4
MOV [BX][SI].Tinggi ,10h ; Tinggi, record ke 4
MOV [BX][SI+1].Nilai,78h ; Nilai pertama
MOV [BX][SI+2].Nilai,99h ; Nilai kedua
MOV [BX][SI+3].Nilai,50h ; Nilai keempat
MOV [BX][SI+4].Nilai,83h ; Nilai kelima
INT 20h ; Selesai !!
END TData
Pada program di atas dapat dilihat bagaimana based indexed addressding memudahkan dalam mengakses suatu array record.
Mahasiswa STRUC Nim DW ?
Tinggi DB ? Nilai DB ?,?,?,? Mahasiswa ENDS
Absen Mahasiswa 10 DUP (<>)
Perintah "STRUC" digunakan untuk mendefinisikan suatu record dan diakhiri dengan "ENDS". Field-field yang didefinisikan untuk record mahasiswa ini adalah 2 byte untuk NIM, 1 byte untuk Tinggi, 4 byte untuk Nilai.
[Type text] Page 22 Jadi besar satu record adalah 7 byte. Pada baris selanjutnya didefinisikan 10 buah record
mahasiwa dengan perintah DUP. Tanda cryptic "(<>)" digunakan untuk menginialisasi nilai pada
array menjadi nol. ADD BX,21 XOR SI,SI
Program akan memasukan data pada record ke 4, dan karena 1 record menggunakan 7 byte, maka BX kita tambah dengan 21 supaya BX menunjuk pada record ke 4. Register SI yang nantinya kita gunakan sebagai perpindahan dijadikan 0.
MOV [BX][SI].Nim ,0099h MOV [BX][SI].Tinggi ,10h
Dengan BX yang telah menunjuk pada record ke 4, maka dapat langsung memasukkan nilai untuk NIM dan Tinggi pada record ke 4.
MOV [BX][SI].Nilai ,78h MOV [BX][SI+1].Nilai,99h MOV [BX][SI+2].Nilai,50h MOV [BX][SI+3].Nilai,83h
Kini perhatikah bahwa dalam memasukkan angka untuk variabel "nilai" yang mempunyai 4
byte bisa digunakan register SI sebagai perpindahan. Perintah MOV [BX][SI] akan menunjuk pada byte pertama untuk variabel nilai sedangkan perintah [BX][SI+1] akan menunjuk pada byte kedua untuk variabel nilai, demikianlah seterusnya.
[Type text] Page 23
P3.2 Studi Kasus
Sebuah karakter disertai dengan warna tentunya akan lebih menarik. Untuk itu dapat menggunakan interupsi 10h dengan aturan pemakaiannya sebagai berikut:
INPUT AH = 09h
AL = Kode ASCII dari karakter yang akan dicetak BH = Nomor halaman (0 untuk halaman 1)
BL = Atribut atau warna dari karakter yang akan dicetak CX = Banyaknya karakter tersebut akan dicetak
Setelah semua register dimasukkan nilainya maka lakukanlah interupsi 10h. Perlu anda perhatikan bahwa interupsi ini mencetak karakter tanpa menggerakkan kursor.
.MODEL SMALL .CODE
ORG 100h Proses :
MOV AH,09h ; Nilai servis untuk mencetak karakter
MOV AL,'A' ; AL = Karakter yang akan dicetak
MOV BH,00h ; Nomor Halaman layar
MOV BL,93h ; Warna atau atribut dari karakter
MOV CX,03h ; Banyaknya karakter yang ingin dicetak
INT 10h ; Service yang menghasilkan warna
INT 20h END Proses
Bila program di atas dieksekusi maka akan ditampilkan huruf 'A' sebanyak 3 kali dengan warna dasar biru kedip dan warna tulisan Cyan (sesuai dengan nilai register BL 93).
Hasilnya seperti berikut:
C:\> warna AAA
[Type text] Page 24 Bagaimana membuat program mencetak kalimat dengan menggunakan Base Relative Addressing? .MODEL SMALL .CODE ORG 100h TData : JMP Proses
Kalimat DB 'NYAMUK GORENG' ; 13 karakter Proses:
XOR BX,BX ; BX=0 Untuk penunjuk Offset
MOV CX,13 ; Counter LOOP
Ulang :
MOV DL,Kalimat[BX] ; Ambil karakter yang ke BX
MOV AH,02 ; Servis untuk cetak karakter
INT 21h ; Cetak Karakter
INC BX ; BX:=BX+1
LOOP Ulang ; Lompat ke Ulang sampai CX=0
INT 20h ; Selesai, kembali ke DOS !!
END TData
Bila program di atas dijalankan maka akan menghasilkan output sebagai berikut: NYAMUK GORENG
Pada program tersebut register BX dijadikan sebagai pencatat offset dari "kalimat".
Dengan nilai BX sama dengan nol (0), akan menunjuk pada karakter pertama dari Kalimat (ingat! XOR dengan bilangan yang sama pasti menghasilkan 0). Setelah itu program memberikan nilai 13 kepada CX sebagai penghitung banyaknya LOOP yang akan terjadi.
[Type text] Page 25
_ _
N Y A M U K G O R E N G
Pada perintah MOV DL,Kalimat[BX], register BX digunakan untuk menunjukkan offset dari
kalimat. Dengan demikian saat pertama kali yang dimasukkan pada register DL untuk dicetak adalah karakter 'N' kemudian BX ditambah satu sehingga BX menunjuk pada karakter 'Y'. Demikian seterusnya sampai seluruh kalimat tersebut tercetak.
P3.3 Latihan
1. Tuliskan bentuk Format penulisan program Assembly dengan menggunakan TASM
(TURBO ASSEMBLER) yang Anda ketahui beserta langkah-langkahnya dan cara
menjalankannya hingga menjadi file .com.
2. Apakah fungsi dari service 09h , interrupt 21h? Register apa saja yang digunakan dan
jelaskan cara penggunaannya.
3. Buatlah program sederhana menggunakan Turbo Assembler.
P3.4 Daftar Pustaka
Lukito, Ediman. Dasar-dasar Pemrograman dengan Assembler 8088. PT. Elex Media Komputindo. Jakarta. 1990.
Pemrograman Bahasa Assembly Edisi Online Versi 1.0. Agustus 2011. http://www.scribd.com/doc/46495287/Sto-Assembly