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
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. –
İ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
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. –