2013-10-12 17 views
5

Şu anda bir sınıf için ARM montajını öğreniyorum ve bir "dizi" kullanmam gereken bir problemle karşılaştım. ARM'de bir dizi gibi bir şey olmadığının farkındayım, bu yüzden alanı tahsis etmek ve bir dizi olarak ele almak zorundayım. İki sorum var.ARM düzeneğinde bir dizi nasıl düzgün oluşturulur?

  1. Diziye doğru yeni değerler ekliyor muyum yoksa sadece önceki değerin üzerine yazıyor muyum? Değerlerin üzerine yazıyorsam yeni değerler eklemeye nasıl başlarım?
  2. Dizinin farklı değerleri arasında nasıl dolaşırım? loop:'u kullanmam gerektiğini biliyorum, ancak farklı "dizinler" e erişmek için onu nasıl kullanacağımı bilmiyorum.

Şimdiye kadar, çevrimiçi kaynaklardan derlediğim gibi, ARM dökümantasyonunu okuduğum şey budur. Benim profesör gerektirdiği, bu nedenle GNU araçları tarafından tanınan bazı komutlar ARMSim # tarafından tanınan veya olmayacak gibi ben ARMSim# kullanıyorum bir yan not olarak

 .equ SWI_Exit, 0x11 

     .text 
     .global _start 

_start: .global _start 
     .global main 

     b  main 

main: 
     ldr  R0, =MyArray 
     mov  R1, #42 
     str  R1, [R0], #4 
     mov  R1, #43 
     str  R1, [R0], #4 
     swi  SWI_Exit 

MyArray: .skip 20 * 4 
     .end 

, en azından ben bu durumda olduğuna inanıyoruz. Yanılıyorsam lütfen beni düzeltin.

+1

Neden aşağı oy? Evet, bu kısmen ev ödevi ile ilgilidir, ancak bu bilgiyi başkalarına faydalı görebiliyorum ve görevimi nasıl yapacağımı sormuyorum. – allejo

+0

Bu şekilde belirtmek isterseniz, herhangi bir işlemci ailesinde dizi olarak bir şey yoktur, sadece kol değil. Diziler aslında yok, sadece bir yerde başlayan bir bellek bloğu. Birçok komut seti, kesinlikle kol, bir dizi saf bir his elde etmenizi sağlayan bir kayıt ofset adresleme modunu destekler. Gelecekte yaptığınız ifadeyi yapmaya dikkat ediyorum. –

+0

@dwelch Ah not için teşekkürler, anlayışımla çok yardımcı oldu. Ben de onları bir dizi – allejo

cevap

2
  1. Sadece üzerlerinde yazıyorsunuz. Bu seviyede "diziler gibi şeyler" vardır, ancak sadece sabit boyutlu, önceden ayrılmış diziler vardır. .skip, sabit boyutlu diziyi ayırıyor. * Değişken büyüklükte, büyütülebilir bir dizi genellikle yığın veya yığın kullanarak daha karmaşık dyanamik bellek ayırma koduyla uygulanacak.
  2. loop: (gerçek adı isteğe bağlı) gibi bir etiketiniz varsa, b loop'u kullanarak ona geri dönebilirsiniz. (Program sonsuza döngü vermedi böylece Muhtemelen, koşullu dalı yapmak isteyeyim.) Sen R0, değiştirerek döngüde farklı elemanları erişebilir zaten Ayrıca

b main değil mi yapıyorlar hangi' Bir sonraki harekata dalmaktan dolayı gerçekten herhangi bir amaca hizmet etmek. Bunu kaldırırsanız kod aynı şeyi yapar.

[*] Alternatif olarak, sizin dizi R0 değiştirerek sen dizi uzandıkları (belleğe R0 işaret ettiği hariç) ve R0 arasında sadece unsurları olduğunu söyleyebiliriz. Ancak maksimum boyut hala .skip yönergesi ile belirlenir.

+0

aramamayı aklımda tutmaya çalışacağınız için teşekkür ederim, 'loop:' keyfi olduğunu fark etmemiştim. Hızlı soru, farklı öğelere nasıl erişebilirim? – allejo

+1

Muhtemelen “R0” ı MyArray'da işaret etmek istersiniz (örneğin 'ldr R0, = MyArray' veya adr R0, MyArray'), daha sonra str rx, [R0, # 4]' veya 'str rx, [R0 gibi şeyler yapın , R2] 'R2' nin 0, 4, 8, ... gibi değerlere sahip olduğu – scott

İlgili konular