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'
Örnekler için teşekkürler.Emeğinize sağlık .
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.
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.
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.
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.
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.