Murat ERDEM - Personal Research Blog




Assembly Programing - 0x05: Karşılaştırma ve Karar Verme

August 27, 2020

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.

Etiket Oluşturma

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 (Karşılaştırma)

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ıplama Komutları

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.

Flag Değerlerini Değiştirmek

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