Assembly programlama yaparken bazı durumlara özel farklı fonksiyonlar çalıştırmak isteriz. Bu yazımızda iki veriyi karşılaştırma ve çıkan sonuca göre farklı fonksiyonlara zıplama nasıl yapılır? Bunlara değineceğiz.
Assemblyde kod bloklarını parçalara bölebiliriz. Daha sonra ise farklı zamanlarda tanımlı blok üzerinden kodu tekrar yürütebiliriz. Bunu yapmak çok basittir. Aşağıdaki örneğe bakacak olursak, tag_1 etiketinin tanımlı olduğu yerden çalışmaya başlayan program tag_2 ve tag_3 üzerinden devam eder ancak biz bu tagların içerisinde iken zıplama komutları ile istediğimiz tag üzerinden programın akışını devam ettirebiliriz.
.model small
.stack 32
.data
.code
.startup
tag_1:
mov ax,5
mov bx,3
tag_2:
mov ax,2
mov cx,1
tag_3:
mov ax,122
mov ax,3
.exit
end
CMP komutu karşılaştırma komutudur. Bu karşılaştırma işleminden sonra flaglar set edilerek zıplama komutları ile ilgili etikete zıplanır.
mov ax,5
mov bx,3
cmp ax,bx
Bu komut çalıştığında CF, ZF, SF 0 olarak set edilir. Bu flagların set edilme mantığı aşağıda verilmiştir.
CF | ZF | SF | |
ax > bx | 0 | 0 | 0 |
ax == bx | 0 | 1 | 0 |
ax < bx | 1 | 0 | 1 |
Zıplamalar genelde CMP komutundan sonra belirli bir etikete atlamak için kullanılır. Normal bir programlamadaki if yapıları gibidir. CMP ile karşılaştırma yapıldıktan sonra if yapısının altındaki kod parçası mı else yapısının altındaki kod parçası mı çalışacağına karar vermek için zıplama komutlarını kullanır. Aşağıdaki tabloda birinci verilen operandın ikinci operanda durumu göze alınarak açıklama yapılmıştır.
İnstruction | Description | Condition |
JMP | hiç bir şarta aramadan ilgili etikete zıplama yapar. | zf==1 |
JNZ, JNE | eğer sonuç sıfır değilse zıplama yapar | zf ==0 |
JG | büyükse zıplama yapar | zf ==0 ve sf ==of |
JL | küçükse zıplama yapar | sf != of |
JGE | büyük eşitse zıplama yapar | df ==of |
JLE | küçük eşitse zıplama yapar | zf==1 yada zf != of |
... | ... | ... |
Bu komutların kullanımına küçük bir örnek verelim.
.model small
.stack 32
.data
.code
.startup
basla:
mov ax,1234h
cmp ax,1234h
jz cikar
topla:
add ax, 12h
cmp ax, 4444h
jnz bitir
cikar:
sub ax,34h
cmp ax,12h
jg topla
bitir:
.exit
end
Buradaki örneğe bakacak olursak ilk olarak başla etiketi altındaki komutlar sıra ile çalışacaktır daha sonra topla çalışması gerekirken biz kontroller ile zıplama komutları kullanarak çıkar etiketini daha sonra topla etiketini programın çalıştırmasını sağladık. en son olarak ise bitir etiketi ile programı bitiriyoruz.
Yukarıdaki zıplama komutları flag değerlerine bakarak programın akışının ne yönde olacağına karar verdiklerini söylemiştik. Bazı komutlar bu flag değerlerini yeniden herhangi bir şarta bağlı olmadan set eder. Bu komutlar ve yaptığı işlemler aşağıdaki tabloda verilmiştir.
Komuttlar | Açıklama |
clc | cf 0 olarak set edilir |
cmc | cf 0 ise 1, 1 ise 0 olarak set edilir |
stc | cf 1 olarak set edilir |
cld | df 0 olarak set edilir |
std | df 1 olarak set edilir |
sti | if 1 olarak set edilir |
cli | if 0 olarak set edilir |
lahf | ah registerine flag registerinin sağdan ilk 8 bitini atar |
sahf | flag registerinin sağdan ilk 8 bitini ah da bulunan değerleri atar |