Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Mustafa Arkan
Mustafa Arkan
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
4 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: adedince adresi bulunan degeri degerini dizisi dizisini double height: padding: registerinde registerine segmentte string tutulan X86 Assembly Mustafa Arkan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : X86 Assembly
Yayınlanma Tarihi : 12.5.2006
Okunma Sayısı : 46652
Yorum Sayısı : 4     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 21.11.2024
Turhal Temizer
Mac OS/X Removing CUDA 21.11.2024
Burak Selim Şenyurt
Rust ile ECS Yaklaşımını Anlamak 21.11.2024
Burak Selim Şenyurt
Birlikte Rust Öğrenelim Serisi 21.11.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
80x86 String Komutları
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
80x86 String Komutları (Bölüm 4)

Çeşitli bilgilerin birleşerek biraya gelmelerine string denir. “Merhaba” kelimesi bir string’dir. ASSEMBLY’de stringleri kontrol edebilen komutlar vardır ve bu komutlar hafıza blokları üzerinde çalışırlar.
 
Bu makalemizde 80 X 86 ailesinde kullanılan string komutlarını (MOVS, CMPS, LODS, SCAS, STOS ) incelemeye çalışacağız, komutlarımız byte, word ve double word dizileri üzerinde işlemler gerçekleştirmek için kullanılmaktadır. Aşağıda ilgili komutlar ve kullanım şekillerini tablo halinde görebilirsiniz.
 
 
Komut Kullanım Şekli
MOVS        movsb,movsw,movsd
CMPS        cmpsb,cmpsw,cmpsd
SCAS        scasb,scasw,scasd
STOS        stosb,stosw,stosd
LODS        lodsb,kodsw,lodsd
 
 
String komutlarını ile işlem yaparken, Indis registerleri olarak adlandırılan SI ve DI registerlerinden, bellekteki bir bilgiyi bir adresten başka bir adrese taşırken kullanıyoruz. SI registerine taşınacak bilgi dizisinin başlangıç adresini, DI registerine de diziyi taşımak istediğimiz belleğin başlangıç adresini yerleştirerek yapmak istediğimiz işlemi gerçekleştirebiliriz.
 
Indis registerlerinin program içeirisinde kullanım şeklini gösteren örneğimizi inceleyebilirsiniz.

Byte1 db ‘a’             ;byte1 için ayrılan alana ’a’ değerini koy
Byte2 db ‘*’             ;byte2 için ayrılan alana ’*’ değerini koy

Movs Byte2,Byte1     ;byte2 bilgi dizisini, byte1 bilgi dizisine kopyala

Lea di,Byte2             ;taşımak istediğimiz belleğin başlangıç adresi di registerine koy
Lea si,Byte1             ;taşınacak bilgi dizisinin başlangıç adresini si registerine koy

Movsb                     ;si registerinde bulunan byte dizisini di registeri ile gösterilen adrese byte olarak taşı
 
 
String işlemlerinde kullanılan komutları daha detaylı incelemeye başlayalım;
 
MOVS Komutu:
 
movs komutunun kullandığı veri tipine göre farklı kullanım şekilleri vardır, data segmentinde ve ofset adresi SI rejisterinde bulunan byte / word / double word  dizilerini ES ve DI registerleri ile gösterilen adrese taşır. CX registerinde tutulan deger adedince taşıma işlemi tekrarlanır.movsb ile byte dizileri, movsw ile word dizileri ve movsd ile double word dizileri üzerinde işlemler yapılır.
REP: kendisinden sonra gelen string komutunun cx registerinin değeri 0 olana dek tekrarlar.
 

Komut Anlamı İşlem
movsb byte dizisi taşı si’de bulunan byte dizisini, cx registerinde tutulan değer adedince di registerine  taşı
movsw word dizisi taşı si’de bulunan word dizisini, cx registerinde tutulan değer adedince di registerine  taşı
movsd double dizisi olarak taşı si’de bulunan double word dizisini, cx registerinde tutulan değer adedince di registerine  taşı
CMPS Komutu:
 
REPE, REPZ, REPNE ve REPNZ komutlarının parametresi olarak bellekteki iki stringi birbirleriyle karşılaştırma işleminde kullanılır. Stringlerden biri Data Segmentte diğeri ise Extra Segmentte tutulur. Data Segmentindeki stringin ofset adresi SI registerine, Extra segmentteki stringin ofset adresi ise DI registerine yerleştirilir. Cx registerindeki değer adadince karşılaştırma işlemi tekrarlanır.

Not:REPE: eşit oduğu zaman tekrarla REPZ: zero flag “0” oldugu zaman tekrarla
REPNE: eşit olmadığı zaman tekrarla REPNZ: zero flag “0” olmadıgı zaman tekrarla
 

Komut Anlamı İşlem
cmpsb byte dizisi karşılaştır data segmentte ve extra segmentte tutulan byte dizisini,  cx registeri adedince karşılaştır
cmpsw word dizisi karşılaştır data segmentte ve extra segmentte tutulan word dizisini, cx registeri adedince karşılaştır
cmpsd double word dizisi karşılaştır data segmentte ve extra segmentte tutulan double word dizisini, cx registeri adedince karşılaştır
LODS Komutu:
 
Lods komutu string komutları içinde tektir. Komut öncesinde herhangi bir komut kullanmaya gerek yoktur. Ofset adresi DS:SI rejisterinde bulunan byte / word / double word  dizilerini al, ax, eax registerlerine, si registerinin değerini arttırarak veya azaltarak kopyalar.
 

Komut Anlamı İşlem
lodsb byte dizisi kopyala ofset adresi ds:si registerinde bulunan byte dizisini, si registerinin değerini arttırarak, al registerine taşı
lodsw word dizisi kopyala ofset adresi ds:si registerinde bulunan word dizisini, si registerinin değerini arttırarak, ax registerine taşı
lodsd double word dizisi kopyala ofset adresi ds:si registerinde bulunan double word dizisini, si registerinin değerini arttırarak, eax registerine taşı
SCAS Komutu:
 
Ofset adresi DS:SI rejisterinde bulunan byte / word / double word  dizileri içerisindeki değerle al, ax, eax registerlerindeki değerleri karşılaştırarak arama yapmak için kullanılır.
Scas komutu AF, Cf, OF, PF, SF ve ZF bayraklarını ayarlarak arama işlemini gerçekleştirir.
 

Komut Anlamı İşlem
scasb byte dizisi içerisinde ara ofset adresi ds:si registerinde bulunan byte dizisi içerisindeki değerle, al registerindeki değeri karşılaştırarak arama yap
scasw word dizisi içerisinde ara ofset adresi ds:si registerinde bulunan word dizisi içerisindeki değerle, ax registerindeki değeri karşılaştırarak arama yap
scasd double word dizisi içerisinde ara ofset adresi ds:si registerinde bulunan double word dizisi içerisindeki değerle, eax registerindeki değeri karşılaştırarak arama yap
 

STOS Komutu:
 
Stos komutu es:di ile gösterilen adreste bulunan akümülator içerisinde belirtilen değeri saklar. Bu işlemden sonra yön bayrağının durumuna göre işlemci di registerini arttırır veya azaltır. Stos komutu byte, word yada double word üzerinde işlemler yapmak için uygundur.
 

Komut Anlamı İşlem
stosb al içerisinde byte dizisi sakla es:di ile gösterilen adresteki al registerinde, istenilen byte dizisi saklanır
stosw ax içerisinde word dizisi sakla es:di ile gösterilen adresteki ax registerinde, istenilen word dizisi saklanır
stosd eax içerisinde double word dizisi sakla es:di ile gösterilen adresteki eax registerinde, istenilen double word dizisi saklanır

Şekil 1 - Programın Ekran Görüntüsü.

Örneğimizde, kelime içerisindeki küçük harfler büyük harflere dönüştürülecek. Dönüştürme işleminde kucuk harf olup olmadığını anlamak için “a = ASCII 61h” oldugu için bu değer ile karşılaştırma yapacağız. Eğer harf bu değerden buyuk ise küçük harf olduğunu anlayacağız ve harfi buyuğe çevirmek için 20h değerini çıkaracağız. Harf değerimizden küçükse büyük harf olduğuna karar vereceğiz ve çıkarma işlemi yapmayacağız. Dönüştürme işleminden sonra programı terk edeceğiz.
 
Programın ekran çıktısından da gördüğünüz gibi klavyeden ilk harf grubunun tamamı küçük harf ikinci harf grubunun bir elemanı ise büyük harf olarak girilmiştir. Sonuçta enter tuşuyla harf girişi tamamlanıp sonuç değeri elde edilmiştir. Umarım string komutlarının kullanımı konusunda faydalı olur.
 
 

 
.model small
.stack 64
.data
 
snc db 10,13,’ ’,’$’,10,13          ; sonuc için ayrılan alan
 
.code
 
mov     ax,@data
mov     ds,ax
mov     es,ax
 
dizi_al:
mov     ah,01                         ;klavyeden karakter isteniyor
int       21h                            ;girilen al’de

cmp     al,13                          ;al’deki değeri enter ile karşılaştır
jz        yaz                            ;enter’e basılmışsa yaz’a atla
 
inc       si                              ;si ile kelime içinde bir sonraki karaktere ilerle

cmp     al,61h                         ;al içindeki değerle a=61h karşılaştır
jg        degis                          ;girilen değerden buyukse degis’e atla
jl         sbt                             ;girilen değerden kucukse sbt’e atla
 
degis:
sub       al,20h                        ;al değerinden 20h çıkar

sbt:
sub       al,0h                          ;al değerinden 0h çıkar
 
mov      [snc+si],al                  ;kelime içerisinde sıradaki harfe son al değerini yukle

jmp       dizi_al                        ;dizi başlangıcına atla
 
yaz:
mov      ah,09h                       ;ekrana snc’de tutulan değer yazılıyor
lea       dx,snc
int       21h
 
dosa:                                     ;programı terket
mov     ah,4ch
int       21h
end

Aslında string komutları ile yapılan işlemler bilgisayar kullanıcılarına o kadar yakın ki, mesela msword uygulamalarında kullanılan kopyala-yapıştır gibi.
Yorumlarınızı bekliyorum.

Makale:
80x86 String Komutları Assembly ve X86 Programlama Mustafa Arkan
  • Yazılan Yorumlar
  • Yorum Yaz
ARA
31
2007
merhaba ben şahin uzunok assembly sistem programlama için daha çok kaynak istiyoruz. lütfen... örneğin işletim sistemleri mimarisi temel algoritma nasıl yazılıyor. birden fazla programı nasıl çalıştırıyor sistem lütfen... ve cpu hakkında daha fazla bilgi lütfen...
AĞU
12
2006
Program içerisinde kullanmak istediğimiz veri miktarına göre karar veriyoruz. Eren Erener Hocamın 24.05.2006 tarihli makalesini de inceleyebilirsiniz...
AĞU
11
2006
hocam öncelikle makaleleriniz cok açıklayıcı inşallah bizi bırakmazsınız.size bir sorum olacak bu stack bölgesini bazen 32 bazende 64 degeri veriyorsunuz.buna nasıl karar veriyorsunuz??
HAZ
9
2006
Hocam benim bazı sorularım olacak: 1)örnekteki kaynak dizinin ilk harfi olan a karakteri bu dizinin sıfırıncı mı yoksa 1. elemanı mı oluyor. 2)başlangıçta SI değeri 0 mı . 3)kaynak dizinin 1 elemanı SI 1 arttırıldığı için sonuç dizisinin 2. elemanı olarakmı kaydediliyor , yoksa benmi yanlış anlamışım.
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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