WELCOME TO MY BLOG

Selasa, 27 Agustus 2019

Struktur Program Bahasa Assembly


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:
mov al, [bx +si]
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