komputer
Selasa, 21 Juni 2011
MODE PENGALAMATAN
MODE PENGALAMATAN
Kumpulan intruksi 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 komplek. Juga, compile bahasa tingkat tinggi memerlukannya untuk membuat intruksi mesin yang lebih sedikit ketika set intruksi CPU menggunakan cara yang baik dalam pengacuan data.
Terdapat lima mode pengalamatan, ditunjukan dalam table mode pengalamatan dibawah. Dalam table, displacement berupa angka atau offset variable. Effective address operand mengacu pada offset (jarak) data dari awal segmen. BX dan BP adalah register basis, dan SI serta DI adalah register index. Setiap contoh berikut mengacu pada isi memori pada alamat efektif.
Mode | Contoh | Keterangan |
Direct | Op l 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 basi 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, register index dan displacement |
Table Mode Pengalamatan
Ø Operand register
Operand register mungkin berupa register 8 atau 16 bit. Secara umum,mode pengalaman register adalah 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 Immedite
Operand immediate adalah ekspresi konstan, seperti angka, karakter atau ekspresi aritermetik. Assembler harus menentukan nilai operand immediate pada waktu assembly. Nilainya disisipkan langsung kedalam intruksi mesin. Contoh operand immediate ditunjukan sebagai berikut. Contoh terakhir, (2+3)/5, adalah ekspresi yang dievaluasi pada saat assembly.
Contoh | Ukuran (bit) |
10 ‘A’ ‘AB’ 65535 (2+3)/5 | 8 8 16 16 8 |
Ø Operand Direct
Operand Direct mengacu pada isi memori offset variable. Assembler menjaga nilai offset setiap label, membuatnya memungkinkan untuk menghitung alamat efektif operand direct. Pada contoh, isi memori pada lokasi count dipindah ke AL:
Count db 20
…
…
Mov al, count ; AL= 20
Ø Operand Offset
Ketika diperlukan pemindahan offset label kedalam register atau variable, digunakan operator offset. Oleh karena assembler mengetahui offset setiap label sebagai program yang sedang di-assembly maka mudah untuk menggantikan nilai offset ke dalam intruksi. Misalkan, offset variable a word dalam contoh berikut adalah 0200h; intruksi MOV akan memindahkan 200h ke dalam BX langsung:
aWord dw 1234
…
Mov bx, offset a Word
Ø Operand tidak langsung
Jika offset variable yang ditempatkan dalam register atau variable, untuk variable yang mengandung element tunggal, dia akan mempunyai nilai yang kecil; tetapi untuk daftar item, pointer mungkin akan ditambah untuk menunjuk setiap elemen.
Ø Based dan Indexed Operand
Operand basis dan indekx pada dasrnya sama; register ditambahkan pada displacement untuk mendapatkan alamat efektif. Register yang dipakai harus SI, DI, BX dan BP. Displacement adalah angka atau label yang offsetnya 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 konstan :
Mov ax, [bp+2]
Mov dl, [di-2]
Mov dx, 2[si]
Ø Base-indexed Operand
Alamat efektif operand dibangun oleh penggabungan register basis dengan register index. Misalkan BX=2002h dan SI=6. Intruksi 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:
CODE :
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, 2 ; memilih kolom ke tiga
Mov al, [bx+si] ;mengambil nilai pada alamat efektif 0157
Ilustrasi
0150
10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | … | … | … |
[BX] [SI]
Ø Base-indexed dengan displacement
Alamat efektif operand dibangun dengan menggabungkan register basis, register index 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]
Ø 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 dijalankan 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 20
t
.
.
D 150, 153
INSTRUKSI DASAR ARITMETIKA
INSTRUKSI DASAR ARITMETIKA
Hampir semua program computer dapat melaksanankan operasi aritmetik. Set intruksi intel mempunyai intruksi untuk aritmetik integer, menggunakan operand 8-bit dan 16-bit. Operasi floating-foint ditangani dalam salah satu dari ketiga cara berikut :
1. Chip koprosesor matematika khusus (8087, 80287, 80387)
2. Rutin perangkat lunak yang berfungsi sama dengan koprosesor, atau
3. Perangkat lunak yang mengonversi nilai floating-point ke integer, menghitung, dan kemudian mengonversi bilangan kembali ke floating-point.
Ø Intruksi INC dan DEC
Intruksi INC dan DEC menambah satu atau mengurang 1 nilai dari suatu operand, secara berurutan. Sintaknya sebagai berikut :
INC tujuan
DEC tujuan
Tujuan mungkin register 8-bit atau 16-bit atau operand memori. INC dan DEC lebih cepat dari intruksi 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
Ø Intruksi ADD
Intruksi ADD menjumlahkan operand sumber 8 atau 16-bit ke operand tujuan pada ukuran yang sama. Sintaknya sebagai berikut :
ADD tujuan, sumber
Sumber tidak diubah oleh operasi. Ukuran operand harus sesuai dan hanya satu operand memori yang digunakan. Register segmen tidak boleh jadi tujuan. Semua status flag dipengaruhi.contoh sebagai berikut:
Add al, 1
Add cl, al
Add bx, 1000h
Add var 1, ax
Add dx, var1
Add var1, 10
Ø Intruksi SUB
Intruksi SUB mengurangkan operand sumber dari operand tujuan . sintak sebagai berikut:
SUB tujuan, sumber
Ukuran kedua operand harus sesuai, dan hanya boleh satu operad memori. Register segment tidak boleh menjadi operand tujuan. Pada level bit, yang terjadi adalah operand source dinegasikan kemudian ditambahkan kelevel 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
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 ADDdan SUB
Jika ADD dan 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 mengasilkan nilai -1(FFFFh).
Mov ax, 10
Sub ax, 10
Mov bx, 1
Sub bx, 2
Flag zero diset ketika hasil operasi aritmetik sama dengan nol. Sebagai catatan, INC dan DEC mempengaruri flag zero, tetapi tidak mempengaruhi 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 overlow untuk menangani dua kemungkinan. Untuk alas an ini, kita perlu membahas dua tipe operasi secara terpisah.
Operasi tidak bertanda (unsigned). Untuk aritmetika 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 a1,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, membuatnya menjadi operasi 16-bit.
Mov ax, 5501h
Add ax, 2 ; AX =55FF, CF = 1
Operasi bertanda. Flag overlow diset ketika operasi penjumlahan atau pengurangan menghasilkan bilangan bertanda diluar range.
Contoh1:
Mov a1, +126 0 1 1 1 1 1 1 0
Add a1, 2 + 0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 0 AL = -128 ?, OF = 1
Langganan:
Postingan (Atom)