在程序集中将内存清零

时间:2016-04-11 20:22:34

标签: memory assembly arm

我先从代码开始:

<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

1 个答案:

答案 0 :(得分:1)

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

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