CHAPTER 3 ADDRESSING MODES

  CHAPTER 3  ADDRESSING MODES


PENDAHULUAN


Pengembangan perangkat lunak yang efisien untuk mikroprosesor membutuhkan pemahaman yang lengkap mengenai addressing modes (mode pengalamatan) yang digunakan oleh setiap instruksi. Pada bab ini, instruksi MOV (memindahkan data) digunakan untuk menjelaskan mode pengalamatan data. Instruksi MOV mentransfer byte atau word data antara dua register atau antara register dan memori pada mikroprosesor 8086 hingga 80286. Pada 80386 dan seterusnya, instruksi MOV dapat mentransfer byte, word, maupun doubleword.

Dalam menjelaskan mode pengalamatan memori program, instruksi CALL dan JUMP menunjukkan bagaimana alur program dapat dimodifikasi.

Mode pengalamatan data meliputi: register, immediate, direct, register indirect, base plus index, register-relative, dan base relative plus index pada mikroprosesor 8086 hingga 80286. Pada 80386 dan yang lebih baru juga terdapat mode pengalamatan scaled-index untuk mengakses data memori.

Mode pengalamatan memori program meliputi: program-relative, direct, dan indirect. Bab ini juga menjelaskan operasi stack memory sehingga instruksi PUSH dan POP beserta operasi stack lainnya dapat dipahami.

 3–1 DATA-ADDRESSING MODES


gambar 3-1

Instruksi: MOV AX, BX

MOV: Ini adalah opcode (kode operasi) yang berarti "pindahkan" atau lebih tepatnya "salin".

AX: Ini adalah operan tujuan (Destination). AX adalah sebuah register 16-bit di dalam CPU.BX: Ini adalah operan sumber (Source). BX juga merupakan register 16-bit di dalam CPU.

Proses: Panah melengkung dari BX ke AX mengilustrasikan aliran data. Instruksi ini memerintahkan CPU untuk menyalin nilai yang saat ini ada di dalam register BX ke dalam register AX.

Hasil: Setelah instruksi dieksekusi, register AX akan memiliki nilai yang sama persis dengan register BX. Nilai asli di dalam BX tidak berubah karena operasi ini adalah penyalinan, bukan pemindahan.


gambar 3-2

Gambar 3-2 ini menjelaskan berbagai Mode Pengalamatan (Addressing Modes) pada arsitektur prosesor x86 (dimulai dari 8086 hingga Core2). Mode pengalamatan adalah cara-cara yang digunakan oleh CPU untuk menentukan lokasi data (operan) yang akan diproses oleh sebuah instruksi.

Secara sederhana, gambar ini menunjukkan bagaimana instruksi MOV (perintah untuk memindahkan/menyalin data) dapat mengambil data dari berbagai sumber (Source) dan mengirimkannya ke berbagai tujuan (Destination) dengan menggunakan metode kalkulasi alamat yang berbeda-beda (Address Generation).


Rumusnya adalah:
Alamat Fisik = (Isi Register Segmen × 10H) + Alamat Offset

Dalam semua contoh di gambar, register segmen yang digunakan adalah DS (Data Segment) yang nilainya 1000H. Maka, dasar perhitungan alamatnya adalah:
1000H * 10H = 10000H.
Nilai 10000H ini akan menjadi basis untuk semua kalkulasi alamat memori.


Penjelasan untuk setiap baris pada gambar:

1. Register Addressing

Instruksi: MOV AX, BX

Mode ini adalah yang paling sederhana dan cepat. Data dipindahkan langsung antar register di dalam CPU.

Proses:
Source (Sumber): Register BX.
Destination (Tujuan): Register AX.
CPU menyalin nilai yang ada di dalam register BX ke dalam register AX. Tidak ada akses ke memori sama sekali, sehingga eksekusinya sangat cepat.


2. Immediate Addressing

Instruksi: MOV CH, 3AH

Data yang akan dipindahkan merupakan bagian langsung dari instruksi itu sendiri. Angka 3AH (disebut nilai immediate) sudah "tertanam" dalam kode instruksi.

Proses:
Source: Data 3AH.
Destination: Register CH (bagian high-byte dari register CX).
CPU mengambil nilai 3AH langsung dari instruksi dan memasukkannya ke dalam register CH.


3. Direct Addressing

Instruksi: MOV [1234H], AX

Alamat memori tujuan ditulis secara eksplisit (langsung) di dalam instruksi. Angka 1234H adalah alamat offset.

Proses:
Source: Register AX.
Address Generation: CPU menghitung alamat fisik tujuan.
Offset = 1234H.
Alamat Fisik = (DS * 10H) + Offset = 10000H + 1234H = 11234H.
Destination: Lokasi memori di alamat 11234H.
Isi dari register AX disalin ke lokasi memori 11234H.


4. Register Indirect Addressing

Instruksi: MOV [BX], CL
Alamat offset memori tidak ditulis langsung, melainkan disimpan di dalam sebuah register (dalam contoh ini, BX).

Proses:
Source: Register CL.
Address Generation: CPU melihat ke dalam register BX untuk menemukan alamat offset.
Offset = Isi dari BX = 0300H (dari catatan EBX = 00000300H).
Alamat Fisik = (DS * 10H) + BX = 10000H + 0300H = 10300H.
Destination: Lokasi memori di alamat 10300H.
Isi dari register CL disalin ke lokasi memori yang alamatnya ditunjuk oleh isi register BX.


5. Base-plus-index Addressing

Instruksi: MOV [BX+SI], BP

Alamat offset dihitung dengan menjumlahkan isi dari register basis (BX atau BP) dan register indeks (SI atau DI).

Proses:
Source: Register BP.
Address Generation: CPU menjumlahkan nilai BX dan SI.
Offset = BX + SI = 0300H + 0200H = 0500H.
Alamat Fisik = (DS * 10H) + Offset = 10000H + 0500H = 10500H.
Destination: Lokasi memori di alamat 10500H.
Addressing ini berguna untuk mengakses data dalam array dua dimensi.


6. Register Relative Addressing

Instruksi: MOV CL, [BX+4]

Alamat offset dihitung dengan menjumlahkan isi sebuah register dengan sebuah nilai konstanta kecil (disebut displacement).

Proses:
Source: Lokasi memori yang alamatnya dihitung.
Address Generation:
Offset = BX + 4 = 0300H + 4H = 0304H.
Alamat Fisik = (DS * 10H) + Offset = 10000H + 0304H = 10304H.
Destination: Register CL.
CPU mengambil data dari alamat memori 10304H dan menyalinnya ke register CL. Mode ini sering dipakai untuk mengakses elemen tertentu dalam sebuah struktur data.

7. Base relative-plus-index Addressing

Instruksi: MOV ARRAY[BX+SI], DX

Ini adalah mode paling fleksibel yang menggabungkan tiga komponen untuk menghitung offset: sebuah variabel (displacement ARRAY), sebuah register basis (BX), dan sebuah register indeks (SI).

Proses:
Source: Register DX.
Address Generation:
Offset = ARRAY + BX + SI = 1000H + 0300H + 0200H = 1500H.
Alamat Fisik = (DS * 10H) + Offset = 10000H + 1500H = 11500H.
Destination: Lokasi memori di alamat 11500H.
Addressing ini sangat kuat untuk mengakses array dari struktur data yang kompleks.

8. Scaled Index Addressing

Instruksi: MOV [EBX+2*ESI], AX

Mode ini (hadir di prosesor 386 ke atas) mirip dengan mode sebelumnya, tetapi register indeks (ESI) dapat dikalikan dengan sebuah faktor skala (1, 2, 4, atau 8) sebelum dijumlahkan.

Proses:
Source: Register AX.
Address Generation:
Offset = EBX + 2 * ESI = 0300H + 2 * 0200H = 0300H + 0400H = 0700H.
Alamat Fisik = (DS * 10H) + Offset = 10000H + 0700H = 10700H.
Destination: Lokasi memori di alamat 10700H.
Addressing ini sangat efisien untuk mengakses elemen dalam sebuah array. Misalnya, jika array berisi data berukuran 2 byte (word), kita bisa menggunakan indeks ESI dan mengalikannya dengan 2 untuk langsung menuju elemen yang benar.


Register Addressing


tabel 3-1

Tabel ini menunjukkan berbagai contoh penggunaan instruksi MOV (singkatan dari move, yang berarti pindah/salin) dalam bahasa Assembly x86. Instruksi MOV adalah salah satu perintah paling dasar yang berfungsi untuk menyalin data dari satu lokasi (sumber) ke lokasi lain (tujuan).

Sintaks dasarnya adalah: MOV tujuan, sumber


Tabel ini mengilustrasikan beberapa aturan dan batasan penting dari instruksi MOV.

Assembly Language: Menunjukkan contoh kode instruksi yang ditulis.
Size: Menunjukkan ukuran data yang dipindahkan (misalnya, 8 bit, 16 bit, dll.).
Operation: Memberikan penjelasan dalam bahasa biasa tentang apa yang dilakukan instruksi tersebut, termasuk mengapa beberapa instruksi "Tidak diizinkan" (Not allowed).


Aturan-Aturan Penting :

1. Aturan Kesamaan Ukuran (Size Must Match)

Aturan paling fundamental dari MOV adalah ukuran data pada sumber dan tujuan harus sama persis.

✅ Contoh yang Valid:

MOV AL, BL (8-bit ke 8-bit)
MOV AX, CX (16-bit ke 16-bit)
MOV ECX, EBX (32-bit ke 32-bit)
MOV RAX, RDX (64-bit ke 64-bit)

❌ Contoh yang Tidak Valid:

MOV BL, DX: Ini tidak diizinkan karena kita mencoba menyalin data 16-bit (DX) ke dalam register 8-bit (BL). Ukurannya tidak cocok.


2. Aturan Register Segmen (Segment Registers)

Register segmen (seperti CS, DS, ES) memiliki aturan khusus karena mereka berfungsi untuk mengatur segmen memori.

✅ Valid: Kita bisa memindahkan data antara register umum dan register segmen.

MOV DS, AX: Menyalin isi AX (16-bit) ke register Data Segment (DS).
MOV BX, ES: Menyalin isi Extra Segment (ES) ke register umum BX.

❌ Tidak Valid:

MOV ES, DS: Memindahkan data secara langsung antar register segmen tidak diizinkan. Jika ingin melakukannya, kita harus menggunakan register umum sebagai perantara. Contoh:

MOV AX, DS  (salin DS ke AX)
MOV ES, AX  (salin isi AX ke ES)
MOV CS, AX: Register CS (Code Segment) tidak boleh menjadi tujuan dari instruksi MOV. CS berisi alamat dari instruksi yang sedang berjalan, dan mengubahnya secara langsung akan mengacaukan alur program. CS hanya bisa diubah oleh instruksi khusus seperti JMP atau CALL.


3. Aturan untuk Mode 64-bit

Mode 64-bit memperkenalkan register baru (R8-R15) dan beberapa perilaku baru.

✅ Contoh yang Valid:

MOV R8B, CL: Menyalin data 8-bit dari CL ke R8B (byte terendah dari register R8).
MOV BP, R10W: Menyalin data 16-bit dari R10W (word terendah dari register R10) ke BP.
MOV EDX, R9D: Menyalin data 32-bit dari R9D (doubleword terendah dari R9) ke EDX.

❌ Contoh yang Tidak Valid:

MOV R8B, CH: Ini tidak diizinkan karena batasan teknis dalam encoding instruksi mode 64-bit. Saat menggunakan register baru (R8-R15), akses ke register "high byte" lama (seperti AH, BH, CH, DH) menjadi tidak mungkin.



Immediate Addressing

gambar 3-4

Gambar 3-4  mengilustrasikan konsep ini melalui sebuah contoh.

Instruksi Program: MOV EAX, 13456H

MOV: Perintah untuk "memindahkan" atau menyalin data.

EAX: Register tujuan, yaitu sebuah lokasi penyimpanan 32-bit di dalam CPU.

13456H: Ini adalah data langsung (immediate value). Nilai heksadesimal 13456H ini merupakan bagian dari kode instruksi itu sendiri.

Proses: Panah pada diagram menunjukkan bahwa nilai 13456H diambil langsung dari instruksi program dan disalin ke dalam register EAX. Proses ini menimpa nilai lama apa pun yang mungkin ada di dalam register EAX sebelumnya.

Setelah instruksi ini dieksekusi, register EAX akan berisi nilai 00013456H (nilai 13456H yang dilengkapi dengan nol di depannya untuk memenuhi ukuran 32-bit).


tabel 3-2


1. MOV BL, 44

Instruksi ini menyalin nilai desimal 44 (yang setara dengan 2CH dalam heksadesimal) ke dalam register 8-bit BL. Angka 44 adalah data langsungnya.

2. MOV AX, 44H

Instruksi ini menyalin nilai heksadesimal 44H ke dalam register 16-bit AX. Karena AX berukuran 16 bit, nilai yang disimpan sebenarnya adalah 0044H. Akhiran H menandakan bahwa 44 adalah angka heksadesimal.

3. MOV SI, 0

Instruksi ini menyalin nilai desimal 0 ke dalam register 16-bit SI (Source Index). Nilai yang disimpan adalah 0000H. Ini adalah cara umum untuk mengosongkan atau me-reset nilai sebuah register.

4. MOV CH, 100

Instruksi ini menyalin nilai desimal 100 (setara dengan 64H) ke dalam register 8-bit CH (bagian high atau 8-bit atas dari register CX).

5. MOV AL, 'A'

Instruksi ini menyalin kode ASCII dari karakter 'A' ke dalam register 8-bit AL. Tanda kutip tunggal memberitahu assembler untuk menggunakan nilai numerik dari karakter tersebut, yaitu 41H.

6. MOV AH, 1

Instruksi ini menyalin nilai desimal 1 ke dalam register 8-bit AH. Catatan pentingnya adalah instruksi ini tidak diizinkan dalam mode 64-bit jika ada awalan REX, tetapi masih berfungsi dalam mode 32-bit atau 16-bit.

7. MOV AX, 'AB'

Instruksi ini menyalin dua karakter ASCII, yaitu 'A' dan 'B', ke dalam register 16-bit AX. Karena arsitektur x86 bersifat little-endian, penyimpanannya terbalik:
Karakter kedua ('B', kode ASCII 42H) masuk ke bagian low (AL).
Karakter pertama ('A', kode ASCII 41H) masuk ke bagian high (AH).
Sehingga, nilai di dalam AX menjadi 4142H.

8. MOV CL, 11001110B

Instruksi ini menyalin nilai biner 11001110 ke dalam register 8-bit CL. Akhiran B menandakan bahwa ini adalah angka biner.

9. MOV EBX, 12340000H

Instruksi ini menyalin nilai heksadesimal 32-bit 12340000H ke dalam register 32-bit EBX. Ini adalah contoh operasi dalam mode 32-bit.

10. MOV ESI, 12

Instruksi ini menyalin nilai desimal 12 ke dalam register 32-bit ESI (Extended Source Index). Nilai yang disimpan adalah 0000000CH.

11. MOV EAX, 100B

Instruksi ini menyalin nilai biner 100 (yang setara dengan desimal 4) ke dalam register 32-bit EAX. Register EAX akan berisi nilai 00000004H.

12. MOV RCX, 100H

Instruksi ini hanya berlaku pada mode 64-bit. Perintah ini menyalin nilai heksadesimal 100H ke dalam register 64-bit RCX. Register tersebut akan berisi nilai 0000000000000100H.


Direct Data Addressing

gambar 3-5


Gambar 3-5 menjelaskan sebuah instruksi transfer data MOV AL, [11234H] dalam sintaks assembly.

MOV: Perintah untuk memindahkan (menyalin) data.

AL: Register tujuan, yaitu bagian 8-bit terendah dari register EAX.

[11234H]: Ini adalah inti dari pengalamatan langsung. Angka 11234H adalah alamat memori yang sebenarnya dari data yang ingin diakses. Tanda kurung [] menandakan bahwa isinya adalah alamat memori, bukan nilai data itu sendiri.

Proses:

Prosesor membaca instruksi ini.
Ia mengenali 11234H sebagai alamat memori yang dituju.
CPU mengirimkan alamat 11234H ke bus alamat untuk mengakses lokasi tersebut di memori.
Memori merespons dengan memberikan data yang tersimpan di alamat 11234H, yaitu nilai 8AH.
Data 8AH ini kemudian disalin melalui bus data dan disimpan ke dalam register AL.

tabel 3-3

1. MOV AL, NUMBER

Penjelasan: Instruksi ini menyalin 1 byte (8 bits) data. Sumber datanya adalah lokasi memori yang diberi nama NUMBER, dan tujuannya adalah register AL (bagian 8-bit terendah dari register AX).

2. MOV AX, COW

Penjelasan: Perintah ini menyalin 1 word (16 bits) data. Data diambil dari lokasi memori bernama COW dan disalin ke register AX (register 16-bit).

3. MOV EAX, WATER

Penjelasan: Instruksi ini bekerja dengan data 1 doubleword (32 bits). Isi dari lokasi memori bernama WATER disalin ke register EAX (register 32-bit). Ini umum digunakan dalam mode 32-bit.

4. MOV NEWS, AL

Penjelasan: Arah transfer data di sini dibalik. Instruksi ini menyalin 1 byte (8 bits) data DARI register AL KE lokasi memori yang diberi nama NEWS.

5. MOV THERE, AX

Penjelasan: Serupa dengan baris sebelumnya, namun untuk data yang lebih besar. Perintah ini menyalin 1 word (16 bits) data DARI register AX KE lokasi memori bernama THERE.

6. MOV HOME, EAX

Penjelasan: Instruksi ini menyalin 1 doubleword (32 bits) data DARI register EAX KE lokasi memori bernama HOME.

7. MOV ES:[2000H], AL

Penjelasan: Ini adalah contoh yang lebih spesifik. Perintah ini menyalin 1 byte (8 bits) dari register AL ke sebuah alamat memori yang presisi. ES: adalah segment override yang memberitahu CPU untuk menggunakan Extra Segment. [2000H] adalah alamat offset di dalam segmen tersebut. Jadi, data disalin ke alamat ES:2000H.

8. MOV AL, MOUSE

Penjelasan: Perintah ini menyalin 1 byte (8 bits) dari lokasi memori MOUSE ke register AL. Catatan tambahan menjelaskan bahwa dalam mode 64-bit, MOUSE bisa menjadi alamat memori yang jauh lebih besar.

9. MOV RAX, WHISKEY

Penjelasan: Instruksi ini hanya berjalan pada CPU 64-bit. Perintah ini menyalin 1 quadword (64 bits atau 8 byte) dari lokasi memori WHISKEY ke register RAX (versi 64-bit dari register AX/EAX).


tabel 3-4



1. MOV CH, DOG

Instruksi ini menyalin 1 byte (8 bit) data dari lokasi memori yang diberi label DOG ke dalam register CH (register 8-bit bagian atas dari CX). Assembler akan secara otomatis mengganti DOG dengan alamat offset-nya di dalam segmen data.

2. MOV CH, DS:[1000H]

Perintah ini juga menyalin 1 byte (8 bit) ke register CH. Bedanya, ia menggunakan alamat offset numerik yang eksplisit, yaitu 1000H, di dalam Data Segment (DS). Seperti yang dicatat, bentuk ini jarang digunakan karena programmer lebih sering menggunakan label (seperti DOG) yang lebih mudah dibaca.

3. MOV ES, DATA6

Instruksi ini menyalin 1 word (16 bit) data dari lokasi memori DATA6 ke dalam register segmen ES (Extra Segment). Perintah ini digunakan untuk mengubah segmen memori yang ditunjuk oleh register ES. Nilai yang ada di DATA6 haruslah alamat segmen yang valid.

4. MOV DATA7, BP

Arah transfer di sini dibalik. Perintah ini menyalin 1 word (16 bit) data DARI register BP (Base Pointer) KE lokasi memori yang diberi label DATA7.

5. MOV NUMBER, SP

Serupa dengan baris sebelumnya, instruksi ini menyalin 1 word (16 bit) data DARI register SP (Stack Pointer) KE lokasi memori NUMBER. Ini bisa digunakan untuk menyimpan posisi puncak stack saat itu.

6. MOV DATA1, EAX

Instruksi ini adalah contoh operasi 32-bit. Ia menyalin 1 doubleword (32 bit) data DARI register EAX KE lokasi memori DATA1.

7. MOV EDI, SUM1

Perintah ini menyalin 1 doubleword (32 bit) data dari lokasi memori SUM1 ke dalam register EDI (Extended Destination Index). Ini adalah operasi umum dalam pemrosesan data 32-bit.



Register Indirect Addressing

gambar 3-6



Gambar 3-6 menjelaskan bagaimana CPU mengambil data 16-bit (3412H) dari memori dan memasukkannya ke dalam register AX menggunakan register EBX sebagai penunjuk.

Berikut adalah langkah-langkah kerjanya:

1. Penentuan Alamat Dasar (Base Address)

Register DS (Data Segment) berisi nilai 0100H. Dalam arsitektur x86, nilai ini menentukan alamat awal dari segmen data. Alamat fisik dasarnya dihitung dengan menggeser nilai ini 4 bit ke kiri (setara dengan mengalikan 16 atau 10H), sehingga menjadi 01000H.

2. Penunjuk Alamat (Pointer)

Register EBX berisi nilai 1000H. Dalam mode pengalamatan ini, EBX berfungsi sebagai penunjuk. Nilai di dalamnya adalah alamat offset—jarak dari alamat dasar segmen data.

Instruksi assembly untuk operasi ini kemungkinan besar akan terlihat seperti: MOV AX, [EBX]. Tanda kurung siku [ ] sangat penting; artinya, "gunakan nilai di dalam EBX sebagai alamat memori."

3. Perhitungan Alamat Efektif

CPU menghitung alamat fisik akhir tempat data berada dengan menjumlahkan alamat dasar segmen dan alamat offset.

Alamat Fisik = (Isi DS × 10H) + Isi EBX

Dalam contoh diagram, proses ini menghasilkan alamat akhir 00002000H. (Diagram ini sedikit menyederhanakan perhitungannya, tetapi hasil akhirnya adalah alamat 00002000H).

4. Pengambilan Data dari Memori

CPU sekarang mengakses memori pada alamat 00002000H.

Karena instruksinya adalah untuk memindahkan data 16-bit ke register AX, CPU akan membaca 2 byte:

Dari alamat 00002000H, ia membaca nilai 12H.

Dari alamat berikutnya, 00002001H, ia membaca nilai 34H.

5. Penyimpanan Data ke Register (Little-Endian)

Prosesor x86 menggunakan format little-endian. Artinya, byte dari alamat yang lebih rendah disimpan di bagian register yang lebih rendah.

Nilai 12H (dari alamat ...2000H) dimasukkan ke AL (8-bit low dari AX).

Nilai 34H (dari alamat ...2001H) dimasukkan ke AH (8-bit high dari AX).

Hasilnya, register AX sekarang berisi nilai gabungan 3412H.


tabel 3-5


1. MOV CX, [BX]

Perintah ini menyalin 1 word (16 bit) data ke dalam register CX. Data tersebut diambil dari lokasi memori yang alamatnya ditunjuk oleh register BX di dalam segmen data (data segment). Tanda [ ] berarti "lihat ke alamat yang disimpan di dalam...".

2. MOV [BP], DL

Instruksi ini menyalin 1 byte (8 bit) data dari register DL ke sebuah lokasi memori. Lokasi memori tersebut alamatnya ditunjuk oleh register BP (Base Pointer). Sesuai catatan di bawah tabel, ketika BP digunakan sebagai penunjuk, secara default ia mengacu pada segmen tumpukan (stack segment), bukan segmen data.

3. MOV [DI], BH

Perintah ini menyalin 1 byte (8 bit) data dari register BH ke lokasi memori yang alamatnya ditunjuk oleh register DI (Destination Index) di dalam segmen data.

4. MOV [DI], [BX]

Instruksi ini tidak valid atau tidak diizinkan. Arsitektur prosesor x86 tidak mengizinkan operasi pemindahan data langsung dari satu lokasi memori ([BX]) ke lokasi memori lain ([DI]) dalam satu instruksi, kecuali untuk instruksi khusus string. Data harus dipindahkan melalui register perantara terlebih dahulu.

5. MOV AL, [EDX]

Ini adalah contoh operasi 32-bit. Perintah ini menyalin 1 byte (8 bit) data ke dalam register AL. Data tersebut diambil dari lokasi memori yang alamatnya ditunjuk oleh register 32-bit EDX.

6. MOV ECX, [EBX]

Instruksi ini menyalin 1 doubleword (32 bit) data ke dalam register ECX. Sumber datanya adalah lokasi memori yang alamatnya ditunjuk oleh register 32-bit EBX.

7. MOV RAX, [RDX]

Ini adalah contoh operasi 64-bit. Perintah ini menyalin 1 quadword (64 bit) data ke dalam register RAX. Alamat memori linier dari data tersebut ditunjuk oleh register 64-bit RDX.


gambar 3-7


Register Penunjuk: Register EBX dalam contoh ini tidak berisi data itu sendiri, melainkan berisi alamat awal dari sebuah blok memori yang diberi nama TABLE. TABLE di sini adalah sebuah label yang mewakili alamat memori.

Akses Memori: Panah dari register EBX menunjuk ke lokasi memori pertama dari blok TABLE. Ini berarti, jika ada instruksi yang menggunakan [EBX], CPU akan mengakses data yang ada di alamat TABLE.

Akses Data Berikutnya: Keuntungan utama dari mode ini adalah kemudahan untuk mengakses data lain dalam blok yang sama. Dengan melakukan operasi aritmatika pada register EBX, kita bisa menunjuk ke lokasi lain. Contohnya:

Untuk mengakses Table + 1, cukup tambahkan 1 ke nilai EBX.

Untuk mengakses Table + 2, tambahkan 2 ke nilai EBX, dan seterusnya.



Base-Plus-Index Addressing

gambar 3-8


Locating Data with Base-Plus-Index Addressing
Proses Perhitungan Alamat

Alamat Dasar (Base Address): Register DS (Data Segment) berisi 0100H. Nilai ini dikalikan 10H (atau digeser 4 bit ke kiri) untuk mendapatkan alamat dasar segmen, yaitu 1000H.
Register Basis (Base Register): Register EBX (dalam contoh ini BX) berfungsi sebagai register basis dan berisi nilai 100H.
Register Indeks (Index Register): Register EDI (dalam contoh ini DI) berfungsi sebagai register indeks dan berisi nilai 0010H.

Penjumlahan: Ketiga nilai tersebut dijumlahkan untuk mendapatkan alamat memori akhir.

Alamat Akhir = (Alamat Dasar) + (Isi BX) + (Isi DI)
Alamat Akhir = 1000H + 100H + 0010H = 2010H

Proses Transfer Data
Instruksi yang diilustrasikan adalah MOV DX, [BX+DI].

Akses Memori: CPU mengakses alamat memori yang telah dihitung, yaitu 2010H.

Pengambilan Data: Karena tujuan (DX) adalah register 16-bit, CPU mengambil 2 byte data dari memori.

Dari alamat 2010H, diambil data 03H.
Dari alamat 2011H, diambil data ABH.

Penyimpanan ke Register: Sesuai aturan little-endian, byte dari alamat lebih rendah (03H) dimasukkan ke bagian low dari register tujuan (DL), dan byte dari alamat lebih tinggi (ABH) dimasukkan ke bagian high (DH).

Hasil Akhir: Register EDX (di mana DX adalah bagiannya) akan berisi nilai AB03H.


tabel  3-6


1. MOV CX, [BX+DI]

Perintah ini menyalin 1 word (16 bit) data ke dalam register CX. Alamat memori sumber dihitung dengan menjumlahkan isi register basis BX dan register indeks DI di dalam segmen data.

2. MOV CH, [BP+SI]

Instruksi ini menyalin 1 byte (8 bit) data ke dalam register CH. Alamatnya dihitung dengan menjumlahkan register basis BP dan register indeks SI. Karena menggunakan BP, alamat ini secara default berada di segmen tumpukan (stack segment).

3. MOV [BX+SI], SP

Perintah ini menyalin isi register SP (Stack Pointer) yang berukuran 16 bit ke sebuah lokasi memori. Alamat memori tujuan dihitung dengan menjumlahkan register BX dan SI di dalam segmen data.

4. MOV [BP+DI], AH

Instruksi ini menyalin 1 byte (8 bit) data dari register AH ke sebuah lokasi memori. Alamat tujuan dihitung dengan menjumlahkan register BP dan DI di dalam segmen tumpukan.

5. MOV CL, [EDX+EDI]

Ini adalah contoh operasi 32-bit. Perintah ini menyalin 1 byte (8 bit) data ke dalam register CL. Alamat memori sumber dihitung dengan menjumlahkan register basis 32-bit EDX dan register indeks EDI.

6. MOV [EAX+EBX], ECX

Instruksi ini menyalin isi register ECX yang berukuran 32 bit ke lokasi memori. Alamat tujuan dihitung dengan menjumlahkan isi register EAX dan EBX di dalam segmen data.

7. MOV [RSI+RBX], RAX

Ini adalah contoh operasi 64-bit. Perintah ini menyalin isi register RAX yang berukuran 64 bit ke sebuah alamat memori linier. Alamat tersebut dihitung dengan menjumlahkan isi register 64-bit RSI dan RBX.


gambar 3-9

Register Basis (Base Register): Register BX berfungsi sebagai register basis. Ia menyimpan alamat awal dari ARRAY. Dalam konteks ini, BX menunjuk ke ARRAY + 0.

Register Indeks (Index Register): Register DI berfungsi sebagai register indeks. Ia menyimpan offset atau nomor urut dari elemen yang ingin diakses di dalam array tersebut. Dalam gambar, DI berisi nilai 5, yang menunjuk ke elemen ARRAY + 5.

Akses Memori: CPU akan menghitung alamat memori akhir dengan menjumlahkan isi dari register basis (BX) dan register indeks (DI). Ini memungkinkan CPU untuk langsung "melompat" ke elemen spesifik di dalam array tanpa harus membaca elemen-elemen sebelumnya satu per satu.

Secara sederhana, BX memberi tahu di mana array dimulai, dan DI memberi tahu elemen keberapa yang harus diambil. Mode ini sangat efisien untuk mengakses data dalam struktur data seperti array atau tabel.


Register Relative Addressing


gambar 3-10



Proses Perhitungan Alamat
Alamat Dasar (Base Address): Register DS (Data Segment) berisi 0200H. Nilai ini dikalikan 10H untuk mendapatkan alamat dasar segmen, yaitu 2000H.

Isi Register: Register EBX (dalam contoh ini BX) berisi nilai 0100H.

Perpindahan (Displacement): Instruksi MOV AX, [BX+1000H] memiliki nilai perpindahan konstan sebesar 1000H.

Penjumlahan: Ketiga nilai tersebut dijumlahkan untuk mendapatkan alamat memori akhir.

Alamat Akhir = (Alamat Dasar) + (Isi BX) + (Displacement)

Alamat Akhir = 2000H + 0100H + 1000H = 3100H

Proses Transfer Data
Akses Memori: CPU mengakses alamat memori yang telah dihitung, yaitu 3100H.

Pengambilan Data: Karena tujuan (AX) adalah register 16-bit, CPU mengambil 2 byte data.

Dari alamat 3100H, diambil data 76H.

Dari alamat 3101H, diambil data A0H.

Penyimpanan ke Register: Sesuai aturan little-endian, byte dari alamat lebih rendah (76H) dimasukkan ke bagian low dari register tujuan (AL), dan byte dari alamat lebih tinggi (A0H) dimasukkan ke bagian high (AH).

Hasil Akhir: Register EAX (di mana AX adalah bagiannya) akan berisi nilai A076H.


tabel 3-7

1. MOV AX, [DI+100H]

Perintah ini menyalin 1 word (16 bit) data ke dalam register AX. Alamat memori sumber dihitung dengan menjumlahkan isi register DI dengan nilai perpindahan (displacement) 100H.

2. MOV ARRAY[SI], BL

Instruksi ini menyalin 1 byte (8 bit) data dari register BL ke sebuah lokasi memori. Alamat tujuan dihitung dengan menjumlahkan alamat awal dari label ARRAY dengan isi register SI.

3. MOV LIST[SI+2], CL

Perintah ini menyalin 1 byte (8 bit) data dari register CL ke sebuah lokasi memori. Alamat tujuan dihitung dengan menjumlahkan alamat awal label LIST, isi register SI, dan nilai perpindahan 2.

4. MOV DI, SET_IT[BX]

Instruksi ini menyalin 1 word (16 bit) data ke dalam register DI. Alamat memori sumber dihitung dengan menjumlahkan alamat awal label SET_IT dengan isi register BX.

5. MOV DI, [EAX+10H]

Ini adalah contoh operasi 32-bit. Perintah ini menyalin 1 word (16 bit) data ke dalam register DI. Alamat sumber dihitung dengan menjumlahkan isi register 32-bit EAX dengan nilai perpindahan 10H.

6. MOV ARRAY[EBX], EAX

Instruksi ini menyalin isi register EAX yang berukuran 32 bit ke lokasi memori. Alamat tujuan dihitung dengan menjumlahkan alamat awal label ARRAY dengan isi register 32-bit EBX.

7. MOV ARRAY[RBX], AL

Ini adalah contoh operasi 64-bit. Perintah ini menyalin 1 byte (8 bit) data dari register AL ke lokasi memori. Alamat tujuan dihitung dengan menjumlahkan alamat awal ARRAY dengan isi register 64-bit RBX.

8. MOV ARRAY[RCX], EAX

Contoh operasi 64-bit lainnya. Instruksi ini menyalin isi register EAX yang berukuran 32 bit ke lokasi memori. Alamat tujuan dihitung dengan menjumlahkan alamat awal ARRAY dengan isi register 64-bit RCX.


gambar 3-11


Penjelasan Gambar
Displacement (Perpindahan): Nilai ARRAY berfungsi sebagai displacement. Ini adalah alamat awal atau alamat dasar dari blok memori yang digunakan untuk array.

Register Indeks: Sebuah register (dalam deskripsi gambar disebut DI) berfungsi sebagai penunjuk ke elemen spesifik di dalam array. Register ini menyimpan nilai offset atau jarak dari alamat awal.

Akses Memori: CPU menghitung alamat memori akhir dengan menjumlahkan alamat awal ARRAY dengan nilai yang ada di dalam register indeks (misalnya, DI). Ini memungkinkan CPU untuk langsung mengakses elemen manapun di dalam array.

Secara sederhana, ARRAY memberi tahu di mana blok data dimulai, dan register indeks (DI) memberi tahu elemen keberapa yang harus diakses dari titik awal tersebut.


gambar 3-12


Addressing Array Data with Register Relative.
Proses Perhitungan Alamat
Alamat Dasar (Base Address): Register DS (Data Segment) berisi 1000H. Nilai ini dikalikan 10H untuk mendapatkan alamat dasar segmen, yaitu 10000H.

Register Basis (Base Register): Register EBX (dalam contoh ini BX) berisi nilai 0020H.
Register Indeks (Index Register): Register ESI (dalam contoh ini SI) berisi nilai 0010H.
Perpindahan (Displacement): Instruksi MOV AX, [BX+SI+100H] memiliki nilai perpindahan konstan sebesar 0100H.

Penjumlahan: Keempat nilai tersebut dijumlahkan untuk mendapatkan alamat memori akhir.

Alamat Akhir = (Alamat Dasar) + (Isi BX) + (Isi SI) + (Displacement)
Alamat Akhir = 10000H + 0020H + 0010H + 0100H = 10130H

Proses Transfer Data
Akses Memori: CPU mengakses alamat memori yang telah dihitung, yaitu 10130H.

Pengambilan Data: Karena tujuan (AX) adalah register 16-bit, CPU mengambil 2 byte data.

Dari alamat 10130H, diambil data 16H.
Dari alamat 10131H, diambil data A3H.

Penyimpanan ke Register: Sesuai aturan little-endian, byte dari alamat lebih rendah (16H) dimasukkan ke bagian low dari register tujuan (AL), dan byte dari alamat lebih tinggi (A3H) dimasukkan ke bagian high (AH).

Hasil Akhir: Register EAX (di mana AX adalah bagiannya) akan berisi nilai A316H.



Base Relative-Plus-Index Addressing


tabel 3-8


1. MOV DH, [BX+DI+20H]

Perintah ini menyalin 1 byte (8 bit) data ke dalam register DH. Alamat memori sumber dihitung dengan menjumlahkan isi register basis BX, register indeks DI, dan nilai perpindahan 20H di dalam segmen data.

2. MOV AX, FILE[BX+DI]

Instruksi ini menyalin 1 word (16 bit) data ke dalam register AX. Alamat sumber dihitung dengan menjumlahkan alamat awal label FILE, isi register basis BX, dan isi register indeks DI di dalam segmen data.

3. MOV LIST[BP+DI], CL

Perintah ini menyalin 1 byte (8 bit) data dari register CL ke sebuah lokasi memori. Alamat tujuan dihitung dengan menjumlahkan alamat awal label LIST, isi register basis BP, dan isi register indeks DI. Karena menggunakan BP, alamat ini secara default berada di segmen tumpukan (stack segment).

4. MOV LIST[BP+SI+4], DH

Instruksi ini menyalin 1 byte (8 bit) data dari register DH ke sebuah lokasi memori di segmen tumpukan. Alamat tujuan dihitung dengan menjumlahkan alamat awal LIST, isi register basis BP, isi register indeks SI, dan nilai perpindahan 4.

5. MOV EAX, FILE[EBX+ECX+2]

Ini adalah contoh operasi 32-bit. Perintah ini menyalin 1 doubleword (32 bit) data ke dalam register EAX. Alamat memori sumber dihitung dengan menjumlahkan alamat awal label FILE, isi register basis 32-bit EBX, isi register indeks ECX, dan nilai perpindahan 2.



gambar 3-13


Penjelasan Gambar
Displacement (Perpindahan): FILE berfungsi sebagai displacement. Ini adalah alamat awal atau alamat dasar dari blok memori yang digunakan untuk file tersebut.

Register Basis (Base Register): Register EBX berfungsi sebagai register basis. Ia menyimpan alamat dari record tertentu (dalam gambar, REC C) di dalam file. Nilai ini merupakan offset dari alamat awal FILE.

Register Indeks (Index Register): Register EDI berfungsi sebagai register indeks. Ia menyimpan offset untuk mengakses elemen spesifik di dalam record yang sudah ditunjuk oleh EBX.

Akses Memori: CPU akan menghitung alamat memori akhir dengan menjumlahkan ketiga komponen tersebut: alamat awal FILE, alamat record di EBX, dan alamat elemen di EDI.

Secara sederhana, FILE memberi tahu di mana file dimulai, EBX memilih record mana yang akan dibaca, dan EDI menunjuk ke data spesifik di dalam record tersebut.


tabel 3-9

1. MOV EAX, [EBX+4*ECX]

Perintah ini menyalin 1 doubleword (32 bit) data ke dalam register EAX. Alamat memori sumber dihitung dengan menjumlahkan isi register EBX dengan 4 kali isi register ECX. Pengali 4 ini berguna untuk mengakses array yang elemennya berukuran 32-bit (4 byte).

2. MOV [EAX+2*EDI+100H], CX

Instruksi ini menyalin isi register CX yang berukuran 16 bit ke sebuah lokasi memori. Alamat tujuan dihitung dengan menjumlahkan isi register EAX, 2 kali isi register EDI, dan nilai perpindahan 100H.

3. MOV AL, [EBP+2*EDI+2]

Perintah ini menyalin 1 byte (8 bit) data ke dalam register AL. Alamat sumber dihitung dengan menjumlahkan isi register EBP, 2 kali isi register EDI, dan nilai perpindahan 2. Karena menggunakan EBP, alamat ini secara default berada di segmen tumpukan (stack segment).

4. MOV EAX, ARRAY[4*ECX]

Instruksi ini menyalin 1 doubleword (32 bit) data ke dalam register EAX. Alamat memori sumber dihitung dengan menjumlahkan alamat awal label ARRAY dengan 4 kali isi register ECX.



 3–2 PROGRAM MEMORY-ADDRESSING MODES


Direct Program Memory Addressing

gambar 3-14







Tidak ada komentar:

Posting Komentar

ELEKTRONIKA

 BAHAN PRESENTASI UNTUK MATA KULIAH  ELEKTRONIKA C Disusun Oleh : Abdul Hadi Aldoreza 2210952008 Dosen Pengampu : Dr. Darwison, M.T JURUSAN ...