X86 Assembly/Temel komutlar
Bu bölümde Assembly dilindeki en basit ve temel komutları göreceğiz. Assembly dilinin bu komutlardan ibaret olmadığını ve bu komutların da burada yazdığımız özelliklerinden daha fazla özelliğe sahip olduğunu bilmenizde fayda var.
- Madde işaretli liste ögesi
mov
değiştirmov ah,5 mov al,bh
Birincisinde ah yazmacına 5 yazılır. İkincisinde ise bh yazmacındaki veri al yazmacına kopyalanır. Mov komutuyla yalnızca eşit kapasitedeki yazmaçlar arasında kopyalama yapılabilir. Yani sonu x ile bitenler arasında veya sonu h veya l ile bitenler arasında kopyalama yapılabilir.
inc
değiştirBir yazmaçtaki değeri bir artırır. Örneğin:
mov al , 5 inc al
Burada al'nin önceki değerini 5 sayarsak artık al'nin değeri 6 olur.
mul
değiştirBelirtilen yazmaçtaki değerle al yazmacındaki değeri çarpıp sonucu ax yazmacına koyar. Örnek:
mul cl
Burada al yazmacındaki değerle cl yazmacındaki değer çarpılıp sonuç ax yazmacına konur.
add
değiştirHerhangi bir yazmaçtaki değerle herhangi sabit bir değer veya yazmaçtaki değeri toplayıp sonuç ilk belirtilen yazmaca koyulur. Örnekler:
add al,1 add al,cl
Birincisinde al ile 1 toplanıp sonuç al'ye atanır. Yani sonuçta al bir artırılmış olur. İkincisinde ise al ile cl toplanıp sonuç al'ye atanır. Yani sonuçta al'ye cl eklenmiş olur. Add komutu argüman olarak yalnızca eşit kapasitedeki yazmaçları alabilir. Örneğin aşağıdaki komut hatalıdır.
add ax,cl
sub
değiştirHerhangi bir yazmaçtan sabit bir değeri ya da başka bir yazmaçtaki değeri çıkarır. Örnekler:
sub al,10 sub ax,cx
Birincisinde al yazmacındaki değer 10 eksilir. İkincisinde de ax yazmacındaki değer cx'teki değer kadar eksilir. Sub komutu da tıpkı add gibi eşit kapasiteli yazmaçlarla işlem yapar.
loop
değiştirKomutun argümanındaki ofset adresi ile loop komutunun bulunduğu satır arasında cx'in değeri kadar gidip gelinir. Yani bir döngü kurulmuş olur. Örnek:
14F7:100 mov cx,5 14F7:103 inc al 14F7:105 add dl,al 14F7:107 loop 103 14F7:109 int 20
Burada 5 kere 103. ofset ile 107. ofset arasında gidip gelinir. Bütün yazmaçların ilk değerlerini 0 sayarsak sonuçta al'nin değeri 5, dl'nin değeri de f olur. Burada şunu gözden kaçırmamanızı öneriyorum: loop komutunun kapsama alanına giren komutlar henüz loop komutunun bulunduğu satıra gelinmeden doğal olarak bir kez çalıştırılır. Bu çalıştırılma bu bahsettiğimiz gidip gelmeye dâhildir. Öbür türlü söz konusu satırlar toplam 6 kere işletilmiş olurdu.
cmp
değiştirİki yazmaçtaki değeri ya da bir yazmaçtaki değerle sabit bir değeri kıyaslar. Tek başına bir işe yaramaz. Örnek:
14F7:100 cmp al,bl 14F7:102 cmp bl,5 14F7:104 cmp 5,bl 14F7:106 cmp ax,bl
Bu komutlardan ilk ikisi çalışacak. Son ikisiyse çalışmayacak. Çünkü üçüncüsünde ilk argüman sabit bir değer. Sonuncusunda da farklı boyutlardaki yazmaçlar kıyaslanmış.
jg, jl, je, jge, jle
değiştirKendisinden hemen önce gelen cmp komutuna göre programın akışını belirli bir ofsete yönlendirirler. Örnek:
14F7:100 cmp al,bl 14F7:102 jl 10e
Burada eğer al'deki değer bl'den küçükse akış 10e ofsetine yönledirilecektir. Değilse program normal şekilde akışına devam edecektir. Tahmin edebileceğiniz gibi jl küçüktür anlamına geliyor. Mantığı bununla tamamen aynı olan farklı komutlar da vardır. Bunlar
- jg → büyüktür.
- jl → küçüktür.
- je → eşittir.
- jge → büyük eşittir.
- jle → küçük eşittir.
jmp
değiştirBelirli bir ofsete atlamaya yarar. Örnek:
14F7:144 jmp 110
Burada programın akışı 110. ofsete yönlendirilir.