Assembly ile ADuC841 – [4] Komut Kümesi – Kapsamlı Anlatım
8051 Assembly: Veri Transfer , Veri İşleme (matematiksel işlemler), Program Akışı Kontrol Komutları
Komut Kümesine Giriş
8051 mikrodenetleyicisinde 255 adet komut bulunur. Bu komutlar 1, 2 veya 3 byte uzunluğunda olabilir ve 1 ila 4 makine çevrimi arasında çalışır.
Komutlar 3 ana gruba ayrılır:
| # | Grup | Açıklama |
|---|---|---|
| 1 | Veri Transfer Komutları | Veriyi bir yerden alıp başka yere taşır |
| 2 | Veri İşleme Komutları | Matematik ve mantık işlemleri yapar |
| 3 | Program Akışı Kontrol Komutları | Programın akışını yönlendirir |
Bölüm 2: Veri Transfer Komutları
Veri transfer komutları 3 alt gruba ayrılır.
2.1 Dahili Veri Hafıza Transfer Komutları
Genel yapı:
|
1 |
mov <hedef>, <kaynak> |
Adresleme modu kısaltmaları:
| Kısaltma | Anlamı |
|---|---|
| Dir | Doğrudan adresleme |
| Ind | Dolaylı adresleme |
| Reg | Saklayıcı adresleme |
| Imm | İvedi adresleme |
Byte transfer komutları:
| Komut | İşlem | Dir | Ind | Reg | Imm |
|---|---|---|---|---|---|
| MOV A, kaynak | A = kaynak | ✓ | ✓ | ✓ | ✓ |
| MOV hedef, A | hedef = A | ✓ | ✓ | ✓ | — |
| MOV hedef, kaynak | hedef = kaynak | ✓ | ✓ | ✓ | ✓ |
| MOV DPTR, #data16 | DPTR = 16-bit sabit | — | — | — | ✓ |
Önemli Özellik: ACC’siz Transfer!
|
1 2 |
mov 07h, A0h ; A0h adresindeki veriyi 07h adresine yaz (ACC'ye uğramaz!) mov P0, P3 ; P3 portunu doğrudan P0 portuna kopyala |
✅ MOV hedef, kaynak komutu iki dahili RAM veya SFR hücresi arasında ACC’ye gerek kalmadan veri taşır!
Carry Flag (C) ve Bit Transferi
Bit düzeyinde transferlerde veri mutlaka önce Carry Flag (C)’ye gider. C, PSW saklayıcısının 7. bitidir.
|
1 2 |
PSW: | CY | -- | -- | RS1 | RS0 | -- | -- | -- | 7.bit |
Örnek: P3.7 bitini okuyup 00h adresine yaz:
|
1 2 |
mov c, p3.7 ; P3.7 → Carry'e kopyala mov 00h, c ; Carry → 00h adresine yaz |
⚠️ Bit transferlerinde veri doğrudan bir bitten diğerine gidemez, mutlaka C üzerinden geçer!
2.2 Harici Veri Hafıza Transfer Komutları
Harici RAM’e erişmek için MOVX komutu kullanılır:
| Komut | Adres Genişliği | İşlem |
|---|---|---|
| MOVX A, @Ri | 8-bit | Harici RAM’den oku |
| MOVX @Ri, A | 8-bit | Harici RAM’e yaz |
| MOVX A, @DPTR | 16-bit | Harici RAM’den oku |
| MOVX @DPTR, A | 16-bit | Harici RAM’e yaz |
⚠️ Harici RAM erişimlerinde ACC her zaman kaynak veya hedef olmak zorundadır!
⚠️ RD ve WR sinyalleri yalnızca MOVX çalışırken aktif olur. Diğer zamanlarda bu pinler I/O hattı olarak kullanılabilir.
2.3 Look-up Tabloları (MOVC)
RAM enerjisi kesildiğinde veriler kaybolur. Kalıcı veriler Program Hafızasına (Flash) yazılır. Bunlara Look-up Table denir ve MOVC komutuyla okunur:
| Komut | İşlem |
|---|---|
| MOVC A, @A+DPTR | Program Hafıza (A+DPTR) adresini oku |
| MOVC A, @A+PC | Program Hafıza (A+PC) adresini oku |
Kullanım örneği:
|
1 2 3 4 |
mov DPTR, #TABLO ; Tablo başlangıcını DPTR'ye yükle movc A, @A+DPTR ; DPTR + A adresindeki veriyi oku TABLO: DB 00h, 01h, 02h, ... |
⚠️ Look-up Table’lar sadece okunabilir, değiştirilemez!
⚠️ Tablo RET komutundan hemen sonra gelmeli. Sıfır indeksli veri kullanılamaz çünkü 0. konum RET komutunun adresini içerir!
Bölüm 3: Veri İşleme Komutları
Tüm işlemler ALU (Arithmetic and Logic Unit) biriminde yapılır ve bayrakları etkiler.
3.1 Lojik Komutlar
ANL – AND İşlemi
|
1 2 3 4 5 6 |
anl a, Rn ; A = A AND Rn anl a, @Ri ; A = A AND (Ri adresi) anl a, #data ; A = A AND sabit anl a, direct ; A = A AND RAM anl direct, a ; RAM = RAM AND A anl direct, #data ; RAM = RAM AND sabit |
AND Doğruluk Tablosu:
| Bit 1 | Bit 2 | Sonuç |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
✅ AND ile bitleri sıfırlama (maskeleme) yapılır. Sıfırlamak istediğin bite 0, korumak istediğine 1 yaz!
Gerçek Örnek – PSW’de RS0=0, RS1=0 yap, diğer bitlere dokunma:
|
1 |
anl PSW, #11100111b |
|
1 2 3 4 |
PSW: x x x RS1 RS0 x x x AND: 1 1 1 0 0 1 1 1 —————————————————————————— PSW: x x x 0 0 x x x ✅ |
ORL – OR İşlemi
|
1 2 3 4 5 6 |
orl a, Rn orl a, @Ri orl a, #data orl a, direct orl direct, a orl direct, #data |
OR Doğruluk Tablosu:
| Bit 1 | Bit 2 | Sonuç |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
✅ OR ile bitleri 1 yapma (setleme) yapılır. 1 yapmak istediğin bite 1, korumak istediğine 0 yaz!
Gerçek Örnek – PSW’de RS0=1, RS1=1 yap:
|
1 |
orl PSW, #00011000b |
|
1 2 3 4 |
PSW: x x x RS1 RS0 x x x OR: 0 0 0 1 1 0 0 0 —————————————————————————— PSW: x x x 1 1 x x x ✅ |
XRL – XOR İşlemi
XOR Doğruluk Tablosu:
| Bit 1 | Bit 2 | Sonuç |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
✅ XOR ile bitleri tersleme (toggle) yapılır!
3.2 CLR ve CPL Komutları
|
1 2 |
clr a ; ACC = 00h (tüm bitler sıfır) cpl a ; ACC'nin tüm bitleri tersine döner |
Örnek:
|
1 2 |
mov a, #0F0h ; A = 1111 0000 cpl a ; A = 0000 1111 |
3.3 Aritmetik Komutlar
| Komut | İşlem | Açıklama |
|---|---|---|
| ADD A, byte | A = A + byte | Elde olmadan topla |
| ADDC A, byte | A = A + byte + C | Carry ile topla |
| SUBB A, byte | A = A – byte – C | Borçla çıkar |
| INC A | A = A + 1 | ACC artır |
| INC byte | byte = byte + 1 | Adresi artır |
| INC DPTR | DPTR = DPTR + 1 | DPTR artır |
| DEC A | A = A – 1 | ACC azalt |
| DEC byte | byte = byte – 1 | Adresi azalt |
| MUL AB | B:A = B × A | Çarp |
| DIV AB | A = tam, B = kalan | Böl |
| DA A | Ondalık Ayar | BCD için |
ADD ve ADDC Farkı
ADD – düz toplama:
|
1 2 |
mov a, #05h add a, #03h ; A = 08h |
ADDC – 16-bit büyük sayı toplamada carry de eklenir:
|
1 2 3 4 5 6 7 |
; Alt byte: mov a, #0FFh add a, #01h ; A = 00h, Carry = 1 ; Üst byte: mov a, #00h addc a, #00h ; A = 00h + 00h + 1(carry) = 01h |
MUL ve DIV
|
1 2 3 4 5 6 7 8 9 |
; Çarpma: mov a, #0Ah ; A = 10 mov B, #05h ; B = 5 mul AB ; A = 32h(50), B = 00h → B:A = sonuç ; Bölme: mov a, #0Ah ; A = 10 mov B, #03h ; B = 3 div AB ; A = 3 (tam), B = 1 (kalan) |
Bölüm 4: Döndürme Komutları
ACC üzerinde 4 farklı döndürme komutu vardır:
| Komut | Açıklama |
|---|---|
| RL A | ACC’yi sola 1 bit döndür |
| RLC A | ACC’yi carry üzerinden sola döndür |
| RR A | ACC’yi sağa 1 bit döndür |
| RRC A | ACC’yi carry üzerinden sağa döndür |
✅ Sola döndürme = 2 ile çarpma, Sağa döndürme = 2 ile bölme (bit taşması yoksa!)
Örnek
|
1 2 3 4 5 6 7 8 9 10 |
basla: mov p1, #00h ; Port 1'i sıfırla mov a, #01h ; A = 0000 0001 (sadece bit0 = 1) mov r0, #08d ; R0 = 8 (8 kez döneceğiz) kk: mov p1, a ; A'yı Port 1'e gönder (LED'i yak) rl a ; A'yı sola 1 bit döndür djnz r0, kk ; R0'ı azalt, sıfır değilse kk'ya dön end |
Ne yapar bu kod?
Her adımda tek bir LED yanar ve sola kayar – akan LED efekti!
| Adım | A değeri (binary) | Port 1 Durumu |
|---|---|---|
| Başlangıç | 0000 0001 | Sadece P1.0 yanar |
| 1. dönüş | 0000 0010 | Sadece P1.1 yanar |
| 2. dönüş | 0000 0100 | Sadece P1.2 yanar |
| 3. dönüş | 0000 1000 | Sadece P1.3 yanar |
| … | … | … |
| 7. dönüş | 1000 0000 | Sadece P1.7 yanar |
Döndürmede Dikkat – Hata Durumu!
|
1 2 3 4 |
mov a, #00100001b ; A = 33d rl a ; A = 66d (1. döndürme) ✅ rl a ; A = 132d (2. döndürme) ✅ rl a ; A = 9d (3. döndürme) ❌ HATA! |
⚠️ 3. döndürmede Bit-0 “1” değerini aldığından 2 ile çarpma sonucu hatalı olur! Bu durumda carry üzerinden döndürme (RLC) kullanılmalıdır.
Doğru kullanım (RLC ile):
|
1 2 3 4 |
rl a ; 1. döndürme rl a ; 2. döndürme clr c ; Carry'i sıfırla rlc a ; 3. döndürme – carry üzerinden, güvenli |
Bölüm 5: Karşılıklı Değiştirme Komutları
SWAP A
ACC’nin yüksek nibble (bit7-4) ile düşük nibble’ını (bit3-0) yer değiştirir:
|
1 2 |
mov a, #7Bh ; A = 0111 1011 swap a ; A = 1011 0111 = B7h |
XCH A, byte
ACC ile bir byte arasındaki değerleri karşılıklı değiştirir:
|
1 2 3 4 |
mov r0, #25h mov 25h, #78h mov a, #0Fh xch a, @R0 ; A = 78h olur, 25h adresi = 0Fh olur |
XCHD A, @Ri
Sadece düşük nibble’ları karşılıklı değiştirir:
|
1 2 3 4 |
mov a, #2Bh ; A = 0010 1011 mov 15h, #79h ; 15h = 0111 1001 mov r1, #15h xchd a, @R1 ; A = 29h, 15h = 7Bh olur (sadece düşük nibble!) |
Bölüm 6: Program Akışı Kontrol Komutları
6.1 Durumdan Bağımsız (Unconditional) Dallanma
| Komut | Açıklama | Kapsam |
|---|---|---|
| SJMP adres | Kısa atlama | ±128 byte |
| AJMP adres | Mutlak atlama | 2KB blok |
| LJMP adres | Uzun atlama | 64KB tümü |
| LJMP @A+DPTR | İndisli atlama | Tablo ile |
6.2 Koşullu (Conditional) Dallanma Komutları
| Komut | Koşul | Açıklama |
|---|---|---|
| JZ adres | ACC = 0 ise | ACC sıfırsa atla |
| JNZ adres | ACC ≠ 0 ise | ACC sıfır değilse atla |
| JC adres | C = 1 ise | Carry 1 ise atla |
| JNC adres | C = 0 ise | Carry 0 ise atla |
| JB bit, adres | bit = 1 ise | Bit 1 ise atla |
| JNB bit, adres | bit = 0 ise | Bit 0 ise atla |
| JBC bit, adres | bit = 1 ise, biti sıfırla | Atla ve biti temizle |
| CJNE byte1, byte2, adres | byte1 ≠ byte2 ise | Eşit değilse atla |
| DJNZ byte, adres | byte’ı azalt, ≠ 0 ise | Döngü komutu |
6.3 Örnekler ve Analizi
JB/JNB ile Buton Kontrolü
Bu görsellerde şu devre ve kod var:
Devre: P1.1’e bir buton, P3.0’a bir LED bağlı.
Amaç: P1.1 basılıysa LED yak, P1.2 basılıysa LED söndür.
|
1 2 3 4 5 6 7 8 9 10 |
basla: JB P1.1, n ; P1.1 = 1 ise (buton basılı değil) n'e atla JB P1.2, k ; P1.2 = 1 ise k'ya atla sjmp basla ; ikisi de basılı değilse başa dön n: setb P3.0 ; LED yak sjmp basla k: clr P3.0 ; LED söndür sjmp basla |
Mantığı:
- Butonlar normalde 5V (lojik 1) konumundadır
- Butona basıldığında pin GND’ye (lojik 0) çekilir
- JB → “Jump if Bit = 1” → buton basılı değilse atlar
- JNB → “Jump if Bit = 0” → buton basılıysa atlar
✅ Buton bağlantısında pull-up direnci kullanıldığında basılmamış = 1, basılmış = 0 olur!
SUBB ile Karşılaştırma
Amaç: P1 değeri P3’ten küçükse P0.1’i yak, büyükse P0.0’ı yak.
|
1 2 3 4 5 6 7 8 9 10 11 12 |
k: mov a, P1 ; P1'i ACC'ye al clr c ; Carry'i sıfırla (SUBB için şart!) subb a, P3 ; A = P1 - P3 JNC n ; Carry = 0 ise (P1 >= P3) n'e atla setb P0.0 ; P1 < P3 → P0.0 yak clr P0.1 sjmp k n: setb P0.1 ; P1 >= P3 → P0.1 yak clr P0.0 sjmp k |
SUBB’nin Mantığı:
|
1 2 3 4 |
P1 = 30h = 48d P3 = 50h = 80d A = 48 - 80 = negatif → Carry = 1 → JNC atlamaz → P1 < P3 ✅ |
⚠️ SUBB kullanmadan önce mutlaka
clr cyazılmalıdır! Aksi hâlde önceki işlemin carry’si sonucu bozar!
CJNE ile Eşitlik Kontrolü
Amaç: P1 = 55h ise P3.1’i yak, değilse söndür.
|
1 2 3 4 5 6 7 |
z: mov a, P1 ; P1'i oku CJNE a, #55D, n ; A ≠ 55 ise n'e atla setb P3.1 ; A = 55 → P3.1 yak sjmp z n: clr P3.1 ; A ≠ 55 → P3.1 söndür sjmp z |
CJNE’nin Mantığı:
- CJNE → “Compare and Jump if Not Equal”
- İki değeri karşılaştırır
- Eşit değilse belirtilen adrese atlar
- Eşitse bir sonraki satırdan devam eder
DJNZ ile Sayaç Döngüsü
Görsel 6 (DEC ile):
|
1 2 3 4 5 6 |
mov r0, #50D ; R0 = 50 (sayaç) n: clr P3.1 setb P3.1 DEC r0 ; R0 = R0 - 1 CJNE r0, #0D, n ; R0 ≠ 0 ise n'e dön |
Görsel 7 (DJNZ ile – daha verimli):
|
1 2 3 4 5 |
mov r0, #10D ; R0 = 10 (sayaç) n: clr P3.1 setb P3.1 DJNZ r0, n ; R0'ı azalt, sıfır değilse n'e dön |
DJNZ’nin Mantığı:
- “Decrement and Jump if Not Zero”
- Sayacı 1 azaltır
- Sıfır değilse döngüye devam eder
- Tek komutla hem azaltma hem kontrol yapar → çok verimli!
Karşılaştırma:
| Yöntem | Komut sayısı | Bellek |
|---|---|---|
| DEC + CJNE | 2 komut | Daha fazla |
| DJNZ | 1 komut | Daha az |
Bölüm 7: Bit Transfer Komutları
| Komut | İşlem |
|---|---|
| MOV C, bit | Biti Carry’e kopyala |
| MOV bit, C | Carry’i bite kopyala |
| ANL C, bit | C = C AND bit |
| ANL C, /bit | C = C AND (bit’in tersi) |
| ORL C, bit | C = C OR bit |
| ORL C, /bit | C = C OR (bit’in tersi) |
| CLR C | C = 0 |
| CLR bit | bit = 0 |
| SETB C | C = 1 |
| SETB bit | bit = 1 |
| CPL C | C = C tersi |
| CPL bit | bit = bit tersi |
Örnek:
|
1 2 3 |
anl c, 12h ; C ile 12h bitini AND'le → sonuç C'ye orl c, P2.0 ; C ile P2.0'ı OR'la → sonuç C'ye anl c,/acc.3 ; C ile ACC.3'ün tersini AND'le → sonuç C'ye |
Genel Özet Tablosu
| Komut Grubu | Komutlar | Ne İşe Yarar? |
|---|---|---|
| Dahili Transfer | MOV | RAM, SFR, port arası taşıma |
| Harici Transfer | MOVX | Harici RAM okuma/yazma |
| Tablo Okuma | MOVC | Flash’tan sabit okuma |
| Lojik | ANL, ORL, XRL | Bit maskeleme, setleme, tersleme |
| Temizle/Tersle | CLR, CPL | ACC ve bit işlemleri |
| Toplama | ADD, ADDC, INC | Artırma ve toplama |
| Çıkarma | SUBB, DEC | Azaltma ve çıkarma |
| Çarpma/Bölme | MUL, DIV | Aritmetik |
| Döndürme | RL, RR, RLC, RRC | Bit kaydırma |
| Değiştirme | SWAP, XCH, XCHD | Nibble/byte değiştirme |
| Koşulsuz Atla | SJMP, AJMP, LJMP | Program akışı |
| Koşullu Atla | JZ, JNZ, JC, JNC, JB, JNB, CJNE, DJNZ | Şartlı dallanma |
| Bit Transfer | MOV C, SETB, CLR, CPL | Tek bit işlemleri |


