8085 Assembly ile Dizi Kopyalama

Batuhan Düzgün tarafından yayınlanmıştır 1. August 2010 05:14

Herkese merhaba arkadaşlar  bu yazımda  8085 mikroişlemci  assembly'si ile bellekte ardışıl şekilde bulunan bir diziyi,yine farklı bir bellek adresinden itibaren kopyalayan 
programı  yapacağım.İlk dizimizin bellek adresi C060 adresinden başlayıp 10 eleman içermektedir.Biz bu dizimizi yine belleğimizdeki farklı bir alan olan C070 'dan itibaren kopyalacağız.Algoritma açısından baktığımızda aslında basit bir for döngüsüyle herşey sorunsuz ilerlemektedir.Assembly kodu yazarken en büyük sıkıntılardan biride dizi sınırını detaylı bir şekilde bizlerin düşünmesidir. Bir eksik veya fazla döndürmek gibi küçük hatalar doğaldır.Bunları tecrübe edine edine rahatlıkla oturtabilirsiniz.Şimdi düşündüklerimizi faaliyete geçirelim. :)
 
İlk olarak 8085 simülatörümüzü açıyoruz.Ardından yeni bir dosya açıp  aşağıda görülen kodu yazıyoruz. 
 
LXI H,C060  ; Kaynak dizinin başlangıç adresi
LXI B,C070  ;Kopyalanacak bellek adresinin başlangıç değeri

dongu:  
MOV A,M  ; ilk elemanı MOV A,M ile akümülatöre alıyoruz.
STAX B    ;STAX komutuyla B-C kaydedici çiftinin gösterdiği yere kopyalıyoruz
INX B       ;Kaydediciyi bir arttırıyoruz bir sonraki alanı göstermek için
INX H    ;Kaynak diziden bir sonraki elemanı almak için 1 arttırdık
MOV A,L ; L kaydecisindeki değeri akümülatöre aldık.
CPI 6A    ;6A dğerine eşitmi diye kontrol ettik
JNZ dongu  ;eğer sonuç sıfır değilse değerler birbirine eşit değildir.
HLT ;Ve programı sonlandırma komutu.
 
Şimdi yazdıklarımızı biraz inceleyelim.LXI komutu genelde indisli işlemlerde yani dizi işlemlerinde kullanılır.Bir bir arttırarak dizinin her elemanına erişiyoruz.Ardından diziyi kopyalacağımız hedef adresin başlangıç değerini veriyoruz.Her kopyalama işleminden sonra bu adresi bir arttırıp,bir sonraki bellek gözünü işaret ediyoruz.
Ardından "dongu" adlı bir etiketimiz var.Bu nereye dallanma yapacağımızı belirtiyor.Aslında bu etiketin değeri ,MOV A,M komutunun  bellekte bulunan adresidir.MOV A,M komutu H-L kaydedici çiftinin gösterdiği bellek adresinin içindeki değeri akümülatöre taşıyor.M belleği temsil ediyor,sadece H-L kaydedici çiftine bağlı olarak çalışan özel bir yapı.Diğer B-C ve D-E  kaydedici çiftleri M'yi kullanamaz.INX komutu B-C kaydedici çiftini bir arttırıyor.Aynı şekilde INX H-L 'yi arttırıyor.MOV A,L komutu ile sadece L kaydedicisindeki değeri alıyoruz.Bunu niçin yaptık çünkü dizimizin sınırını kontrol edeceğiz.Eğer L kaydedicisi 6A değerine ulaşmışsa demekki biz C06A adresine geldik ve döngünün sonlanması gerekli.CPI komutu direkt bir veriyi karşılaştırmak için kullanılır.Kaydediciler arası karşılaştırma için CMP komutu kullanılır.CPI komutu ivedi adresleme yöntemine girmektedir.
JNZ komutu eğer karşılaştırma sonucu sıfır (zero) bayrağı set edilmemiş,yani 1 olmamışsa, yani sıfırsa "dongu" etiketine dallanma yapar."dongu" etikerti ise MOV A,M komutunun adresine eşittir.Programımız kısaca bu şekilde şimdi aşağıda görülen assemble tuşuna basıp derleme yapınız.
 
Not: Assembly simülatöründe açıklama satırı yazmak için cümle başına noktalı virgül koymanız gerekmektedir. 
 
 

   

Ardından derleme işlemi sonucu aşağıdaki ekran görüntüsünü elde etmeniz gerekiyor.

 

 
Komutların yanındaki her tik işareti komutunuz doğru yazıldığını belirtiyor.Eğer herhangi bir komutun yanında "X" işareti görürseniz ilgili satırla bir sorununuz var demektir.
Bu işlemden sonra artık verilerimizi gireceğiz.Verilerimizi C060'dan itibaren sırayla elle giriyoruz.Aşağıda benim girdiğim değerleri görebilirsiniz.
 
 
 
Bu işlemden sonra "step by step"  tuşuyla her adımı tek tek işletip Akümülatör,B-C,D-E gibi kaydedicilerin ve durum bayraklarının nasıl değiştiğini kontrol edebilirsiniz.
Ve son olarak adım adım çalıştırdıktan sonra aşağıdaki ekran görüntüsünü almanız gerekiyor.
 
 
 
Görüldüğü üzere C060'dan başlayan dizimizi C070'dan itibaren kopyalamayı başardık.Umarım zevkle okuyacağınız bir makale olmuştur.Her türlü sorunuz için bana ulaşabilirsiniz.Bir sonraki makalemde görüşmek dileğiyle ...
 
Batuhan Düzgün
 
Sakarya Üniversitesi
 
Bilgisayar Mühendisliği 

Currently rated 2.3 by 3 people

  • Currently 2.333333/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

8085 Assembly Dili

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  September 2018  >>
MoTuWeThFrSaSu
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

Yazıları geniş takvimde göster