Я пытаюсь добавить введенный пользователем номер к каждому элементу массива. У меня все работало, пока я не понял, что исходный массив не обновляется. Просто, подумал я, просто сохраните значение обратно в массив и живите дальше. К сожалению, это не кажется таким уж простым.
Как следует из названия, я использую ARMv7 и пишу ассемблер. Я использовал это руководство, чтобы понимать основы и иметь хороший код для просмотра. Когда я запускаю приведенный здесь пример кода, он работает нормально: str r2, [r3]
помещает все, что находится в r2
, в то, на что указывает r3
. Ниже приведена моя попытка сделать то же самое, что дает мне Signal 11 occurred: SIGSEGV (Invalid memory segment access)
и Execution stopped at: 0x0000580C STR r3,[r5,#0]
:
@ Loop and add value to all values in array regardless of array length
@ Setup loop
@ r4 comes from above and the scanf value, I've checked the registers and the value is correct
mov r0, #0
ldr r1, =array_b
ldr r2, addrArr
loop: @ Start loop to add inputed number to every value in array
add r3, r2, r0
ldr r3, [r3]
add r3, r3, r4 @ Add input to each index in array
add r5, r2, r0 @ Pointer to location in array
str r3, [r5] @ Put new value into array
cmp r0, r1 @ Check for end of array
addne r0, r0, #4 @ Not super necessary but it shows one of the cool things ARM can do, condition math
bne loop @ Branch if not equal
beq doneLoop @ Branch if equal
doneLoop: @ End loop
Вот вары
.align 2
array:
.word 0
.word 1
.word 2
.word 3
.word 4
.word 5
.word 6
.word 7
.equ array_b, .-array
addrArr: .word array
Насколько я понимаю, str
сначала берет источник, а затем - пункт назначения (что по какой-то причине отличается от других инструкций). Таким образом, r5
используется для вычисления того, где в массиве хранить значение, а r3
имеет значение из инструкции add
. Я проверил, и значение в r5
является допустимым, то есть: это начало массива, а array_b имеет правильную длину (в данном случае 32). Я также пробовал делать =array
вместо addrArr
, но они дают одно и то же значение и одно и то же сообщение об ошибке.
beq
ничего не делает. - person Bregalad   schedule 17.03.2015