Murat ERDEM - Personal Research Blog




Assembly Programing - 0x02: Emu8086

August 25, 2020

Bu yazımızda assembly ile kodlama yaparken kullanacağımız emu8086 yazılımını tanıyacağız.

Assemblyde kod yazmanın ve çalıştırmanın farklı yöntemleri var ben en kullanışlı olduğunu düşündüğüm ve hafızada dönen olayları görebildiğim için emu8086 üzerinde kodlama yapıyorum bu serimizde bunun üzerinden gideceğiz.

8086’yı ilk çalıştırdığımızda yukarıdaki gibi bir pencere bizi karşılamaktadır. Burada bir proje oluşturmak için new butonuna tıkladığımızda aşağıdaki pencere açılmaktadır.

Burada boş bir proje oluşturalım. Karşımıza tamamen boş bir sayfa çıkacaktır bu sayfada assembly kodlarımızı yazacağız. Bu sayfanın genel yapısı aşağıdaki gibi olmalıdır.

.model

Bu tanımlama bellek tipini belirtir, tiny, small, medium, large, huge değerlerini alır.

.stack

stack büyüklüğünü belirtir, 16, 32 ve 64 gibi değerler belirtir.

.data

Data segment tanımlaması yapar buradan bir sonraki segment tanımlamasına kadar olan adres data segment olarak tanımlanır. İçerisine sabit veriler tanımlanır.

.code

Code segment tanımlamasıdır, içerisinde programın çalıştırılabilir kodları bulunur.

.startup

Bu komut ds in adresini tanımlar. Bu komut aslında aşağıdaki ile aynıdır. Aşağıdaki komutta bilmemiz gereken kısım “@data” tanımlaması data segmentin adresini tutan değişkendir.

       
    
        mov ax,@data
        mov ds,ax
    
.exit

Bu tanımlama programdan çıkmak için kullanılır.

end

Bizim programımız bir emülatör üzerinde çalıştığı için “end” tanımlaması emülatörden çıkmak için kullanılır.

Emu8086 Araçları

8086’yı kullanma sebebimiz aslında bize sağladığı bazı araçlardır. Aşağıdaki resme bakacak olursak bazı araçların bizim için önemli olduğunu görebiliriz.

Burada bizim için “calculator” önemlidir, biz daha çok hex ve binary sayılar ile uğraşacağımız için anlamak açısından bunları bir birine yada decimal değere dönüştürmek isteyebiliriz. Bu noktada bu araç bize yardımcı olacaktır. Bizim için buradaki aslı önemli olan ise “emulate”dir. Bu bizim programın yürütülmesi, debug edilmesi, ve hafızdaki işlemleri takip etmemizi sağlar.

calculator

ilk açtığımızda aşağıdaki ekran gösterilmektedir. burada üst taraftan gireceğimiz değerin neye dönüştürülmesini istersek onu seçiyoruz. Aşağıda ise giriş değerini veriyoruz.eğer giriş değerimiz ikili sayı sisteminde ise sonuna “b”, sekizlik ise sonuna “o”, on altılık ise sonuna “h” harfini yazarız. onluk sistemde ise herhangi bir harfe gerek yoktur.

Emulator

“emulate” butonuna bastığımızda iki adet pencere açılır birisi yazdığımız kaynak kodda hangi satırın işleneceğini takip etmemizi sağlayan penceredir. Bu pencerede işlenecek bir sonraki adım sarı ile işaretlenir.

Bir diğer penceremiz ise emülatör penceresidir aşağıdaki gibi görünür.

Bu pencerede sol tarafta registerler içerisindeki değerleri görebiliriz. program işlendiğinde buradaki değerler anlık olarak değişmektedir. orta tarafta ise assembly komutlarını ve her komutun hex karşılığını görebiliriz. bu pencerelerin yukarısında ise 0712 adresini görmekteyiz. Burada dikaktimizi çeken nokta bunun registerlerdeki CS ile aynı adresi gösterdiğidir burada emulatör cs’in başlangıç noktasında kodlarımızı işlemek için hazır durumdadır.

Alt kısımda ise bizim program esnasında penceredeki değişiklikleri takip etmek için bir pencere açan “screen”, kanyak kodumuzun penceresini açan “source” , emülatörü baştan başlatan “reset”, programlarda kullanılan değişkenleri görebileceğimiz “vars”, debug loglarını görebileceğimiz “debug”, stackda bulun verileri izleyebileceğimiz “stack” ve flag değerlerini görüp set edebileceğimiz “flags” butonlarını görmekteyiz.

Bu butonlar haricinde “aux” butonu bizim için önemli yer tutmaktadır. Bu buton içerisinde iki adet önemli aracımız vardır. Bİrisi stop on condition diğeri memory. Stopn on codition bir registerin değeri istediğimiz bir şartı sağladığında programı stop etmemiziz sağlar. memory ise memory üzerindeki değerleri dump etmemizi anlık olarak değişiklikleri izlememiz sağlar.