我先从代码开始:
<br>
SWI_RdStr从给定文件中读取一行并将其存储到存储器中,地址位置存储在r1中。我的问题是我不知道如何将读取行的内存清零。如果第一行是20个字符,并且下一行是15,那么在读取第2行之后,第一行的最后5个字符仍然在内存中。
我在想它会是这样的:
.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
但是返回语法错误...我只是在再次运行ReadLoop之前尝试重置内存。
编辑:在OP中发布答案。 第一部分需要添加到ReadLoop
的末尾ldr r1, =LineArray
str #0, [r1]
这是EraseMemory函数
mov r0, #0
ldr r1, =LineArray
mov r2, #0
bl EraseMemory @ r0, r1, and r2 passed into EraseMemory
答案 0 :(得分:1)
首先需要将立即值写入寄存器:
ldr r1, =LineArray
mov r0, #0
str r0, [r1]