Daha önce cgtr'de açmış olduğum "Z80 assembler öğreniyoruz" başlığına yazdığım mesajları buraya kopyalıyorum. Ayrıca bazı düzeltmeler/eklemeler yaptım.
DERS 1
Z80 8 bitlik bir mikroişlemcidir. 8 data hattına ve 16 adres hattına sahiptir. 16 adres hattıyla 65536 bellek hücresi adreslenebilir ve bunlar adresler 0 ... 65535 arasındadır. Bu adres aralığı ZX-spectrumda, 0 ... 16383 arasında ROM, 16384 ... 65535 arasında RAM olarak belirlenmiştir. (Spectrum'un bellek düzeni ayrı bir yazı konusudur.)
Bir "byte" 8 "bit" ten oluşur ve bir "bit" sadece "0" veya "1" değerini alabilir. Buna göre bir byte 00000000 ..... 11111111 arasında 256 değer alabilir. Bu değerler 0 ... 255 arasında yazılabilir.
Her bitin bir sayı değeri vardır. Bitler sağdan sola doğru dizilmiştir ve 0. bit, 1. bit ..... 7. bit olarak tanımlanır.
Bitler : 7 6 5 4 3 2 1 0
0. bit : 1
1. bit : 2
2. bit : 4
3. bit : 8
4. bit : 16
5. bit : 32
6. bit : 64
7. bit : 128
değerine sahiptir. Bu sayıları toplarsak 255 değerini elde ederiz. Z80'de herhangi bir biti "0" veya "1" yapmamızı sağlayan komutlar bulunmaktadır.
Bu kısa bilgilerden sonra yavaş yavaş komutlara giriş yapabiliriz.
Komutları genel olarak birkaç gruba ayırabiliriz. (unuttuklarım olabilir.)
1-Yükleme komutları/yığın komutları - Tamamlandı
2-Sıçrama/geri dönüş komutları - Tamamlandı
3-Aritmetiksel/mantıksal komutlar - Tamamlandı
4-Arttırma/azaltma komutları - Tamamlandı
5-Kaydırma/döndürme komutları - Tamamlandı
6-Karşılaştırma komutları - Tamamlandı
7-Bit düzeyinde işlem yapan komutlar - Tamamlandı
8-Blok işlem yapan komutlar/giriş-çıkış komutları - Hazırlanacak
9-Diğer komutlar - Hazırlanacak.
Komutları görmeye başlamadan önce register kavramını inceleyelim.
Her mikroişlemcide bulunan ve adına register denilen işlem birimleri vardır.
Bu registerler ile yükleme, aritmetik işlemleri vs. yapılır. Z80'de A, B, C, D, E, H, L, Flag, SP, IX, IY registerleri vardır. SP, IX ve IY 16 bitlik register, diğerleri 8 bitlik registerdir. Ayrıca B ve C registerleri bir araya gelerek 16 bitlik BC registeri olarak kullanılabilir. Aynı durum D ve E, H ve L registerleri içindir. Böylece elimizde kullanma durumuna göre 3 adet daha 16 bitlik register hazır olur.
Flag registeri, o an işlenen bir komuta, yapılan işe göre çeşitli durumlar alabilen ve her biti farklı amaçlar için kullanılan bir registerdir. Mesela bir toplama işleminde "elde" var mı, sonuç "0" mı gibi durumları belirten bir registerdir. Bazı işlemlerde bu "durum"ları kontrol etmemiz/değiştirmemiz ve program içinde şartlı işlemler yapmamız gerekebilir.
DERS 2 - YÜKLEME KOMUTLARI :
Yükleme komutları bir registere, bir register çiftine veya bir adrese sabit bir sayı, başka bir registerin içeriği veya herhangi bir adresin içeriğini yüklemek için kullanılır.
Derslerimizde daha anlaşılır olması bakımından aşağıdaki kısaltmaları kullanacağız.
Komutun biçimi LD hedef,kaynak şeklindedir.
d : mesafe,
r : register,
rp : register çifti,
nn : bir baytlık sayı,
nnnnn : iki baytlık sayı,
(nnnn) : adres,
(rp) : Bir register çiftinde bulunan sayının belirttiği adresin içeriği anlamına gelmektedir.
ÖRNEK : LD BC,16384 olsun, LD A,(BC) komutuyla, BC register çiftinde bulunan 16384 numaralı adresin içeriği Aküye yüklenir.
Z80'de oldukça çok adresleme modları vardır ve bunları bilmemiz gerekiyor.
1- LD r,nn --> Bir registere bir baytlık sayı yüklenir.
Örnek : LD A,0 ---> A registerine (Aküye) sabit 0 sayısı yüklenir.
Örnek : LD L,255 -> L registerine 255 sayısı yüklenir.
Bu adresleme modunda A,B,C,D,E,H,L registerlerine bir baytlık sabit sayı yüklenir.
Bu adresleme moduna LD (HL),nn ;LD (IX+d),nn ve LD (IY+d),nn komutlarıda dahildir. Son üç komut ile ilgili registerlerin gösterdiği adrese nn sabit sayısı yüklenir.
2- LD rp,nnnn ---> Bir register çiftine 2 baytlık bir sayı yüklenir.
Örnek : LD BC,32000 ---> BC register çiftine 32000 sayısı yüklenir.
Örnek : LD HL,0 -------> HL register çiftine 0 sayısı yüklenir.
Bu adresleme modunda BC,DE,HL,IX,IY ve SP registerlerine iki baytlık sabit bir sayı yüklenir.
LD BC,nnnn
LD DE,nnnn
LD HL,nnnn
LD IX,nnnn
LD IY,nnnn
LD SP,nnnn
3- LD r,r ---> Bir registere başka bir registerin içeriği yüklenir.
Örnek : LD D,A ----> D registerine A registerinin içeriği yüklenir. D ile A'da aynı değer bulunur. A'nın içeriği kaybolmaz.
Bu adresleme modunda A,B,C,D,E,H,L registerlerinin herhangi birinden herhangi birine yükleme yapılır. Kaynak ve hedef registerler aynı olabilir. Yani LD C,C gibi bir komut olabilir
.
Ayrıca I (İnterrupt) ve R (Refresh) registerleri sadece A registeriyle birlikte kullanılır.
LD I,A
LD R,A
LD A,R
LD A,I
4- LD rp,rp ----> Bu adresleme modunda sadece SP registerine HL, IX veya IY registerlerinden yükleme yapılabilir.
LD SP,HL
LD SP,IX
LD SP,IY
5- LD (rp),r ----> Bu modda ise A,B,C,D,E,H ve L registerlerinden herhangi birinin içeriği (HL), (IX+d), (IY+d) 'ye yüklenir.
Bu registerlerden sadece A registeri (BC), (DE) ve (nn) ile birlikte kullanılabilir.
LD (HL),r
LD (IX+d),r
LD (IY+d),r
Sadece A registeri ile kullanılan komutlar.
LD (BC),A
LD (DE),A
LD (nnnn),A
HATIRLATMA : Parantez içindeki ifadeler, ilgili registerlerin kendisine değil, gösterdikleri adrese yükleme yapılacağını belirtir.
ÖRNEK : LD BC,60000 ile BC registerine 60000 sayısısı yükleyelim. LD A,210 komutu ile aküye 210 sayısını yükleyelim. LD (BC),A komutu ile Aküdeki 210 sayısını 60000 adresine yüklemiş oluruz. Eğer hedef adres sabit ise, register çifti kullanılmadan LD (nnnn),A komutuyla ilgili adrese yükleme yapılır. Örneğimizden devam edersek LD A,210 ; LD (60000),A şeklinde kullanabiliriz.
6- LD r,(rp) ----> Bu modda bir register çiftinin gösterdiği adresin içeriği A,B,C,D,E,H,L registerlerinden birine yüklenir. (rp) ise (BC),(DE),(HL),(IX+d),(IY+d),(nnnn) olabilir. (BC),(DE) ve (nnnn) sadece A registeri ile kullanılabilir.
LD r,(HL)
LD r,(IX+d)
LD r,(IY+d)
Sadece A registeri ile kullanılan komutlar.
LD A,(BC)
LD A,(DE)
LD A,(nnnn)
ÖRNEK : LD HL,22528 ; LD D,(HL) Bu örnekte HL registerinde belirttiğimiz adresin içeriği D registerine yüklenir. Eğer kaynak adres sabit ise LD A,(nnnn) komutu kullanılabilir.
Son iki adresleme modu biraz karışık olup dikkatli kullanmak gerekir.
7- LD rp,(nnnn)----> Bu adresleme modunda kaynak adresteki sayının kendisi değil, sayının belirttiği adresin ve bir fazlasının içeriği yüklenir.
ÖRNEK : 60000 adresinde 100, 60001 adresinde ise 20 olsun. LD HL,(60000) komutunu verdiğimizde HL'ye 60000 değil 256*20+100 sayısı yüklenir. Formül 256*(nnnn+1)+(nnnn)'dır.
Bu modda BC,DE,HL,IX,IY ve SP registerleri kullanılır.
LD BC,(nnnn)
LD DE,(nnnn)
LD HL,(nnnn)
LD IX,(nnnn)
LD IY,(nnnn)
LD SP,(nnnn)
8- LD (nnnn),rp ----> Yukarıdaki adresleme modunun tersidir ve herhangi bir register çiftindeki sayıları (nnnn) ve (nnnn+1) ile belirtilen adreslere kopyalar.
ÖRNEK : LD HL,22528 ; LD (30000),HL komutlarıyla HL register çiftinde bulunan 22528 sayısın LOW-BYTE'ı 30000 adresine, HIGH-BYTE'ı 30001 adresine yüklenir.
Bu son modda da BC,DE,HL,IX,IY ve SP registerleri kullanılır.
LD (nnnn),BC
LD (nnnn),DE
LD (nnnn),HL
LD (nnnn),IX
LD (nnnn),IY
LD (nnnn),SP
EK BİLGİ : BC,DE,HL register çiftlerinde kullanılan ilk harfler HIGH byte, ikinci harfler LOW byte değerini taşır.
Yükleme komutlarında kullanılan adresleme modları bu kadar.
DERS 3 - SIÇRAMA VE GERİ DÖNÜŞ KOMUTLARI
Kaldığımız yerden devam ediyoruz. Sıçrama komutları iki bölüme ayrılır.
1- Mutlak sıçrama komutları,
2- Göreceli sıçrama komutları.
Hem mutlak sıçrama komutları, hem de göreceli sıçrama komutları kendi aralarında şartsız ve şartlı olarak ikiye ayrılır.
1 - MUTLAK SIÇRAMA KOMUTLARI
Mutlak sıçrama komutlarında hedef adresin kendisi yazılır. Bu komutlar işlev bakımından ikiye ayrılır. Birincisi CALL komutu, ikincisi JP komutudur. CALL komutu şöyle çalışır. Ana program çalışırken CALL komutuna sıra geldiğinde, program CALL komutuyla belirtilen adresteki başka bir programı çalıştırır ve program sonuna mutlaka olması gereken RET komutuyla ana programa geri döner. Ana programda CALL komutundan sonraki komut işletilir.
JP komutuyla ise program ilgili adrese sıçrar ve oradan çalışmaya devam eder.
CALL komutu örnek :
ld a,0
call renk
ld a,1
call renk
ld a,2
call renk
...
...
...
renk out (254),a
xor a
out (254),a
ret
...
...
JP komutu örnek :
ld hl,4000h
ld a,(hl)
jp devam
....
...
...
devam out (254),a
....
...
CALL ve JP komutlarında adres 0 ile 65535 arasında olabilir.
Mutlak sıçrama komutlarında HL,IX ve IY registerleride kullanılabilir. Bu komutlar JP (HL), JP (IX) ve JP (IY) dır.
2 - GÖRECELİ SIÇRAMA KOMUTLARI
Bu sıçrama komutlarında, hedef adresin kendisi değil, adrese olan uzaklık belirtilir. Bu uzaklık parametresi -geçen derste gördüğümüz "d:mesafe" ile gösterilir- 0-127 arasındaysa, şıçrama ileri yöndedir. 128-255 arasında ise geri yöndedir. Dolayısıyla bu komutlarla ancak program içerisinde kısa mesafelere sıçrayabilirsiniz.
Sapılacak adres gerideyse kaç bayt olduğu 256-d formülüyle bulunur. Programlarımızı yazarken etiket kullandığımız için kaç bayt ileri veya geri gittiğimiz program derlenirken hesaplanır. Eğer mesafe sınırlar dışındaysa derleyici hata verecektir.
Göreceli sıçrama komutu JR ile gösterilir ve Jump Relative'nin kısaltmasıdır. Eğer yazdığınız program kısa ve programı sürekli çalıştıracaksanız JR komutunu, uzunsa JP komutunu kullanabilirsiniz.
Örnek :
start ld a,0
loop1 ld b,1
...
... Aradaki program 128 bayttan uzun olmamalıdır.
...
jr loop1
GERİ DÖNÜŞ KOMUTLARI :
Geri dönüş komutları ana programı bir kez çalıştırıp sonlandırmak için ve CALL ile sıçranılan alt programlardan ana programa dönüş için kullanılan komutlardır. Geri dönüş komutlaı da şartsız ve şartlı olarak ikiye ayrılır.
En çok kullanacağımız şartsız geri dönüş komutudur ve RET ile gösterilir. Return'un kısaltmasıdır.
RET komutuna benzer "RETI" ve "RETN" komutları vardır. "RETI" interrupttan geri dön, "RETN" Maskelenez İnterruptan geri dön demektir.
ŞARTLAR :
Şart dediğimiz durumlar, o an işlenen bir komuta göre "F" registerinin değişen bitlerini kontrol ederek öğrenilir. "F" (Flag) registerinin bitleri aşağıdaki gibi tanımlanmıştır.
7.bit : Sign (işaret) biti,
6.bit : Zero (sıfır) biti,
5.bit : Tanımsız,
4.bit : Half Carry biti,
3.bit : Tanımsız,
2.bit : P/V (Parity/Overflov) Eşlik/Taşma biti,
1.bit : A/N (Add/Subtract) Toplama(0)/Çıkartma(1) biti,
0.bit : C (Cary) Elde biti.
Bazı komutlar bu bitlerden birden fazlasını değiştirebilir.
ŞARTLI MUTLAK SIÇRAMA KOMUTLARI :
CALL Z,adres ; "Zero" biti "1" ise sıçra,
CALL NZ,adres ; "Zero" biti "0" ise sıçra,
CALL C,adres ; "Carry" biti "1" ise sıçra,
CALL NC,adres ; "Carry" biti "0" ise sıçra,
CALL P,adres ; "Sign" biti "1" (pozitif) ise sıçra,
CALL M,adres ; "Sign" biti "0" (negatif) ise sıçra,
CALL PE,adres ; "P/V" biti "1" ise çağır,
CALL PO,adres ; "P/V" biti "0" is çağır.
JP Z,adres
JP NZ,adres
JP C,adres
JP NC,adres
JP P,adres
JP M,adres
JP PE,adres
JP PO,adres
ŞARTLI GÖRECELİ SIÇRAMA KOMUTLARI :
JR Z,mesafe
JR NZ,mesafe
JR C,mesafe
JR NC,mesafe
DJNZ mesafe
DJNZ mesafe komutu özel olarak B registeri içindir. Açılımı "Decrement and Jump if Not Zero" dur. Yani B registerinin değerini bir azalt, registerin değeri "0" olmadıysa sıçra demektir.
ŞARTLI GERİ DÖNÜŞ KOMUTLARI :
Aynı şartlı sıçrama komutlarında olduğu gibi geri dönüşlerde de bazı şartlar kontrol edilebilir ve geri dönüş işlemi yapılabilir.
RET C
RET NC
RET Z
RET NZ
RET M
RET P
RET PE
RET PO
Bu konu oldukça önemlidir ve program içinde döngü yaparken bazı durumları kontrol için gereklidir.
DERS 4 - ARİTMETİKSEL/MANTIKSAL KOMUTLAR :
1-ARİTMETİKSEL KOMUTLAR :
Adındanda anlaşılacağı üzere Z80 registerleriyle işlem yaparken 8 bitlik veya 16 bitlik toplama ve 8 bitlik çıkarma yapabiliriz.
Z80'de gerek toplama gerekse çıkartma işlemlerinde "C" (elde) biti kullanıp kullanmamamızı sağlayan komutlar vardır.
Aritmetik komutlarında çarpma ve bölme komutları yoktur.
8 bitlik toplam ve çıkartma komutları sadece Aküyle kullanılır. Yani sadece Aküyü kullanarak toplama/çıkartma yapabiliriz. Yapılan işlemin sonucu Aküde tutulur. 16 bitlik toplma işlemlerde HL, IX ve IY registerleri kullanılır ve sonuç hedef registerde tutulur. İşlemin sonucunda "Z,C,S,H,V" bitleri etkilenir.
-- TOPLAMA KOMUTLARI --
a) "C" biti (Elde biti) kullanılan toplama komutları:
a-1) 8 bitlik toplama komutları
ADC A,(HL) --> HL registerinde tutulan sayının gösterdiği adresin içeriği ile Akünün içeriği "C" biti kullanılar toplanır. Sonuç Aküde tutulur.
ADC A,(IX+d) ve ADC A,(IY+d) : Yukarıdaki komut gibidir. Ancak IX ve IY registerlerinde tutulan sayıya "d" ile belirtilen sayı eklenerek bulunan yeni değerin gösterdiği adresin içeriği Aküye yüklenir.
ADC A,r --> Akü ile herhangi bir registerin içeriği "C" biti kullanılarak toplanır ve sonuç Aküde tutulur. "r" yerine A,B,C,D,E,H,L gelebilir.
ADC A,nn --> Akü ile 8 bitlik sabit bir sayı, "C" biti kullanılarak toplanır ve sonuç Aküde tutulur.
a-2)16 bitlik toplama komutları:
"C" biti kullanılan 16 bitlik toplama komutları sadece HL registeriyle kullanılır.
ADC HL,BC --> HL ile BC'nin içeriği "C" biti kullanılarak toplanır ve sonuç HL'de tutulur.
ADC HL,DE --> HL ile DE'nin içeriği "C" biti kullanılarak toplanır ve sonuç HL'de tutulur.
ADC HL,HL --> HL ile HL'nin içeriği "C" biti kullanılarak toplanır ve sonuç HL'de tutulur.
ADC HL,SP --> HL ile SP'nin içeriği "C" biti kullanılarak toplanır ve sonuç HL'de tutulur.
NOT : Bir register kendisiyle toplandığında registerdeki değer 2 ile çarpılmış olur.
NOT : "C" biti toplama sırasında sonucu etkiler. Etkilememesi için "C" bitinin sıfırlanması gerekir. "CCF" komutu "Clear Carry Flag" demektir ve "C" bitini "0" yapar.
b) "C" biti (Elde biti) kullanılmaya toplama komutları :
b-1) 8 bitlik komutlar:
Bu tip komutlarda "C" bitinin durumu dikkate alınmaz. İşlem yapılır ve sonuç Aküde tutulur.
ADD A,(HL)
ADD A,(IX+d)
ADD A,(IY+d)
ADD A,r --> "r" yerine A,B,C,D,E,H,L gelebilir.
ADD A,nn
b-2) 16 bitlik komutlar :
"C" bitinin durumu dikkate alınmaz, sonuç hedef registerde tutulur.
Hatırlatma : Bir komuttan sonra yazılan ilk parametre hedef, ikinci parametre kaynaktır.
ADD HL,BC
ADD HL,DE
ADD HL,HL
ADD HL,SP
ADD IX,BC
ADD IX,DE
ADD IX,IX
ADD IX,SP
ADD IY,BC
ADD IY,DE
ADD IY,IY
ADD IY,SP
-- ÇIKARTMA KOMUTLARI --
a) "C" biti (Elde biti) kullanılan komutlar:
a-1) 8 bitlik çıkartma komutları:
SBC A,(HL)
SBC A,(IX+d)
SBC A,(IY+d)
SBC A,r
SBC A,nn
a-2) 16 bitlik çıkartma komutları:
SBC HL,BC
SBC HL,DE
SBC HL,HL
SBC HL,SP
b) "C" biti (Elde biti) kulllanılmayan komutlar.
Bu kategoride sadece 8 bitlik komutlar mevcuttur.
SUB A,(HL)
SUB A,(IX+d)
SUB A,(IY+d)
SUB A,r
SUB A,nn
NOT : Çıkartma işleminde "C" biti sonucu etkiler. Etkilememesi için "C" bitinin set edilmesi gerekir. "SCF" komutu (Set Carry Flag) demektir ve "C" biti "1" yapar.
2 - MANTIKSAL KOMUTLAR :
Mantıksal komutlarla Aküdeki değer ile başka bir değer arasında bit düzeyinde AND (ve), OR (veya), XOR (özel veya) işlemi yapabiliriz.
Komutları görmeden önce bu işlemlerin nasıl olduğunu görelim.
Komutlar bit düzeyinde işlem yaptığı için hedef ile kaynak arasındaki etkileşim aynı numaralı bitler arasında olur.
a) "AND" işlemi:
AND işleminde bir birine karşılık gelen bitlerin her ikiside "1" ise hedef bit "1" olur. Diğer durumlarda hedef bit "0" değerini alır.
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
AND komutuyla istediğimiz bitleri "0" yapabiliriz. AND işlemi bit düzeyinde çarpma işlemidir.
AND (HL)
AND (IX+d)
AND (IY+d)
AND r --> "r" yerine A,B,C,D,E,H,L gelebilir. Akü ile kaynak register arasında AND işlemi yapılır.
AND nn --> Akü ile 8 bitlik sabit sayı arasında AND işlemi yapılır.
ÖRNEK :
Aküdeki değeri ikili sistemdem gösterelim ve
%11001011 (203) olsun. Kaynak ise;
%00101101 (45) olsun. AND işleminin sonucu;
---------
%00001001 (9) olur
Akünün herhangi bir bitini "0" yapmak için, 255-bitin sayısal değeri=, AND komutunun parametresi olarak kullanılır. Sonuç Aküde yer alır.
Yukarıdaki örnekten devam edelim ve 3. bitini (normalde "1") "0" yapalım.
3. bitin sayısal değeri 8'dir. (ilk dersimizi hatırlayın). Sayımız 255-8=247 olur ve ikili sistemde %11110111 ile gösterilir.
%11001011 (203)
%11110111 (247)
---------
%11000011 (195)
Gördüğünüz gibi 3. biti "0" yaptık. Eğer birden fazla biti "0" yapmak gerekiyorsa, ilgili bitlerin sayısal değerlerini toplarız ve 255 ten çıkartırız.
b) "OR" işlemi:
OR işleminde bir birine karşılık gelen bitlerin her ikiside "0" ise hedef bit "0" olur. Diğer durumlarda hedef bit "1" değerini alır.
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
OR komutuyla istediğimiz bitleri "1" yapabiliriz. OR işlemi bit düzeyinde toplama işlemidir.
OR (HL)
OR (IX+d)
OR (IY+d)
OR r --> "r" yerine A,B,C,D,E,H,L gelebilir. Akü ile kaynak register arasında OR işlemi yapılır.
OR nn --> Akü ile 8 bitlik sabit sayı arasında OR işlemi yapılır.
ÖRNEK :
Aküdeki değeri ikili sistemdem gösterelim ve
%11001011 (203) olsun. Kaynak ise;
%00101101 (45) olsun. OR işleminin sonucu;
---------
%11101111 (239) olur
Akünün herhangi bir bitini "1" yapmak için, ilgili bitin sayısal değeri, OR komutunun parametresi olarak kullanılır. Sonuç Aküde yer alır.
Yukarıdaki örnekten devam edelim ve 5. bitini (normalde "0") "1" yapalım.
5. bitin sayısal değeri 32'dir. (ilk dersimizi hatırlayın). Sayımız 32 olur ve ikili sistemde %00100000 ile gösterilir.
%11001011 (203)
%00100000 (32)
---------
%11101011 (235)
Gördüğünüz gibi 5. biti "1" yaptık. Eğer birden fazla biti "1" yapmak gerekiyorsa, ilgili bitlerin sayısal değerlerini toplarız ve OR komutunun parametresi olarak kullanırız.
c) "XOR" işlemi:
XOR işleminde bir birine karşılık gelen bitlerin her ikiside aynı ise hedef bit "0" olur. Diğer durumlarda hedef bit "1" değerini alır.
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
XOR komutunu kullanarak herhangi bir bitin "0" ve "1" arasında dönüşümünü sağlayabiliriz.
XOR (HL)
XOR (IX+d)
XOR (IY+d)
XOR r --> "r" yerine A,B,C,D,E,H,L gelebilir. XOR A komutu Aküyü sıfırlar.
XOR nn --> Akü ile 8 bitlik sabit sayı arasında XOR işlemi yapılır.
ÖRNEK :
Aküdeki değeri ikili sistemdem gösterelim ve
%11001011 (203) olsun. Kaynak ise;
%00101101 (45) olsun. XOR işleminin sonucu;
---------
%11100110 (230) olur
Aküdeki değerin 7. bitini "1" iken "0", "0" iken "1" yapalım. Hangi bitin durumunu değiştireceksek Akü ile o bitin sayısal değeri arasında XOR işlemi yaparız.
%11001011 (203) Aküdeki eski değer.
%10000000 (128) 7. bitin değeri.
---------
%01001011 (75) Aküdeki yeni değer.
Gördüğünüz gibi diğer bitlere dokunmadan 7. bitin durumunu değiştirdik. "1" iken "0" oldu. Aynı işlemi tekrar edelim.
%01001011 (75) Aküdeki eski değer.
%10000000 (128) 7. bitin değeri.
---------
%11001011 (203) Aküdeki yeni değer.
Diğer bitlere dokunmadan 7. biti "0" durumundan "1" durumuna getirdik.
XOR komutunu istediğimiz bit(ler) için "0/1" anahtarı gibi kullanabiliriz.
Unuymayalım, XOR komutunda karşılıklı gelen bitlerin durumları aynıysa sonuç "0", farklıysa "1" olur.
NOT : AND, OR ve XOR komutları sadece Aküyle kullanılır. Yapılan işlem sonucunda Aküdeki değer değişir. Ayrıca "Flag" registerindeki bitler etkilenir.