2016-04-11 2 views
0

Начну с кодом первого:обнулить память в сборе

.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 читает строку из файла и сохраняет его в памяти с адресом местоположения, хранящейся в Г1. Моя проблема в том, что я не знаю, как обнулить память, в которой была прочитана строка. Если первая строка - 20 символов, а следующая строка - 15, то последние 5 символов первой строки все еще находятся в памяти после считывания 2-й строки.

Я думал, что это будет что-то вроде:

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

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 
+0

неподвижная -инн-размерные RISC-машины не имеют места для непосредственного операнда и перемещения адресации + смещения в одной команде. Даже если вы не используете перемещение ('[r1 + 100]' или независимо от синтаксиса ARM), кодировка инструкции хранения имеет значение для бит. (В этом-то и заключается суть сокращения сложности набора инструкций). Кстати, избегайте повторной загрузки констант, когда это возможно. Вы могли бы загрузить '= NL' в другой регистр, чтобы не было clobber' = LineArray'. –

+0

Я не совсем понимаю, что вы подразумеваете под первой частью. Что касается загрузки в регистры, у меня создалось впечатление, что это нормально, так как это места в памяти. '= NL' - это другое расположение памяти, чем' = LineArray', поэтому загрузка его в r1 не такая большая сделка. Эта часть программы на самом деле работает нормально, я просто не могу стереть память после того, как я ее использовал – Peter

+0

Я имею в виду, что вы, кажется, говорили о загрузке '= LineArray' в' r1' более одного раза, не так ли? Я говорил, что вы должны хранить '= LineArray' в регистре, а не перезагружать его. Кроме того, если 'NL' близок к' LineArray' в памяти, вы можете добавить 'r2, r1, # (NL - LineArray)' или что-то еще. Помните, что 'ldr reg, = value' - псевдо-оператор, который может превращаться в нагрузку из ближайшего постоянного пула, а не сразу. –

ответ

1

Сначала нужно написать непосредственное значение в регистр:

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

Это только нулевые первые 4 байта (первые 32 бита) памяти по адресу [r1]. Мне нужно обнулить всю память, используемую для = LineArray – Peter

+0

Каков размер строки? В этом случае вам нужно добавить цикл. – Dric512

+0

Ну, максимум 256, и, увидев ваш первый ответ, я решил, что мне придется добавить цикл. Я просто надеялся, что есть более простой способ с какой-то инструкцией, о которой я не знал. Спасибо за помощь – Peter

Смежные вопросы