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 P3.4. Daftar Pustaka .................................................................................................................. 25
[Type text]
Page 1
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 4. Mahasiswa dapat memahami konsep Addressing Mode dalam Assembler
[Type text]
Page 2
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 : Error messages : Warning messages : Passes Remaining memory
coba.ASM None None : 1 : 370k
C:\>dir coba.* Volume in drive C is S’to Directory of C:\ COBA COBA
[Type text]
OBJ ASM 2 file(s)
128 08-08-11 10:42p 128 08-08-11 10:41p 246 bytes 1,085,952 bytes free
Page 3
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.
COMPACT
[Type text]
Page 4
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 5
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 6
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 7
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 2. Variabel yang tidak dapat dimodifikasi isinya
[Type text]
Page 8
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: -
Masukkan service number Interrupt ke register AH.
[Type text]
Page 9
-
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 10
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
Displacement
DS
Label
DS
[BX]
DS
[BP]
SS
[SI]
DS
[DI]
DS
[BX] + Displacement
DS
[BP] + Displacement
SS
[DI] + Displacement
DS
[SI] + Displacement
DS
[BX] [SI] + Displacement
DS
[BX] [DI] + Displacement
DS
[BP] [SI] + Displacement
SS
[BP] [DI] + Displacement
SS
Direct
Register Indirect
Base Relative
Direct Indexed
Base Indexed
[Type text]
Page 11
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: MOV AL,BX
[Type text]
Page 12
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
.CODE [Type text]
Page 13
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 14
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 15
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:
Alamat Offset:
A
B
C
D
E
F
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 _
Alamat Offset:
A
B
C
D
E
F
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 _
Alamat Offset:
[Type text]
A
B
C
D
E
F
103
104
105
106
107
108
Page 16
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 17
Alamat Offset:
0011
0050
103
105
000A 0014 005A 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 _
Alamat Offset:
0011
0050
103
105
000A 0014 005A 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
Alamat Offset:
BX+2 BX+4 BX+6 BX+8
_
_
0011
0050
103
105
_
_
_
000A 0014 005A 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 18
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
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
Ulang:
END Proses
Bila program dijalankan, maka akan ditampilkan: 18/08/94 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 19
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 20
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 21
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 22
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 23
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
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 !!
Ulang :
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.
Kalimat[0] [Type text]
Kalimat[12] Page 24
_
_
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
[Type text]
Page 25