| 
                
             | 
        
        
            
                
                    
                        | 
                            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
                         
                     
                 
                
                
             | 
        
        
            | 
                
             |