Начну с кодом первого:обнулить память в сборе
.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
неподвижная -инн-размерные RISC-машины не имеют места для непосредственного операнда и перемещения адресации + смещения в одной команде. Даже если вы не используете перемещение ('[r1 + 100]' или независимо от синтаксиса ARM), кодировка инструкции хранения имеет значение для бит. (В этом-то и заключается суть сокращения сложности набора инструкций). Кстати, избегайте повторной загрузки констант, когда это возможно. Вы могли бы загрузить '= NL' в другой регистр, чтобы не было clobber' = LineArray'. –
Я не совсем понимаю, что вы подразумеваете под первой частью. Что касается загрузки в регистры, у меня создалось впечатление, что это нормально, так как это места в памяти. '= NL' - это другое расположение памяти, чем' = LineArray', поэтому загрузка его в r1 не такая большая сделка. Эта часть программы на самом деле работает нормально, я просто не могу стереть память после того, как я ее использовал – Peter
Я имею в виду, что вы, кажется, говорили о загрузке '= LineArray' в' r1' более одного раза, не так ли? Я говорил, что вы должны хранить '= LineArray' в регистре, а не перезагружать его. Кроме того, если 'NL' близок к' LineArray' в памяти, вы можете добавить 'r2, r1, # (NL - LineArray)' или что-то еще. Помните, что 'ldr reg, = value' - псевдо-оператор, который может превращаться в нагрузку из ближайшего постоянного пула, а не сразу. –