Memory 汇编中的内存归零

Memory 汇编中的内存归零,memory,assembly,arm,Memory,Assembly,Arm,我将首先从代码开始: .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 Stdo

我将首先从代码开始:

.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中。我的问题是,我不知道如何将该行读入的内存归零。如果第一行为20个字符,下一行为15个字符,则在读取第二行后,第一行的最后5个字符仍在内存中

我在想可能是这样的:

ldr r1, =LineArray
str #0, [r1]
但这会返回一个语法错误。。。我只是想在再次运行ReadLoop之前重置内存

编辑:在OP中发布答案。 第一部分需要添加到ReadLoop的末尾

mov r0, #0
ldr r1, =LineArray
mov r2, #0
bl EraseMemory  @ r0, r1, and r2 passed into EraseMemory
这是记忆功能

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

首先需要将立即数写入寄存器:

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

首先需要将立即数写入寄存器:

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

固定insn大小的RISC机器没有空间在单个指令中容纳立即操作数和寻址模式+移位。即使不使用位移(
[r1+100]
或任何ARM语法),存储指令编码对位也有意义。(这类事情是降低指令集复杂性的关键)。顺便说一句,尽可能避免重新加载常数。你可以把
=NL
加载到不同的注册表中,这样你就不会把
=LineArray
搞砸了。我不太明白你说的第一部分是什么意思。至于加载到寄存器,我的印象是这样做是可以的,因为这些是内存中的位置
=NL
=LineArray
是不同的内存位置,因此将其加载到r1并不是什么大问题。程序的这一部分实际上似乎工作得很好,在我使用它之后,我无法清除内存。我的意思是,你似乎不止一次谈论过将
=LineArray
加载到
r1
中,不是吗?我是说你应该把
=LineArray
保存在寄存器中,而不是重新加载它。另外,如果
NL
在内存中接近
LineArray
,您可以
添加r2、r1、#(NL-LineArray)
或其他内容。请记住,
ldr reg,=value
是一个伪操作,可以从附近的常量池转换为负载,而不是立即加载。第一部分解释了为什么
str#0,[r1]
不可编码:一条
str
指令没有立即数的空间,因为它使用所有的空闲位来编码寻址模式和移位。它是RISC,所以如果没有位移,位就为零,而不是用于其他用途。固定insn大小的RISC机器没有空间在一条指令中容纳立即操作数和寻址模式+位移。即使不使用位移(
[r1+100]
或任何ARM语法),存储指令编码对位也有意义。(这类事情是降低指令集复杂性的关键)。顺便说一句,尽可能避免重新加载常数。你可以把
=NL
加载到不同的注册表中,这样你就不会把
=LineArray
搞砸了。我不太明白你说的第一部分是什么意思。至于加载到寄存器,我的印象是这样做是可以的,因为这些是内存中的位置
=NL
=LineArray
是不同的内存位置,因此将其加载到r1并不是什么大问题。程序的这一部分实际上似乎工作得很好,在我使用它之后,我无法清除内存。我的意思是,你似乎不止一次谈论过将
=LineArray
加载到
r1
中,不是吗?我是说你应该把
=LineArray
保存在寄存器中,而不是重新加载它。另外,如果
NL
在内存中接近
LineArray
,您可以
添加r2、r1、#(NL-LineArray)
或其他内容。请记住,
ldr reg,=value
是一个伪操作,可以从附近的常量池转换为负载,而不是立即加载。第一部分解释了为什么
str#0,[r1]
不可编码:一条
str
指令没有立即数的空间,因为它使用所有的空闲位来编码寻址模式和移位。它是RISC,所以如果没有位移,位就等于零,而不是用于其他用途。这只会将地址[r1]处内存的前4个字节(前32位)归零。我需要将用于=linearray的所有内存归零该行的大小是多少?在这种情况下,你需要添加一个循环。最大值是256,在看到你的第一个答案后,我想我必须添加一个循环。我只是希望有一种更简单的方法,有一些我不知道的指导。感谢您的帮助使用
stmia[rn],{r0-r3}有一种更快的方法其中r0-r3预调零。然后可以快速清除缓存线或4*32位。如果对齐是(sic)写入,这可能与DDR大小调整同步。这只会将地址[r1]处内存的前4个字节(前32位)归零。我需要将用于=linearray的所有内存归零该行的大小是多少?在这种情况下,你需要添加一个循环。最大值是256,在看到你的第一个答案后,我想我必须添加一个循环。我只是希望有一种更简单的方法,有一些我不知道的指导。感谢您的帮助使用
stmia[rn],{r0-r3}有一种更快的方法其中r0-r3预调零。然后可以快速清除缓存线或4*32位。如果对齐是(sic)写入,则这可能与DDR大小调整同步。