Struktur Program
Perintah untuk mengassembly dan link
program ini di tunjukan oleh turbo assembler
dan Microsoft assembler sebagai berikut :
Turbo assembler MASM
Tasm hello; masm
hello;
Tlink hello link
hello;
2.1.1
Segment
Program
yang berjalan di DOS dibagi ke dalam tiga segment utama. Masing-masing
segmen memiliki nilai tipe yang berbeda
: segmen code (di tunjukan oleh CS) mengandung kode program , segmen data
(ditunjukan oleh DS) mengandung variable, segmen stack (ditunjukan oleh SS)
mengandung stack program .
Setiap
segmen ditunjukan oleh register segmen . sebuah segmen mungkin hanya 1 paragraf
(10h byte) dan paling besar 64k bytes . setiap segmen mengadung intruksi atau
data yang memiliki offset relative terhadap register segmen (CS,DS,SS atau ES).
Offset adalah jarak objek dari permulaan segmennya.
Title
program Hello world [1]
[2]
; program ini menampilkan
pesan “Hello,world” [3]
[4]
dosseg [5]
.
model small [6]
.
stack 100h [7] [8]
.
data [9]
.
hello_message db ‘Hello, world !’ , 0dh, 0ah, ‘$’ [10]
[11]
.
code [12]
main
proc [13]
mov
ax, @data [14]
mov
ds, ax [15] [16]
mov
ah, 9 [17]
mov
dx, offset hello_message [18]
int
21h [19]
mov
ax, 4000h [20]
[21]
int
21h [22]
main
endp [23]
endp
main [24]
Segmen code adalah tempat
intruksi mesin program berada.
Segmen stack mengikuti .MODEL, dan
biasanya kita menyediakan 256 byte ruang stack.
Perintah .MODEL, memilih
standar model memori untuk program bahasa assembly. Model memory mungkin
sebagai cetak biru standar konfigurasi, yang mentukan bagaimana segmen di
hubungkan bersama . setiap model memori memiliki sekumpulan batasan berbeda
sebagai maksimum ruang yang tersedia untuk kode dan data
Berbagai macam memori model didefinisikan oleh jumlah
byte yang digunakan untuk kode (intruksi) dan data (variable). Tabel berikut
menunjukan rangkuman perbedaan antara
berbagai tipe model :
Model
|
Penjelasan
|
Tiny
Small
Medium
Compact
Large
Huge
|
Kode
dan data digabung harus <= 64 K
Kode
<= 64 K, data <= 64 K
Data
<= 64 K, kode ukuran sembarang
Kode
<= 64 K, data ukuran sembarang
Keduanya
lebih besar dari 64 K
Sama
seperti model LARGE hanya arrayboleh lebih dari 64 K
|
Instruksi Definisi Data
Variabel adalah nama
simbolik untuk lokasi dalam memori tempat data disimpan. Dalam bahasa asembly,
variabel diidentifikasikan oleh label. Setiap label menunjukan lokasi awal
variabel. Kita katakan bahwa offset label adalah jarak dari awal segmen ke awal
variabel.
Label tidak menunjukkan
berapa banyak byte memori yang dilokasikan untuk variabel. Contoh, jika kita
mendeklarasikan array 4 karakter, label A List hanya mengidentifikasikan offset
karakter awal (A).
Jadi jika
huruf awal pada offset 0 maka selanjutnya pada offset 1, 2 dan seterusnya. Kita
menggunakan memori berdasarkan pada tipe yang didefinisikan sebelumnya :
Deskripsi
|
Byte
|
Attribut
|
|
DB
|
Define Byte
|
1
|
Byte
|
DW
|
Define Word
|
2
|
Word
|
DD
|
Define Doubleword
|
4
|
Doubleword
|
DF, DP
|
Define Far
Pointer
|
6
|
Far Pointer
|
DQ
|
Define Quadword
|
8
|
Quadword
|
DT
|
Define Tenbytes
|
10
|
Tenbytes
|
Define Byte (DB)
Perintah
DB Mengalokasikan memori untuk satu atau lebih nilai 8-bit. Diagram sintak
berikut menunjukkan bahwa nama adalah pilihan, dan hanya satu initial value
yang diperlukan . jika diperlukan lebih dari satu maka dipisahkan dengan koma:
[name] DB initialvalue [,
initialvalue] ...
Define Word (DW)
Perintah
DW membuat tempat penyimpanan untuk satu atau lebih word 16-bit. Sintaknya
adalah sebagai berikut:
[name] DW initial valve
[,initialvalue]...
Define Doubleword (DD)
Perintah DD
membuat tempat penyimpan untuk satu atau lebih doublewords 32-bit. Sintaknya
sebagai berikut:
[name]
DD initialvalue [, initialvalue]..
Operator DUP
Operator DUP
hanya tampil sesudah perintah pengalokasian memori (DB,DW,DD,DQ,DT). Dengan
DUP, Anda dapat mengulang satu atau lebih nilai ketika mengalokasikan memori.
Ini khususnya berguna ketika pengalokasian ruang untuk tabel atau array. Contoh
contoh berikut menginisialisasi tempat penyimpan dengan nilai default:
db 20 dup (0) ; 20 byte semuanya sama dengan
0
db 20 dup (?) ; 20
byte tidak diinisialisasi
db 4 dup (‘ABC’) ; 12
byte ; “ABCABCABCABCABC”
db 4096 dup (0) ;
4096-byte, semuanya nol
dw 5 dup (1000h) ; 5
word, masing masing sama dengan nol
dw 5 dup (?) ; 5
word tidak diinisialisasi
dd 100h dup (?) ; 256
doubleword (1024 byte)
Instruksi Transfer Data
Instruksi MOV
Intruksi
MOV menyalin data dari satu operand ke operand lain maka ini disebut instruksi
transfer data. Pada prosesor 8086 dan
80286, operandnya 8 atu 16 bit. Pada 80386, operand 32-bit juga mungkin
digunakan. Sintaknya sebagai berikut:
MOV tujuan, sumber
Offset
Anda
dapat menambahkan offset pada operand memori. Dengan ini maka Anda dapat
mengakses nilai data yang tidak mempunyai label. Misalkan kita punya daftar
nomor 8-bit yang disebut array. Kemudian, array+1 adalah nama yang mengacu pada
offset 1 byte lebih dari array.
Keduanya, array dan array+1,
mempunyai offset yang dihitung oleh assembler sebagai offset fixed dari
permulaan segmen data. Alamat-alamat tersebut digunakan unrtuk mengakses memori
pada offset yang diberikan, seperti contoh berikut:
.data
array db 10, 20, 30, 40, 50
.code
mov al,
array ; isi =10
mov dl, array+1 ;isi=20
mov dh, array+4 ;isi=50
Ukuran
attribut kedua operand harus
sesuai. Dalam contoh berikut, int _1 hanya dapat dipasangkan dengan register 16-bit.
Juga, byte_1 hanya dapat dipasangkan dengan register 8-bit.
Perintah XCHG
Perintah
XCHG menukarkan isi dari dua register atau antara register dengan variabel.
Setidaknya sebagai berikut:
XCHG opl, op2
Dua
operand mungkin register atau operand memori, selama satu operand-nya adlah
register.
XCHG adalah cara yang efisien untuk menukarkan dua
operand 8-bit atau 16-bit karena tidak memerlukan register ketika untuk
menyimpan nilai sementara. Khususnya dalam aplikasi pengurutan, intruksi ini
mempunyai keuntungan karena kecepatannya. Satu atau kedua operand mungkin
register, atau register mungkin dikombinasikan dengan operand memori. Dua
operand memori tidak boleh digunakan secara bersamaan.
Operasi Stack
Stack
adalah buffer memori khusus yang digunakan untuk program aplikasi dan DOS. Dua register berperan dalam stack,
yaitu register SS dan register SP. Register SS (Stack segment) mengandung
lokasi basis stack, sementara register SP (stack pointer) mengandung alamat
puncak stack tempat nilai terakhir dimasukkan.
Instruksi Dasar Aritmatika
Hampir semua
program komputer dapat melaksanakan operasi aritmatik. Set instruksi intel
mempunyai instruksi untuk aritmatik integer, menggunakan operand 8-bit dan
16-bit. Operasi floating-point ditangani dalam salah satu dari ketiga cara
berikut :
1. Chip koprosessor matematika khusus (8087, 80287,
80387)
2. Rutin perangkat lunak yang berfungsi koprosessor, atau
3. Perangkat lunak yang mengkonversi nilai floating-point
ke integer, menghitung, dan kemudian mengkonversi bilangan kembali ke
floating-point.
Instruksi INC dan DEC
Instruksi INC
dan DEC menambah 1 atau mengurang 1 nilai dari suatu operand, secara berurutan.
Syntaxnya sebagai berikut :
INC tujuan
DEC tujuan
Tujuan
mungkin register 8-bit atau 16-bit atau operand memori. INC dan DEC lebih cepat
dari instruksi ADD dan SUB. Semua status flag dipengaruhi, kecuali flag Carry.
Contohnya sebagai berikut :
INC AL
DEC BX
INC membyte
DEC byte ptr membyte
DEC memword
INC word ptr memword
Instruksi ADD
Instruksi ADD
menjumlahkan operand sumber 8 atau 16-bit ke operand tujuan pada ukuran yang
sama. Syntaxnya sebagai berikut :
ADD tujuan, sumber
Sumber tidak
diubah oleh operasi. Ukuran operand harus sesuai dan hanya satu operand memori
yang digunakan. Register segment tidak boleh jadi tujuan. Semua status flag dipengaruhi.
Contoh sebagai berikut:
ADD AL,1
ADD CL, AL
ADD BX, 1000h
ADD var1, AX
ADD DX, var1
ADD var1, 10
Instruksi SUB
Instruksi SUB
mengurangkan operand sumber dari operand tujuan. Syntax SUB sebagai berikut :
SUB
tujuan, sumber
Ukuran kedua
operand harus sesuai, dan hanya boleh satu operand memori. Register segment
tidak boleh menjadi operand tujuan. Pada level bit, yang terjadi adalah operand
source dinegasikan kemudian ditambahkan ke tujuan. Contoh 4-1 adalah 4+(-1).
Mengingat kembali bahwa notasi twos komplemen digunakan untuk menegasikan
bilangan, maka -1 disimpan sebagai 11111111b.
0 0 0 0 0 1 0 0 (4)
+ 1 1 1 1 1 1 1 1 (-1)
0 0 0 0 0 0 1 1 (3)
Penjumlahan
ini menghasilkan carry pada bit yang paling tinggi (menset carry flag), tetapi
carry sendiri diabaikan ketika bekerja dengan bilangan bertanda.
Contoh SUB digunakan dengan berbagai tipe operand seperti berikut :
SUB
AL, 1
SUB
CL, AL
SUB
BX, 1000h
SUB
var1, AX
SUB
DX, var1
SUB
var1, 10
Flag yang Dipengaruhi oleh ADD dan SUB
Jika ADD atau
SUB menghasilkan nilai nol maka flag zero diset. Jika hasil negative maka flag
tanda diset. Pada contoh berikut, baris 2 menghasilkan nilai nol dan baris 4
menghasilkan nilai -1 (FFFFh).
MOV AX, 10
SUB AX, 10
MOV BX, 1
SUB BX, 2
Flag zero
diset ketika hasil operasi aritmatik sama dengan nol. Sebagai catatan, INC dan
DEC memengaruhi flag zero, tetapi tidak memengaruhi flag carry :
MOV BL, 4Fh
ADD BL, 0B1h
MOV AX, 0FFFFh
INC AX
Keputusan
kapan operand bertanda atau tidak bertanda seluruhnya diserahkan kepada
pemrogram. CPU memperbaharui flag carry dan overflow untuk menangani dua
kemungkinan. Untuk alas an ini, kita perlu membahas dua tipe operasi secara
terpisah.
1.
Operasi tidak
bertanda (unsigned)
Untuk aritmatik
tidak bertanda, kita hanya peduli pada flag carry. Jika hasil operasi
penjumlahan terlalu besar untuk operand tujuan maka flag carry diset. Contoh,
penjumlahan 0FFh + 1 seharusnya sama dengan 100h, tetapi hanya dua digit paling
bawah (00) yang pas untuk AL. Oleh sebab itu, operasi menset flag carry :
MOV AX, 00FFh
ADD AL, 1 ;
AX = 0000, CF = 1
Dalam
konteks ini, ADD adalah operasi 8-bit karena AL yang digunakan. Jika kita ingin
mendapatkan jawaban yang benar maka kita harus menambah 1 AX dan membuatnya
menjadi operasi 16-bit.
2.
Operasi bertanda
(signed)
Flag overflow
diset ketika operasi penjumlahan atau pengurangan menghasilkan bilangan
bertanda diluar range.
Contoh 1 :
MOV
AL, +126 0 1 1 1 1
1 1 0
ADD AL, 2 + 0
0 0 0 0 0 1 0
1
0 0 0 0 0 0 0 AL = -128 ?, OF = 1
Mode Pengalamatan
Kumpulan
instruksi Intel menyediakan cara yang bervariasi untuk menemukan lokasi memori.
Cara-cara ini disebut mode pengalamatan. Cara ini dapat memudahkan pemrosesan
list dan untuk mengacu struktur data yang kompleks.
Setiap
contoh berikut mengacu pada isi memori pada alamat efektif.
Mode
|
Contoh
|
Keterangan
|
Direct
|
Op1
bytelist [200]
|
Alamat
efektif adalah displacement
|
Register
Indirect
|
[BX]
[SI]
[DI]
|
EA
adalah isi basis atau index
|
Based
or Indexed
|
list
[BX]
[SI+list]
[BP+4]
list
[DI]
[BP-2]
|
EA
adalah penjumlahan register basis atau index dengan displacement.
|
Base-indexed
|
[BX+SI]
[BX][DI]
[BP-DI]
|
EA
adalah penjumlahan register basis dan register index.
|
Base-indexed
with displacement
|
[BX+SI+2]
list
[BX+SI]
list
[BX][SI]
|
EA
adalah penjumlahan register basis, index dan displacement
|
Operand Register
Operand
register mungkin berupa register 8 atau 16 bit. Secara umum, mode pengalamatan
register adalah mode paling efisien karena register adalah bagian dari CPU dan
tidak memerlukan pengaksesan memori. Beberapa contoh menggunakan instruksi MOV
sebagai berikut :
mov
ax, bx
mov
cl, al
mov
si, ax
Operand Immediate
Operand
immediate adalah ekspresi konstan, berupa angka, karakter atau ekspresi
aritmatik. Assembler harus menentukan nilai operand immediate pada waktu
assembly. Nilainya disisipkan langsung ke dalam instruksi mesin. Contoh operand
immediate sebagai berikut.
Contoh
|
Ukuran (bit)
|
10
|
8
|
‘A’
|
8
|
‘AB’
|
16
|
65535
|
16
|
(2+3)/5
|
8
|
Contoh terakhir,
(2+3)/5 adalah ekspresi yang dievaluasi pada saat assembly.
Operand Direct
Operand
direct mengacu pada isi memori offset variabel. Assembler menjaga nilai offset
setiap label, membuatnya memungkinkan untuk menghitung alamat efektif operand
direct. Pada contoh ini, isi memori pada lokasi count dipindah ke AL :
count
db 20
…
…
mov
al, count ; al = 20
Operator Offset
Ketika diperlukan pemindahan offset label ke
register atau variabel, digunakan operator offset. Oleh karena assembler
mengetahui offset setiap label sebagai program yang sedang di-assembly maka
mudah untuk menggantikan nilai offset ke dalam instruksi. Misalkan, offset
variabel aWord dalam contoh berikut adalah 0200h; instruksi MOV akan
memindahkan 200h ke dalam BX langsung:
aWord DS 1234
...
mov bx,offset aWord
1.
Operand tidak langsung
Jika offset variabel ditempatkan dalam register basis atau index
maka register menjadi pointer ke label. Untuk variabel yang mengandung element
tunggal, dia akan mempunyai nilai yang kecil; tetapi untuk daftar item, pointer
mungkin akan ditambah untuk menunjuk setiap element.
Contoh, jika kita membuat string dalam memori
pada lokasi 0200h dan menset BX ke offset string, kita dapat memproses elemen
dalam string dengan menjumlahkan offsetnya dengan BX, F terakhir berada pada
Code:
aString db “ABCDEFG”
...
...
mov bx,
offset aString ; BX=0200
add BX, 5 ;
BX=0205
mov
dl,[bx] ; DL=’F’
ilustrasi:
Default segmen . Jika BX, SI
atau DI digunakan, alamat efektif adalah default offset dari register DS (data
segment). BP, di sisi lain, merupakan offset dari register SS (stack segment). Umpamanya segment stack
dan segment data berada pada lokasi yang berbeda, dua pernyataan berikut akan
menimbulkan efek yan berbeda:
mov dl, [si]
mov dl, [bp]
2.
Based dan Indexed Operand
Operand basis dan indeks pada dasarnya sama; register ditambahkan
pada displacement untuk mendapatkan alamat efektif. Register yang dipakai
harus SI, DI, BX atau BP. Displacement
adalah angka atau label yang offset-nya diketahui pada waktu assembly. Notasi
mungkin dalam bentuk yang sama:
Register ditambahkan ke offset:
mov dx, array[bx]
mov dx, [di+array]
mov dx, [array+si]
Register ditambahkan ke konstanta
mov AX, [bp+2]
mov dl, [di-2]
mov dx, 2[si]
Contoh : Jika kita membuat array bernilai byte
yang disimpan dalam memori lokasi 0200h dan menset BX dengan 5 maka BX akan
menunjuk bilangan pada offset 5 ke dalam array. Contoh berikut ini sebagai
ilustrasi.
Code:
Array db 2,16,4,22,13,19,42,64,44,33
...
...
mov bx,5
mov al, array[bx]
Ilustrasi:
3.
Based-Indexed Operand
Alamat efektif operand dibangun oleh penggabungan register basis
dengan register index. Misalkan BX = 2002h dan SI = 6 instruksi berikut akan
menghitung alamat efektif 208h:
Teknik ini sering berguna untuk array dua dimensi, dimana BX dapat
menunjuk offset baris dan SI offset kolom. Contoh berikut, alamat efektif yang
dibangun oleh [bx+si] adalah 0157:
array db 10, 20, 30, 40, 50
db 60,
70, 80, 90, A0
db B0,
C0, D0, E0, F0
...
mov bx, offset array ;menunjuk pada array (0150)
add bx, 5 ;memilih baris kedua
mov si, 3 ;memilih kolom ke tiga
mov al, [bx+si];memilih nilai pada alamat efektif 0157
Ilustrasi
Dua buah register basis atau dua buah register index tidak dapat
digabungkan. Jadi, contoh beikut akan salah:
mov dl,[bp-bx] ;salah : dua register basis
mov ax,[si-di] ;salah
: dua register index
4.
Base-Indexed dengan displacement
Alamat efektif operand dibangun dengan menggabungkan register
basis, registerindex dan displacement. Contohnya sebagai berikut:
mov
dx, array[bx][si]
mov
ax, [bx+si+array]
add
dl, [bx+si+3]
sub
cx, array[bp+si]
Dengan menggunakan array dua dimensi kita tidak harus lagi menset
BX ke awal array. Kita hanya menset BX pada offset baris kedua, relatif
terhadap awal tabel, ini akan menyebabkan kode lebih sederhana:
CODE:
array db 10, 20, 30, 40, 50
db 60, 70, 80, 90, A0
db B0, C0, D0, E0, F0
...
mov bx, 5 ;memilih baris kedua
mov si, 2 ;memilih kolom ke tiga
mov al, array[bx+si] ;mengambil
nilai pada alamat efektif 0157
ilustrasi
5.
Penjumlahan serangkaian bilangan
Contoh program berikut menunjukan bagaimana bermacam-macam mode
pengalamatan bisa digunakan ketika mengakses elemen
sebuah array. Array berada pada offset 150, dan hasil penjumlahan akan disimpan
pada offset 153. Program berikut mungkin di-assemble dan dijalanlankan dalam
debug.
A
150
db
10, 20, 30, 0
A
100
mov
bx, 150
mov
si,2
mov
al,[bx]
add
al,[bx+1]
add
al,[bx+si]
mov
[153],al
int
20h
d 150,153
Tidak ada komentar:
Posting Komentar