Saya akan menjawab pertanyaan ini khusus untuk pengendali AVR yang Anda sebutkan. Prinsip dasar juga berlaku untuk banyak arsitektur 8-bit lainnya.
AVR adalah inti 8-bit. Ini berarti mereka memiliki Register 8-bit. Namun, 8 bit tidak cukup untuk mengakses jumlah memori yang dapat digunakan. Oleh karena itu, inti AVR dapat menggunakan satu set register spesifik yang digabungkan sebagai register pointer 16 bit. Register r30 dan r31 (juga disebut sebagai ZL dan ZH) adalah contoh untuk ini. Bersama-sama mereka membentuk Pointer Z.
Dalam perakitan membaca byte di alamat 0x1234 akan terlihat seperti ini:
ldi ZL, 0x34 ; Load r30 (ZL) with low byte of address
ldi ZH, 0x12 ; Load r31 (ZH) with high byte of address
ld r16, Z ; Load byte to r16
Keluarga AVR memiliki 3 pasangan register yang dapat digunakan untuk ini. Mereka secara khusus dirancang dalam perangkat keras untuk memungkinkan operasi tersebut.
Saat memprogram dalam bahasa tingkat yang lebih tinggi seperti C, kompiler menangani hal ini.
Catatan: Beberapa AVR bahkan mendukung ukuran memori yang lebih besar dari 64k. Kontroler ini memiliki register fungsi khusus di mana bit tambahan alamat ditulis sebelum akses. Oleh karena itu alamat terdiri dari bit-bit berikut (MSB ke LSB):
Daftar fungsi khusus (biasanya 1 byte), ZH (8bit), ZL (8bit).