2016-04-11 29 views
0

bellek dışarı ben ilk koduyla başlayacağız:sıfır montaj

.equ SWI_Open, 0x66  @ open a file 
.equ SWI_Close, 0x68  @ close a file 
.equ SWI_PrStr, 0x69  @ Write a null-ending string 
.equ SWI_RdStr, 0x6a  @ Read a string 
.equ Stdout, 1   @ Set output target to be Stdout 
.equ SWI_Exit, 0x11  @ Stop execution 
.global _start 
.text 

_start: 
    ldr r0,=InFileName 
    mov r1,#0 
    swi SWI_Open 
    bcs InFileError 
    ldr r1,=InFileHandle 
    str r0,[r1] 
    mov r8, r0  @ r8 will hold the address of the file handle 
ReadLoop: 
    mov r0, r8 
    ldr r1, =LineArray 
    mov r2, #256 
    swi SWI_RdStr 
    bcs EndReached 
    @ r1 now has address of the read line 
    mov r9, r1  @ r9 will hold the memory address of the read line 
    mov r4, #0  @ r4 = START 
    mov r5, #1  @ r5 = END 
    bl PerLineFunc  @ r0/r1 args passed to PerLineFunc 
    @ ShuffleWord within PerLineFunc should change the words around, so now we just need to print the new line of words 
    mov r0, #Stdout 
    mov r1, r9 
    swi SWI_PrStr 
    ldr r1, =NL 
    swi SWI_PrStr 
    bal ReadLoop 

SWI_RdStr r1 içine saklanan adres konumu ile belleğe verilen dosya ve depolar bunu bir çizgi okur. Sorunum, hattın okunduğu hafızayı nasıl sıfırlayacağımı bilmem. İlk satır 20 karakterse ve sonraki satır 15 ise, ilk satırın son 5 karakteri 2. satır okunduktan sonra hala bellekte kalır. Sadece tekrar ReadLoop çalıştırmadan önce hafızayı sıfırlamaya çalışıyorum ...

ldr r1, =LineArray 
str #0, [r1] 

ama bu bir sözdizimi hatası verir:

Ben böyle bir şey olacağını düşünüyordum.

Düzeltme: OP'de yanıt kaydediliyor. Bu ilk bölümü İşte ReadLoop

mov r0, #0 
ldr r1, =LineArray 
mov r2, #0 
bl EraseMemory @ r0, r1, and r2 passed into EraseMemory 

sonuna eklenir gereken EraseMemory fonksiyonu var

EraseMemory: 
    str r0, [r1] 
    add r1, r1, #4 
    add r2, r2, #1 
    cmp r2, #64   @ 256/4 = 64 
    bxeq lr    @ This loop should run 64 times to erase all 256 bytes of memory that were used 
    bal EraseMemory 
+0

sabit -insn-büyüklükteki RISC makinelerinde, tek bir komutta hemen işlenen ve adresleme modu + yer değiştirme için yer yoktur. Bir yer değiştirme kullanmıyor olsanız bile ('[r1 + 100]' veya ARM sözdizimi ne olursa olsun), mağaza talimatı kodlaması bitler için anlam ifade eder. (Bu tür bir şey, azaltılmış komut kümesi karmaşıklığının tüm noktasıdır). BTW, mümkün olduğunda yeniden yükleme sabitlerinden kaçının. '= NL' yi farklı bir reg'e yükleyebilirsiniz, böylece = LineArray'ı kestiremezsiniz. –

+0

İlk kısımda ne demek istediğini anlamıyorum. Kayıtlara yüklendikçe, bunun bellekte konumlar olduğu için bunun yapılmasının iyi olduğu izlenimindeydim. '= NL',' = LineArray'dan farklı bir bellek konumudur, bu yüzden r1’e yüklenme, o kadar büyük bir anlaşma değildir. Programın bu kısmı gerçekten işe yarıyor gibi görünüyor, ben sadece kullandıktan sonra belleği silemedim – Peter

+0

Yani '= LineArray' 'r1'e bir kereden fazla yüklenmekten bahsediyor gibiydin, yapmadın mı '= LineArray' dosyasını yeniden yüklemek yerine bir kayıtta tutmanız gerektiğini söylüyordum. Ayrıca, eğer 'NL' hafızada 'LineArray''a yakınsa, belki de r2, r1, # (NL - LineArray)' veya bir şeyler ekleyebilirsiniz. Unutmayın ki, ldr reg, = value', bir aniden olmak yerine yakındaki bir sabit havuzdan bir yüke dönüşebilen sahte bir işlemdir. –

cevap

1

Bir kayıt anında değer yazmak için öncelikle şunları yapmalısınız:

ldr r1, =LineArray 
mov r0, #0 
str r0, [r1] 
+0

Bu yalnızca [r1] adresindeki belleğin ilk 4 baytını (ilk 32 bit) sıfırlar. = LineArray – Peter

+0

için kullanılan tüm belleği sıfırlamam gerekiyor. Satırın boyutu nedir? Bu durumda bir döngü eklemeniz gerekiyor. – Dric512

+0

Eh, maksimum 256 ve ilk cevabınızı gördükten sonra, bir döngü eklemem gerektiğini düşündüm. Bilmediğim bir tür talimatla daha kolay bir yol olduğunu umuyordum. Yardım için teşekkürler – Peter