|
80x86 KOMUT SETİ (Bölüm 4) |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bu makalemde 80x86
mantıksal (logical) komutlarından bazılarını anlatmaya çalışacağım. Ayrıca VGA
80x25 text mode ekraın hafız alanına direk erişim yapacağız.
80x86 KOMUT SETİ (Bölüm 4)
Mantıksal (logical)
komutlar AND, OR, XOR ve NOT adıyla bilinen ve matematiksel hesaplamalarda çok
kullanılan komutlardır.
AND komutu
Yapı olarak AND (VE)
mantığı 1 ve 0lar ile ifade edilirse;
1 ve 1 = 1
1 ve 0 = 0
0 ve 1 = 0
0 ve 0 = 0
sonuçlarını üretir.
Bu komutu assembly
programcıları genelde maskeleme işlerinde kullanırlar. Örneğin 1 bytelık
değerin 7, 6, 5, ve 4. bitlerini göz ardı etmek için aşağıdaki gibi bir program
parçası yazılabilir.
mov al, A5h
and al, 0Fh
bu işlemlerden sonra
ALin yüksek değerli 4 biti (nibble) sıfırlanacaktır yani AL binary olarak ifade
edersek 0000 0101 olacaktır. Buna düşük değerlikli 4 bite dokunmadan diğer
bitleri sıfırlamakta denilebilir.
Bu komutu
elektronikçiler çok kullanırlar, mesela paralel porttan alınacak olan verinin
sadece 5 bitini kontrol etmek için;
mov dx,378h
; paralel port adresi
in
al, dx
; bu adresten bilgiyi al
and al,
0010 0000b ; 5. biti kontrol et (maskele)
jnz
devam
; 5. bit 1 ise "devam" a dallan
.
.
.
.
devam: .
;devam
komutları
.
Diyelim ki ALye IN
komutu ile alınan byte 1011 0001 olsun, bu durumda;
1011 0001
0010 0000
v__________
0010 0000
yukarıdaki işlem
yapılır ve AND komutu bayrak kaydedicisinin Z bitini 0 olarak kurar, çünkü sonuç
0dan farklıdır. İşte burada maske olarak sadece 5. biti 1 olan bir byte
seçilmiştir.
Not: Windows XP
altında paralel porta doğrudan erişim işletim sisteminin kerneli tarafından
engellendiğinden bu programı windows XP öncesi işletim sistemlerinde
çalıştırabilirsiniz. IN ve OUT komutlarının kullanımı sonraki makalelerin
konusudur.
AND komutunun
kullanım formatları;
and hedef, kaynak ;hedef := hedef
& kaynak
and reg, reg
and mem, reg
and reg, mem
and reg, imm
and mem, imm
and eax/ax/al,
imm
OR komutu
Mantıksal
veya işlemini gerçekleştirir,
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
doğruluk tablosu
yukarıdaki gibidir. Kullanım formatları AND komutundaki gibidir.
XOR komutu
XOR olmadan
şifreleme işlemleri sanırım çok zor yapılırdı. Çok fazla kullanım alanı olmakla
beraber veri paketleme ve şifreleme işlemleri için hayat kurtarıcı bir komuttur.
eXclusiveOR (özel veya) kelimesinin kısaltmasıdır. Doğruluk tablosu;
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
Ben genelde
öğrencilerime bu komutun yaptığı işi anlatırken "aynılarda 0 farklılarda 1"
sonucunu veren mantıksal ifade derim.
XOR komutu ile
şifreleme ve paketleme işlemleri için örnekler şu anda belki de sizin için biraz
ağır kaçabilir, bunun yerine swap (yer değiştirme) ve kaydedici sıfırlama
örneklerini XOR komutunu ile neler yapılabildiğine örnek teşkil edeceğini
düşünüyorum.
xor
ax,ax ; ax=0 olur ve "mov ax,0" dan kat kat hızlı çalışır
;AX = 1234h ve BX=9876h olsun
xor
ax, bx
xor bx, ax
xor ax, bx
; bu 3 komut
sonrasında AX = 9876h ve BX = 1234h olur.
XOR komutunun
kullanım formatları AND ve OR komutlarınınkiyle aynıdır.
Bayrakların
Durumu
Yukarıda anlattığım
bu üç komut bayrak kaydedicisini aşağıdaki gibi etkiler;
Carry bayrağını 0
yaparlar,
Overflow bayrağını 0 yaparlar
Zero bayrağını şayet sonuç 0 ise 1 yaparlar ve aksi durumlarda bu bayrağı 0
yaparlar
En Yüksek değerlikli biti Sign bayrağına kopyalarlar
Parity bayrağını (sonuçtaki 1lerin sayısı çift ise) 1 yaparlar
Auxiliary carry (Ara Elde) bayrağının durumunu değiştirirler.
NOT komutu
NOT komutu
operandının mantıksal tersini alır.
Kullanım formatları
aşağıdaki gibidir;
not reg
not mem
; BL kaydedicisinin
değeri 15h olsun;
not bl
;bl = 0001 0101b
iken bu komuttan sonra 1110 1010b olur.
NOT komutu hiçbir
bayrağı etkilemez.
Şimdi Uygulama
Zamanı
Bu makalemde sizlere
örnek teşkil etmesi için konsol ekranındaki görüntüyü (tüm yazıları) önce karma
karışık bir hale getiren daha sonrada tekrar orijinal haline çeviren bir
programı anlatmayı düşünüyorum. Öncelikle Windowsun cmd.exe yada komut istemi
ile açılan pencerenin görüntüsünün aslında B800:0000 adresinin bir yansıması
olduğunu hatırlatmak isterim. Debug ile bu alana göz atalım.
Şekil 1
- Aslında ekran yansıması da hafızadaki bytelardan ibarettir.
Konsol penceresi
açılınca şayet işletim sisteminiz Windows XP ise "Microsoft Windows XP....." ile
başlayan bir yazı görülür. Debugı çalıştırıp b800:0000 adresini ekrana
döktüğümüzde bu yazı hala aynı yerindedir. B800h segmenti de burada görünen
yazının bulunduğu text video alanıdır. Şekilde B800:0000 adresindeki 4Dh
değerinin aslında M harfi olduğunu ve C karakterininde yine aynı segmentte bir
değer olduğunu görüyorsunuz. Yukarıdaki resimdeki hafıza dökümü, en üst satırın
tamamını ve sonraki satırın yarısından biraz fazlasını gözler önüne seriyor.
Hafıza dökümünde tek numaralı her offsette (0001h,0003h,00F3h gibi) 07h değerini
görüyorsunuz. Bu text mode özelliği olup siyah zemin üzerine beyaz yazı anlamına
gelir. Gerçektende ekrandaki karakterlerin hepsi beyaz ve zemin siyah değil mi?
Konsol ekranının
tamamı karakterlerle dolsa, ekranda kaç karakter görürüz? Tabi ki 80x25=2000
adet. Şimdi bu karakterlerin tek tek adreslerine erişip (özellik içeren 07h
bytelarını atlayarak) bunları lojik bir işlemden geçirsem ekranın o anki
görüntüsü değişir, hem de bizim boş olarak tabir ettiğimiz ama aslında 20h olan
yerler bile. Böyle bir durumda ekranda karman çorman anlaşılmaz bir görüntünün
belirmesi olası bir durumdur.
Peki değiştirdiğim
her byteı tekrar eski haline getirebilir miyim? Bütün bunların cevabı aşağıdaki
programda saklı.
Şekil 2
- 80x25 text mode da görünen ekrana müdahele.
Şekil 3
- Program çalıştırılmadan önceki durum.
Şekil 4
- Ekrandaki yazılara ne oldu böyle?
Şekil 5
- Klavyeden bir tuşa basıldığında görüntü tekrar normale döner.
Aslında video
işlemleri için daha pratik interruptlar mevcuttur, burada anlatmaya çalıştığım,
"şayet assembly dili ile hafızanın her yerine erişebilecek deneyime sahipseniz
yapamayacağınız şey yoktur" gerçeğiydi.
Bu programda
özellikte, text video alanının segment adresini DS kaydedicisine yüklenişini ve
bu alanın kaydedici dolaylı (register indirect) adresleme modu ile sanki kendi
tanımladığımız bir data alanı gibi kullanılışını incelemenizi tavsiye ederim.
Düşük seviyede
sağlam ve hızlı kodlar yazmanız dileğiyle... :)
Makale:
80x86 KOMUT SETİ (Bölüm 4) Assembly ve X86 Programlama Eren Erener
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|