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

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

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

Herhangi 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

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

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

İ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ştir

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

Belirli bir ofsete atlamaya yarar. Örnek:

14F7:144 jmp   110

Burada programın akışı 110. ofsete yönlendirilir.