Assembly ile ADuC841 – [3] Adresleme Modları
8051 Assembly: Adresleme Modları Nedir, Nasıl Çalışır?
Assembly Dili Nedir?
Assembly dili, her komutun İngilizce karşılığının kısaltması (mnemonik) ile ifade edildiği, makine dili ile yüksek seviyeli diller arasında yer alan düşük seviyeli bir programlama dilidir.
Örneğin
12 mov ACC, #53h ; ACC saklayıcısına 53h sabit değerini yükledjnz ACC, x1 ; ACC'yi 1 azalt, sıfır değilse x1 etiketine gitAssembly dilinin avantajları:
- Donanım üzerinde tam kontrol
- Hızlı çalışan ve az bellek kullanan kod yazılabilir
- Düşük seviyeli donanım erişimi mümkündür
Dezavantajı:
- Aritmetik işlemler yazmak zordur.
- Donanımı detaylıca bilmek gerekir.
Adresleme Modu Nedir?
Adresleme modu, bir komutta kaynağın ve hedefin nasıl belirtildiğini tanımlar.

8051’de mov komutu şu şekilde çalışır:
|
1 |
mov <hedef>, <kaynak> |
- Veri byte düzeyinde transfer edilir
- Veri kaynaktan hedefe doğru akar
- 8051’de 5 farklı adresleme modu vardır

1. İvedi Adresleme (Immediate Addressing)
Mantığı:
Kaynaktaki veri, doğrudan komutun içinde sabit bir değer olarak yazılır. # işareti, arkasından gelen değerin bir adres değil, doğrudan veri olduğunu gösterir.

|
1 |
mov <hedef>, #veri |
Kullanım Biçimleri:
| Komut | Açıklama |
|---|---|
mov a, #data |
ACC’ye sabit veri yaz |
mov Rn, #data |
R0–R7 saklayıcısına sabit veri yaz |
mov @Ri, #data |
Ri’nin gösterdiği adrese sabit veri yaz |
mov direct, #data |
RAM’deki doğrudan adrese sabit veri yaz |
mov DPTR, #data16 |
16-bit veri pointer’ına 16-bit veri yaz |
Örnekler ve Analizleri:
Örnek 1:
|
1 |
mov a, #02h |
ACC saklayıcısına doğrudan 02h değeri yazılır. ACC → 00000010₂
Örnek 2:
|
1 |
mov 20h, #20h |
RAM’deki 20h adresine, 20h değeri yazılır.
“Burada ilk 20h bir adres, ikinci 20h ise veridir!”
Örnek 3:
|
1 |
mov r0, #0AAh |
PSW’de belirtilmiş BANK’a ait R0 saklayıcısına AAh değeri yazılır.
Örnek 4:
|
1 |
mov DPTR, #01FE7h |
DPTR’nin yüksek baytına (DPTRH) → 1Fh DPTR’nin düşük baytına (DPTRL) → E7h yazılır.
Örnek 5:
|
1 |
mov p0, #0CCh |
Port 0’a CCh değeri yazılır. Bu durumda port pinlerinin durumu:
| P0.7 | P0.6 | P0.5 | P0.4 | P0.3 | P0.2 | P0.1 | P0.0 |
|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
Lojik-1 olan pinler aktif (ON), Lojik-0 olan pinler pasif (OFF) durumdadır.
2. Doğrudan Adresleme (Direct Addressing)
Mantığı:
Komut içinde 8-bit bir adres doğrudan belirtilir. Bu adres dahili RAM’deki veya Özel Fonksiyon Kaydedicilerindeki (SFR) bir konumu gösterir.

Önemli Fark:
mov a, #02h→ ACC’ye 02h verisini yaz (ivedi)
mov a, 02h→ RAM’in 02h adresindeki veriyi ACC’ye yaz (doğrudan)#işareti varsa VERİ, yoksa ADRES!
Kullanım Biçimleri:
|
1 2 3 4 5 6 7 8 9 |
mov a, Rn ; R0-R7'deki veriyi ACC'ye yaz mov a, direct ; RAM'deki adresten ACC'ye yaz mov Rn, a ; ACC'deki veriyi Rn'ye yaz mov direct, a ; ACC'deki veriyi RAM adresine yaz mov Rn, direct ; RAM adresindeki veriyi Rn'ye yaz mov direct, Rn ; Rn'deki veriyi RAM adresine yaz mov direct, direct ; RAM'den RAM'e kopyala mov a, Pn ; Port'tan ACC'ye oku mov Pn, a ; ACC'den Port'a yaz |
Örnekler ve Analizleri:
Örnek 1:
|
1 |
mov a, r7 |
Aktif BANK’taki R7 saklayıcısındaki veri ACC’ye yazılır.
Örnek 2:
|
1 |
mov a, 02h |
RAM’in 02h adresindeki veri ACC’ye transfer edilir.
Örnek 3:
|
1 |
mov 30h, 40h |
RAM’deki 40h adresindeki veri, 30h adresine yazılır.
Örnek 4:
|
1 |
mov a, 22h |
RAM’deki 22h adresindeki veri okunarak ACC’ye yazılır.
Örnek 5:
|
1 |
mov r5, 30h |
RAM’deki 30h adresindeki veri R5 saklayıcısına yazılır.
Örnek 6:
|
1 |
mov P2, a |
ACC’deki veri doğrudan Port 2 çıkışına gönderilir.
ACC bitleri → Port 2 pinlerine bire bir aktarılır:
|
1 2 3 4 |
ACC.7 → P2.7 ACC.6 → P2.6 ... ACC.0 → P2.0 |
Bit Adresleme (Direct Addressing’in Alt Türü):
|
1 2 |
mov c, bit ; Bit'i carry flag'e kopyala mov bit, c ; Carry flag'i bit'e kopyala |
Hedef veya kaynak mutlaka carry flag (C) olmalıdır!
Örnekler:
|
1 2 |
mov c, acc.6 ; ACC'nin 6. bitini carry flag'e yaz mov c, p1.2 ; P1'in 2. pinini carry flag'e kopyala |
Uyarı: RAM’de bit adreslenen bölgede byte transferi yapılabilir, ancak byte adreslenen bölgeden bit transferi yapılamaz!
Önemli: RAM’deki veriler enerji kesildiğinde kaybolur!
3. Saklayıcı Adresleme (Register Addressing)
Mantığı:
Kaynak veya hedef, doğrudan R0–R7 saklayıcılarından biridir. Saklayıcı kümesi PSW’deki BANK seçimine göre belirlenir.

|
1 2 |
mov Rn, <hedef> mov <kaynak>, Rn |
Kural: Hedef ve kaynak aynı anda saklayıcı olamaz! mov r4, r7 → ❌ HATALI kullanım!
Örnekler:
Örnek 1:
|
1 |
mov r0, a |
ACC’deki veri R0 saklayıcısına yazılır.
Örnek 2:
|
1 |
mov B, r2 |
RAM’deki R2 saklayıcısındaki veri B saklayıcısına yazılır.
Örnek 3:
|
1 |
mov a, r5 |
R5’teki veri ACC’ye yazılır.
Örnek 4:
|
1 |
mov r4, r7 |
Bu kullanım geçersizdir, Assembly hata verir!
4. Saklayıcı – Dolaylı Adresleme (Register Indirect Addressing)
Mantığı:
Bu modda adres komutun içinde açıkça yazılmaz. Bunun yerine bir saklayıcının içeriği adres olarak kullanılır. Yani saklayıcı, verinin adresini gösterir (pointer). Sadece R0 ve R1 dolaylı adresleme için kullanılabilir.

|
1 2 3 4 5 |
mov a, @Ri ; Ri'nin gösterdiği adresten ACC'ye yükle mov @Ri, a ; ACC'deki veriyi Ri'nin gösterdiği adrese yaz mov @Ri, #data ; Sabit veriyi Ri'nin gösterdiği adrese yaz movx a, @Ri ; Harici RAM'den oku movx a, @DPTR ; DPTR'nin gösterdiği harici RAM adresinden oku |
Örnekler:
Örnek 1:
|
1 |
mov a, @r1 |
R1’in içindeki değer bir adres olarak kullanılır, o adresteki veri ACC’ye yazılır.
Örnek 2:
|
1 |
movx a, @r0 |
Harici RAM’de R0’ın gösterdiği adresteki veri okunur.
Örnek 3 – Kod Parçası:
|
1 2 3 |
mov 20h, #40h ; 20h adresine 40h yaz mov r0, 20h ; R0'a 20h adresinin içeriğini yaz → R0 = 40h mov a, @r0 ; R0'ın gösterdiği (40h) adresteki veriyi ACC'ye yaz |
Bu örnekte R0 = 40h olduğu için, ACC’ye RAM’in 40h adresindeki veri yazılır.
Örnek 4 – Kod Parçası:
|
1 2 3 4 |
mov psw, #00h ; Bank 0 seçildi mov r1, #30h ; R1 = 30h (adres göstergeci) mov 30h, #20h ; 30h adresine 20h yaz mov 40h, @r1 ; R1'in gösterdiği (30h) adresteki veriyi 40h'e yaz |
Sonuç: 40h adresine 20h yazılır.
Pratik Uygulama – RAM’i Sıfırlama:
Tüm RAM’i sıfırlamak için 128 satır kod yazmak yerine dolaylı adresleme ile sadece 4 satırda yapılabilir:
|
1 2 3 4 |
mov r0, #07h ; R0 = 07h (sayaç) mov a, #00h ; ACC = 00h (sıfır değeri) X1: mov @r0, a ; R0'ın gösterdiği adrese 0 yaz djnz r0, X1 ; R0'ı azalt, sıfır değilse X1'e git |
Bu döngü RAM’deki tüm adresleri sıfırlar!
5. Saklayıcı – İndisli Adresleme (Register Indexed Addressing)
Mantığı:
Hedef veya kaynak adres, bir taban adres ile ACC’nin toplanmasıyla elde edilir. Taban adres olarak DPTR veya PC kullanılır. Bu mod özellikle Look-up Table (arama tablosu) erişimlerinde kullanılır.

|
1 2 |
movc a, @a+DPTR ; Program Hafıza @ (A+DPTR) adresini oku movc a, @a+PC ; Program Hafıza @ (A+PC) adresini oku |
Look-up Table Nedir?
RAM enerji kesildiğinde içeriği kaybolduğundan, sabit ve kalıcı veriler Code (Flash) belleğe yazılır. Bu sabit veri dizilerine Look-up Table denir.
Örnek 1 – 7-Segment Display’de 6 Sayısını Göster:
|
1 2 3 4 5 6 |
mov a, #06h ; A = 6 (gösterilecek sayı) mov DPTR, #sayigoster ; DPTR tablonun başlangıcını gösterir movc a, @a+DPTR ; Tablodan 6. indeksteki değeri oku mov p1, a ; Değeri Port 1'e gönder sayigoster: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h |
DPTR tablonun başını, A=6 ise tablonun 6. elemanı okunur → 7-Segment’te 6 görüntülenir.
Örnek 2 – P1’den Okunan Değerin Karesini P3’e Gönder:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
org 00h sjmp start start: mov DPTR, #Tablo ; DPTR tablo başına mov A, #0FFh mov P1, A ; P1'i giriş olarak ayarla dongu: mov A, P1 ; P1'den oku movc A, @A+DPTR ; Tablodan karşılık gelen kareyi al mov P3, A ; P3'e gönder sjmp dongu ; Döngü devam eder Tablo: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 |
P1’den 0–9 arası bir değer girildiğinde, tablodan o sayının karesi bulunur ve P3’e yazılır.
Özet Tablo – 5 Adresleme Modu
| Mod | Sembol | Örnek | Açıklama |
|---|---|---|---|
| İvedi | # |
mov a, #05h |
Sabit değer doğrudan yazılır |
| Doğrudan | adres | mov a, 05h |
RAM adresi doğrudan belirtilir |
| Saklayıcı | Rn | mov a, r5 |
R0–R7 kullanılır |
| Dolaylı | @Ri |
mov a, @r0 |
Saklayıcı adres göstericisi olarak kullanılır |
| İndisli | @a+DPTR |
movc a, @a+DPTR |
Taban adres + ACC ile erişim |

Direktifler:
| Direktif | Açıklama |
|---|---|
EQU |
Sabit değere sembolik isim atar |
ORG |
Kodun bellekte yerleştirileceği adresi belirtir |
DB |
Program belleğine sabit byte değerleri tanımlar |
END |
Derleyiciye programın sonunu bildirir |



