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大小调整同步。