- 8 Eyl 2016
- 1,647
- 1
- 1,003
Merhabalar, bu konumuzda Assembly programlama dilinde string işlemlerini inceleyeceğiz. Hemen bir şeyler yazalım ve üzerine konuşalım.
Burada db yani 1 byte=8bitlik değer tutan p ve e karakterlerini tuttum. Source code kısmı bize bunu söylüyor. Üst tarafa bakalım 1000 ve 1001 offset değerlerimizde p ve e karakterlerini görüyoruz. 70 hex değeri olarak, 112 signed olarak p karakterini işaret ediyor. 1.offseti de bu şekilde siz yorumlayın.
Bunları variables yani değişken tablomuzdan da inceleyebiliriz.
P ve e yani 2 element, hex karşılıkları sırayla gördüğünüz gibi.
ASCII olarak da görebiliyoruz. Buradan aktarabileceğim string tanımlaması yaparken byte, Word, double Word tiplerinde tanımlayabiliriz.
String işlemlerinde hedef veya kaynak kaydedicisi olarak AX registerı kullanılırken bellek adresini SI ve DI kaydedicileri tutar. Bir yazının bir yerden kopyalanması olayını düşünürsek kaynak olarak DS, hedef olarak ES kullanılır. Aşağıdaki örneği inceleyelim.
İlk satırda data segmenti adresini alıyorum. Sonraki iki satırda bu adresleri ds ve es segmentlerine aktarıyorum.
Şimdi satır satır incelediğimiz data segmentinin adresinin ax registerına aktarıldığını görüyoruz bunun da 712 adresine sahip olduğunu görmekteyiz.
Single step dediğim zaman 712 değeri ax içerisine kopyalandı gördüğünüz gibi. Sağ tarafta mov komutu işlendi, sol tarafta 712 değeri ax içerisine düştü. Şimdi ise 2.satırı işleyeceğiz ve DS segmentimize bakacağız.
DS segmentime AX içerisindeki 712 değeri kopyalandı şimdi 1 adım daha ilerleyelim.
Son adımda ES segmentime de ilgili değer aktarıldı yani burada AXin bellek adresi DS ve ES segmentlerine kopyalandı. Bu şekilde temel olarak bir işleyişe göz atmış olduk. Stringlerimizden devam edelim.
Şimdi bu kodlarımızı inceleyelim. Lea komutu ile isim değişkeni içindeki offset değeri si segmentine, isim2 içindeki offset ise di segmentine atanıyor. İsim2 değeri 4.offsetten başlayacaktır. Yani isim2nin offset değeri olan 4 di segmentine atanacaktır.
Burada en üst kısma gelirsek define byte tipinde yani 1 byte değerinde pent karakterleri isim değişkeninde tutuluyor. Burada isim2 değişkeni için ise 5 byte yer ayrılıyor.
Şimdi bu kodlarımızı işletelim.
Tek tek pent karakterleri isim2 değişkeni içerisine aktarıldı.
Şimdi bu kod satırlarımızda ise lodsb ile isim değişkeni içindeki ilk offset olan p harfi ax registerı içine aktarılacak. Stosb bu p harfini alacak ve isim2nin içine yerleştirecek.
Yani program işlevini bitirdiği zaman isim2 içine p harfi atanacaktır.
Buradaki örneğimizde ise cmpsb komutunu inceleyeceğiz.
Bu program işlendiği zaman bizim bayraklarımızdan zero flag 1 değerini alacaktır.
Şimdi bu nedir? Bizim burada iki adet aynı değerleri taşıyan değişkenlerimiz var. İlgili offsetler alınıyor lea komutu ile ve en sonda ise cmpsb devreye giriyor. Yani bu komutumuz 2 değerin eşit olup olmadığını kontrol ediyor karşılaştırma yapıyor ve olumlu ise zero flag 1 yanıyor. Bizim iki değerimizin de offseti e harfini taşıyor haliyle eşit olduklarından karşılaştırma sonucunda değerlerin aynı olduğunu görüyoruz.
Burada ise p karakteri ax içine aktarılıyor cx registerı ise isim değerimizin veri sayısını tutuyor. scasb ise p harfini isim değişkenimiz içinde arıyor ve bulursa zero flag 1 değerini alıyor. Aksi halde zero flag 0 değerinde kalacaktır.
Bu konumuzda string işlemleri üzerine biraz örnek yaptık. Okuduğunu için teşekkür ederim. Diğer konularımıza Assembly bölümünden bakabilirsiniz.
Burada db yani 1 byte=8bitlik değer tutan p ve e karakterlerini tuttum. Source code kısmı bize bunu söylüyor. Üst tarafa bakalım 1000 ve 1001 offset değerlerimizde p ve e karakterlerini görüyoruz. 70 hex değeri olarak, 112 signed olarak p karakterini işaret ediyor. 1.offseti de bu şekilde siz yorumlayın.
Bunları variables yani değişken tablomuzdan da inceleyebiliriz.
P ve e yani 2 element, hex karşılıkları sırayla gördüğünüz gibi.
ASCII olarak da görebiliyoruz. Buradan aktarabileceğim string tanımlaması yaparken byte, Word, double Word tiplerinde tanımlayabiliriz.
String işlemlerinde hedef veya kaynak kaydedicisi olarak AX registerı kullanılırken bellek adresini SI ve DI kaydedicileri tutar. Bir yazının bir yerden kopyalanması olayını düşünürsek kaynak olarak DS, hedef olarak ES kullanılır. Aşağıdaki örneği inceleyelim.
İlk satırda data segmenti adresini alıyorum. Sonraki iki satırda bu adresleri ds ve es segmentlerine aktarıyorum.
Şimdi satır satır incelediğimiz data segmentinin adresinin ax registerına aktarıldığını görüyoruz bunun da 712 adresine sahip olduğunu görmekteyiz.
Single step dediğim zaman 712 değeri ax içerisine kopyalandı gördüğünüz gibi. Sağ tarafta mov komutu işlendi, sol tarafta 712 değeri ax içerisine düştü. Şimdi ise 2.satırı işleyeceğiz ve DS segmentimize bakacağız.
DS segmentime AX içerisindeki 712 değeri kopyalandı şimdi 1 adım daha ilerleyelim.
Son adımda ES segmentime de ilgili değer aktarıldı yani burada AXin bellek adresi DS ve ES segmentlerine kopyalandı. Bu şekilde temel olarak bir işleyişe göz atmış olduk. Stringlerimizden devam edelim.
Şimdi bu kodlarımızı inceleyelim. Lea komutu ile isim değişkeni içindeki offset değeri si segmentine, isim2 içindeki offset ise di segmentine atanıyor. İsim2 değeri 4.offsetten başlayacaktır. Yani isim2nin offset değeri olan 4 di segmentine atanacaktır.
Burada en üst kısma gelirsek define byte tipinde yani 1 byte değerinde pent karakterleri isim değişkeninde tutuluyor. Burada isim2 değişkeni için ise 5 byte yer ayrılıyor.
Şimdi bu kodlarımızı işletelim.
Tek tek pent karakterleri isim2 değişkeni içerisine aktarıldı.
Şimdi bu kod satırlarımızda ise lodsb ile isim değişkeni içindeki ilk offset olan p harfi ax registerı içine aktarılacak. Stosb bu p harfini alacak ve isim2nin içine yerleştirecek.
Yani program işlevini bitirdiği zaman isim2 içine p harfi atanacaktır.
Buradaki örneğimizde ise cmpsb komutunu inceleyeceğiz.
Bu program işlendiği zaman bizim bayraklarımızdan zero flag 1 değerini alacaktır.
Şimdi bu nedir? Bizim burada iki adet aynı değerleri taşıyan değişkenlerimiz var. İlgili offsetler alınıyor lea komutu ile ve en sonda ise cmpsb devreye giriyor. Yani bu komutumuz 2 değerin eşit olup olmadığını kontrol ediyor karşılaştırma yapıyor ve olumlu ise zero flag 1 yanıyor. Bizim iki değerimizin de offseti e harfini taşıyor haliyle eşit olduklarından karşılaştırma sonucunda değerlerin aynı olduğunu görüyoruz.
Burada ise p karakteri ax içine aktarılıyor cx registerı ise isim değerimizin veri sayısını tutuyor. scasb ise p harfini isim değişkenimiz içinde arıyor ve bulursa zero flag 1 değerini alıyor. Aksi halde zero flag 0 değerinde kalacaktır.
Bu konumuzda string işlemleri üzerine biraz örnek yaptık. Okuduğunu için teşekkür ederim. Diğer konularımıza Assembly bölümünden bakabilirsiniz.