Press "Enter" to skip to content

Assembly Örnekler

Bedirhan Sağlam 6

Assembly Örnekler

Assembly öğrenmeye yeni başlayanlar için sorular ve cevaplarla assembly örnekler.

Soru:

0200:0400h bellek adresindeki 40h sayisi ile 0200:0500h adresindeki 50h sayisini toplayan, toplamdan 10 sayisini cikaran ve sonucu 0200:0600h bellek adresine yazdiran Intel x86 programini olusturunuz.

org 100h

mov cx,200h
mov ds,cx
mov [400h],40h    ;0200:0400h adresine 40h degeri aktarildi
mov [500h],50h    ;0200:0500h adresine 50h degeri aktarildi 
mov ax,[400h]     ; 40h degeri ax'e aktarildi  
mov bx,[500h]     ; 50h degeri bx'e aktarildi
add ax,bx         ;40h+50h sayisi toplandi toplam ax e aktarildi
sub ax,10         ;toplamdan 10 sayisi cikarildi  ,sonuc ax'e aktarildi
mov [600h],ax     ;sonuc 0200:0600h adresine aktarildi

ret

Soru: İsaretsiz 0CFBh sayisini 0FBh sayisina bolen Intel x86 programini olusturunuz. Daha sonra kalani 0500:0100h adresine ve bolumu ise 14h sayisi ile carpip 0500:102h adresine yaziniz.

org 100h

mov ax,0CFBh ;ax e 0CFBh sayisini aktar
mov cx,0FBh  ;cx e 0FBh sayisini aktar      
div cx       ;ax/cx islemi yap ax'e bolumu aktar dx'e kalani aktar
mov bx,0500h ;ds ye 0500h aktarmak icin bx e once 0500h aktarilir
mov ds,bx    ;ds 0500h olsun.

mov [0100h],dx ;0500:0100h adresine kalani aktar   
mov dl,14h
mul dl        ;ax*14h islemini yap sonucu ax e aktar
mov [0102h],ax ;0500:0102h adresine bolum*14h i aktar

ret

Soru:1-9 arasi tek sayilarin karesini toplayan program

org 100h    


mov cx,10 ;cx e 10 aktar
mov bx,0  ;bx e 0 aktar

sonuc:   
dec cx;cx 1 azalt 
mov ax,cx ;ax e cx i aktar  
mul cx ;ax*cx carp , ax de karesi tutuluyor
add bx,ax;ax+bx ve  bx e aktar
loop sonuc

end

Soru: 1’den 99’e kadar olan sayilarin toplamini yapan ve sonucu 1000’e bolup kalani 0100:0010h bellek adresine yazan Intel x86 programini olusturunuz.

org 100h

mov bx,100h
mov ds,bx      ;ds'ye 100h aktar 
              
mov ax,0       ;ax 'e 0 aktar
mov cx,99      ;cx 'e 99 aktar 


topla:

add ax,cx      ;1-99 arasindaki sayilar toplanir 
               
loop topla     ;toplam ax 'e aktarilir 
           
mov bx,1000    ;sonucu 1000e bolmek icin bx'e 1000 aktarilir
div bx         ;ax/bx islemi yap ax'e bolumu dx'e kalani aktar
mov [0010h],dx ;0100:0010h bellek adresine dx deki kalan degerini aktar           

ret

Soru: 2’den 6’ya kadar olan sayilarin faktoriyellerin toplaminin 3’e bolumunden kalan sayiyi bulan bir program yaziniz.

org 100h


mov bx,0
mov sp,7

d:              ;d etiketinde sp degeri bir azaltilarak
dec sp          ;cx degerinin bir bir azaltilmasi saglanmistir
mov cx,sp       ;cx'e sp'yi aktar
mov ax,1        ;yeni faktoriyel hesaplamak icin ax'e 1 degeri ver
cmp sp,1        ;sp degeri 1 e ulasmis ise 2-6 arasindaki butun faktoriyeller bulunmustur
jz  bol         ;bol etiketine gecilebilir


faktoriyel:      ;cx deki degerin faktoriyeli cx*ax ile ax e aktarilir
mul cx
loop faktoriyel

add bx,ax        ;ax de bulunan faktoriyel degeri bx de toplanir.

cmp cx,0         ;cx sifira ulasmissa yeni deger atamasi icin 
jz d:            ;d etiketine gonderilir.
     
bol:               
mov ax,bx          ;program bol etiketine gelmis ise 2 ile 6 arasindaki 
mov bx,3           ;sayilarin faktoriyellerini ve faktoriyellerinin 
div bx             ;toplamini bulmus demektir. bx de tutulan toplam
                   ;ax'e aktarilir, bx'e 3 degeri verilir
                   ;ax/bx islemi yapilir ax'e bolum dx'e kalan aktarilir
                   ;kalan sayi dx dedir.
end

Soru: 1000 ve 2000 adresli bellek gozlerindeki iki sayiyi toplayan ve sonuç FFH’tan buyukse 3000 adresine 99h, kucukkse 22h yazan programi olusturunuz. Ayni soruyu verilen adreslerin onaltilik tabana cevrilmis haliyle tekrar yaziniz.

Org 100h 
mov ax, 0h 
mov [3E8h], 22h 
mov [7D0h], 88h 
mov al, [3E8h] 
add al, [7D0h] 
jc buyuk 
mov [0BB8h], 22h 
jmp stop 
buyuk: mov [0BB8h], 99h 
stop: ret

Soru: 0700:150Ah bellek adresine 12h, 0700:150Bh bellek adresine 2Ch, 0700:150Ch bellek adresine A2h degerini vererek bu adreslerdeki verileri toplayan, sonucu 0700:1300h adresine ve elde olusmussa eldeyi de 0700:1298h adresine atan programi yaziniz.

org 100h
mov [150Ah],12h
mov [150Bh],2Ch
mov [150Ch],A2h;adreslere degerler aktarildi

mov al,[150Ah]
add al,[150Bh] ;150Ah ve 150Bh degerlerini topla eger elde yoksa eldeyok etiketine git
jnc eldeyok
mov [1298h],1 ;fakat elde varsa 1298h adresine 1 aktar
eldeyok:
add al,[150Ch] ;150Ah+150Bh+150Ch degerlerini topla
jnc eldeyok1   ; elde yoksa eldeyok1 etiketine git
add [1298h],1  ;elde varsa 1298h adresini 1 artir
eldeyok1:
add ah,[1298h] ;eger eldeler varsa ah'ye eldeleri topla
mov [1300h],ax ;sonucu 1300h a aktar..

end

Soru: 50’den kucuk 2’ye ve 3’e tam bolunemeyen dogal sayilarin toplamini bulan ve bu toplami DX yazmacina atan programi yaziniz.

org 100h

mov cl,50  
ikiyebol:  ;ikiyebol etiketinde sayi ikiye bolunur 
mov bl,2   ;eger sayi ikiye tam bolunurse ,sayinin uce bolunup bolunmedigine bakmaya gerek kalmaz.
mov al,cl  ; bl yazmacina 2 degeri, al yazmacina cl degeri aktarilarak div komutu ile bolme yapilir
mov ah,0   ; bolme isleminden sonra kalan ah yazmacina bolum al yazmacina aktarilir.
div bl     ; ah yazmaci ile 0 compare edilir ve sayi 2 ye tam bolunmus ise ucebol etiketine gecilmez
cmp ah,0   ; eger ah yazmaci 0'a esit degilse ucebol etiketine gider.(sayi ikiye tam bolunmemis demektir)
jnz ucebol
loop ikiyebol

ucebol:    ; ucebol etiketinde sayi uce tam bolunuyormu diye kontrol edilir.
mov bl,3   ;
mov al,cl  ; uce tam bolunme kontrolu bl yazmacina 3 degeri,
mov ah,0   ; al yazmacina cl degeri ve ah yazmacina 0 degeri atildiktan sonra div bl komutu ile
div bl     ; yapilir. cmp ah,0 komutu ile kalan kisim 0 a esitmi diye kontrol edilir.Kalan 0 ise cl degeri
cmp ah,0   ; bir azaltilir (yeni sayi icin) ve ikiyebol etiketine gidilir.
jnz topla  ; Fakat kalan 0 dan farkli bir sayi ise cl yazmacindaki sayi hem 2 ye hem 3 tam bolunmuyor 
dec cl      ; demektir. cl yazmacindaki sayinin toplanmasi icin topla etiketine gidilir.
jmp ikiyebol

topla:         ; topla etiketinde 2'ye ve 3'e tam bolunmeyen sayilar
mov [1300h],cl ; once bir adrese aktarilir daha sonra bolunemeyen sayilari gormek icin
push [1300h]   ; push komutu ile stack'e aktarilir. Adreste tutulan sayi dx yazmacinda toplanir
add dx,[1300h] ; cl degeri bir azaltilir ve sifir ile karsilastirilir.
dec cl         ; cl yazmaci sifira ulasmamissa ikiyebol etiketine gidilir ve yeni sayi kontrolu yapilir.
cmp cl,0       ; fakat cl yazmaci sifira ulastiysa butun sayilar kontrol edilmistir
jnz ikiyebol   ; ve program sonlanabilir.

end

Soru: 0700:2001h adresli bellek gözündeki sayıyı 0700:2003h adresli bellek gözündeki sayıya bölen.Bölme sonucunu 0700:2007h adresli bellek gözüne, bölme işlemi sonucunda oluşan sayıyı 0700:2005h adresli bellek gözüne, bölen sayı sıfırsa bölme işleminde hata oluşacağından bu hata durumunu belirtmek için 0700:2009h adresli bellek gözüne 11 sayısını yazan programı yazınız.

org 100h

mov [2001h],24h  ;bolunen
mov [2003h],5h   ;bolen  


cmp [2003h],0    ;bolen sifir mi diye kontrol et
jz hata          ;0 sa hata etiketine git
jmp islem        ;0'dan farkli bir sayi ise islem etiketine git
hata:
mov [2009h],11   ; bolen 0 sa 2009h adresine 11 aktar
cmp [2009h],11   ; 2009h adresi 11 se bitir etiketine git
jz bitir

islem:           ; islem etiketinde bolme islemini yap
mov al,[2001h]
mov bl,[2003h]
div bl
mov [2007h],al   ;olusan bolumu 2007h adresine aktar
mov [2005h],ah   ;olusan kalani 2005h adresine aktar

bitir:  ;programi bitir
ret

Soru:

Yığın yapısını kullanarak, bellekteki bir konumdan art arda 10 sayı okuyan ve bu sayıların sırayla birbiriyle çarpımlarının sonucunu(toplamda 9 değer elde edeceksiniz) yığına koyan bir program yazınız.

org 100h   

tb dw 6,1,15,23,54,32,12,34,5,7
  
mov si,0
mov cx,10
mov bx,1000h

sayilari_at:
mov ax,tb[si]
mov [bx],ax
add si,2
add bx,2    
loop sayilari_at  

mov si,1000h
mov cx,9
for:
mov bx,[si]
mov ax,[si+2]
mul bx
add si,2
push ax
loop for

end

Soru:

Bir dizide 1’den 100’e kadar 5 tane sayı olsun. Sayılar arasından en yükseğini bulup, DL yazmacına atan programı yazınız.

org 100h 
lea si, sayilar ; sayilar etiketi ile tanimli ilk sayinin ofset adresini si yazmacina attim 
mov cx, 4 ; 4 kez loop'a sokacagim (5 sayi var)
mov al, [si] ; si adresine denk gelen sayiyi al yazmacina atiyorum(al min deger tutar) 
dongu: 
inc si ;bir sonraki adrese gidiyorum 
mov bl, [si] ; o adresteki sayiyi bl'ye atiyorum 
cmp al, bl ; al ile bl'yi kiyasliyorum 
jnb devam ; eger al buyukse al degerini degistirmez 
mov al, bl ; eger al kucukse buyuk degeri al'ye atar 
devam: 
loop dongu 
mov dl,al
hlt 
sayilar db 9,7, 72, 6, 45


Soru:

Girilen sayı 2’nin tam kuvveti ise ah yazmacına 2, 4’in tam kuvveti ise ah yazmacına 4 yazan programı yazınız.

org 100h
 
mov si,8       ;si'ye kontrol edilecek sayi atilir
mov ax,si      ;si deki sayi ax yazmacina atilir
mov bx,2 
mov cx,1000    
IK:             ;IK etiketinde
div bx          ; sayiyi 2 ye bolerek ikinin kacinci kuvveti olduguna bakilir. 
cmp al,1        ; sayi 2 nin tam kuvveti degil ise dl , yazmacindaki sayibolme isleminden sonra 0 a esit olmaz
jz a            ; ve sayiyi kontrol etmeye gerek yoktur.
cmp dl,0
jnz DK
loop IK  
a:
cmp dl,0
jnz DK 
mov [1000h],2

DK:             ;DK etiketinde
mov ax,si       ;sayiyi 4 e bolerek dordun kacinci kuvveti olduguna bakilir
mov bx,4        ;sayi 4 un tam kuvveti degil ise dl yazmacindaki sayi bolme isleminden sonra
ab:             ;0 a esit olmaz ve sayiyi kontrol etmeye gerek yoktur.
div bx
cmp al,1
jz as
cmp dl,0
jnz bitir
loop ab  
as:
cmp dl,0
jnz bitir
mov [1001h],4 
bitir:
mov ah,[1000h]
mov al,[1001h]
end

Soru:

Belleğe ‘’Bilgisayar Muhendisligi’’ karakter dizisini harf sırasına göre atınız. Sonra sırayla her bir karakteri önce ax yazmacına ve daha sonra ax yazmacından bellekte başka bir konuma sırayla atan programı yazınız.

org 100h
         
mov bx,1000h  ;bellekte baska bir konuma atmak icin bxe 1000h degeri verildi
lea si,dizi   ;si ye dizinin offset adresi atildi
mov cx,12     ;cumle 23 karakter oldugu icin dongu 12 kere dondu

don:
lodsw         ;si'deki adresin icindeki deger ax'e aktarildi
mov [bx],ax   
add bx,2      ;dw oldugu icin 2 arttirildi
loop don
ret
   
   

dizi dw 'Bilgisayar Muhendisligi'
  1. Duygu Duygu

    Örnekler için teşekkürler.Emeğinize sağlık .

  2. Beyza Önal Beyza Önal

    Merhaba. Şu kodda yardımcı olabilir misiniz?
    Herhangi 10 elemanlı ve elemanları rastgele belirlenmiş olan bir diziyi küçükten büyüğe sıralayacak assembly kodunu ARM komut kümesini kullanarak yazınız.

  3. Mehmet Mehmet

    Merhabalar bu sorumda yardımcı olur musunuz?

    Aşağıda yer alan Dizi1 ile Dizi2 isimli dizilerin elemanlarını sırasıyla bir eleman Dizi1 den sonra bir eleman Dizi2’den olacak şekilde hafızanın 0400H adresinden itibaren hafızaya yazan assembly programını yazınız(Procedure veya makro kullanabilirsiniz)
    Dizi1 DB 01H,03H,05H,07H
    Dizi2 DB 02H,04H,06H,08H

    Program çalıştıktan sonra hafızanın 0400H-0407H arası 01H-08H arasındaki sayılarla dolmuş olmalıdır.

  4. ozan ozan

    merhaba bu koda yardım edebilirminiz acil
    harici kesmeyi kullanarak, yürüyen bir banttan geçen malzemeleri 50′ ye kadar sayan ve sonucu 7 segment displayde gösteren
    ve Assembly programını oluşturunuz.

  5. alkan alkan

    Program tamamlandığında end komutu sonrası akümülatörün içindeki değer sıfırlanır mı
    yoksa en son aküdeki değer içinde mi kalır.

  6. fergan şengül fergan şengül

    merhaba sayın Bedirhan sağlam. ben karadeniz teknik üniversitesinde öğrenim-eziyet arası birşeyler görmekde olan insanlardan birtanesiyim. bu maili nezaman görürsün bilemiyorum. siteni ve assembly kodlama örneklerini yeni gördüm. şuan saat 14.51. 16.00da mikroişlemci sınavım var. sayın hocam msp430 üzerinden ders işledi ve 2 soruluk sınav yapacak. bir sorusu kod yazma diğer sorusu kod yuorumlama olacak. eğer vaktinde görürsen yardıma koşabilir misin.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir