Murat ERDEM - Personal Research Blog




Assembly Programing - 0x08: Stringler

August 28, 2020

Bellek üzerinde byte, word ve double word gibi farklı büyüklükteki işlemleri yapmayı mümkün kılar. Bu komutlar genel olarak tekrarlamalı işlemleri gerçekleştirmek için kullanılırlar. İşlemlerin tekrarlama sayısı cx de tutulur. Bu guruptaki komutlar df ile işlem yönünü belirler. df 0 ise si artar, 1 ise si azalır. 8086 mimarisinde bu komutları kullanabilmek için es tanımı yapmamız gerekir. Bu tanımı aşağıdaki gibi yapabiliriz.

       
    
        mov ax,@data
        mov ds,ax
        mov es,ax
    

REP

Bu komut cx 0 değilse kendinden sonra gelen diğer komutların tekrarlanmasını sağlar. her tekrarlamada cx değerini bir azaltır. Diğer kullanım şekilleri aşağıdaki gibidir.


REP cx 0 olana kadar işlemi sürdürür
REPE cx 0 değilse ve eşitlik tekrar ettiği sürece tekrarlamayı sürdürür
REPZ cx 0 değilse ve zf 1 ise tekrarlamayı sürdürür
REPNE cx 0 değilse ve eşitsizlik varsa tekrarlamayı sürdürür
REPNZ cx 0 değilse ve zf 0 ise tekrarlamayı sürdürür

MOVS

si registerinde gösterilen adresten di registerinde gösterilen adrese kopyalama yapmayı sağlayan bir komuttur. Bu komutun diğer kullanım şekilleri aşağıdaki gibidir.


MOVSB byte bazında kopyalama yapar
MOVSW word bazında aktarma yapar
MOVSD double word bazında kopyalama yapar

Bu komutların kullanımı aşağıdaki gibidir. Aşağıda isim değişkeninde bulunan veriyi kopyala değişkeninin gösterdiği adrese kopyalıyoruz.

       
    
        .model small
        .stack 32
        
        .data
        
            kopyala db 10 dup(?)
            isim db "muraterdem"
          
        
        .code
        
            mov ax,@data
            mov ds,ax
            mov es,ax
        
            mov cx,10
            
            lea si,isim
            lea di,kopyala
             
            rep movsb
             
            hlt
            
           .exit
            
        end       
    

CMPS

Bu komut si ile di registerlerinde bulunan bellek adreslerindeki değeri karşılaştırmak için kullanılır. normal cmp komutu gibi çalışır sonuçtan flaglar etkilenir. Kullanım şekilleri aşağıdaki gibidir.


CMPSB byte bazında karşılaştırma yapar
CMPSW word bazında karşılaştırma yapar
CMPSD double word bazında karşılaştırma yapar

CMPS komutunun kullanımı ile aşağıdaki örneğe bakacak olursak, srt_1 ile str_2 değişkenini farklılık olana kadar karşılaştıracaktır.

       
    
        .model small
        .stack 32
        
        .data
        
            str_1 db "muraterdem"
            str_2 db "muratERDEM"    
        
        .code
        
            mov ax,@data
            mov es,ax
            mov ds,ax
            
            mov cx,10
            lea si,str_1
            lea di,str_2
            
            
            repe cmpsb
            hlt
            
            .exit
            
        end        
    

SCAS

Bu komut genel olarak arama işlemi gibi çalışır, ax registerine atanan değer ile di registerinde adresi bulunan değeri karşılaştırır. Sonuçtan bayraklar etkilenir. Kullanım şekilleri aşağıdaki gibidir.


SCASB byte bazında karşılaştırma yapar
SCASW word bazında karşılaştırma yapar
SCASD double word bazında karşılaştırma yapar

Kullanımına aşağıdaki verilen örnekte isim değişkenin içerisinde “d” harfi aranmaktadır ascii tablosunda “d” harfinin karşılığı 16lık tabanda 64 e karşılık gelmektedir.

       
    
        .model small
        .stack 32
        
        .data
        
            isim db "muraterdem"   
        
        .code
        
            mov ax,@data
            mov es,ax
            mov ds,ax 
            
            mov ax,64h
            mov cx,10
            lea di,isim
            
            
            repne scasb
            hlt
            
            .exit
            
        end       
    

LODS

Bu komut ax registerine si de gösterilen adresteki değeri yükler. Genel olarka döngüler ile birlikte kullanılır. Farklı kullanımları aşağıdaki gibidir.


LODSB byte bazında al registerine atama yapar
LODSW word bazında ax registerine atama yapar
LODSD double word bazında eax registerine atama yapar

Aşağıdaki örnekte “m” harfini al registerine atama yapacaktır.

       
    
        .model small
        .stack 32
        
        .data
        
            isim db "muraterdem"
        
        .code
        
            mov ax,@data
            mov es,ax
            mov ds,ax
            
            mov ax,0
            lea si,isim
            
            lodsb
            hlt
            
            .exit
        
        end       
    

STOS

AX registerinde bulunan değeri di registerinde belirtilen adrese yükler. kullanım şekilleri aşağıdaki gibidir.


STOSB byte bazında al registerinden atama yapar
STOSW word bazında ax registerinden atama yapar
STOSD double word bazında eax registerinden atama yapar

Aşağıdaki örnekte “muraterdem” stringinin ilk harfini “M”ile değiştirerek “Muraterdem” stringine çevirecektir.

       
    
        .model small
        .stack 32
        
        .data
        
            isim db "muraterdem"   
        
        .code
        
            mov ax,@data
            mov es,ax
            mov ds,ax 
            
            mov ax,4dh
            lea di,isim 
            
            stosb
            
            
            hlt
            
            .exit
            
        end        
    

CBW

Bu komut msb bitini ah deki bütün bitlere yazar.

       
    
        mov al,10001001b
        cbw
        #ax= 11111111 10001001
    

CWD

AX in msb si ile dx registerini doldurur.

       
    
        cwd
    

CWDE

AX in msb bitini eax boyunca genişletir.

       
    
        cwde