.global reverse
.data
start: .word 1
end: .word 1
loopcount: .word 0
reverse:
ldr r3, =end
str r1, [r3]
next:
ldr r3,=end
ldr r2,=start
ldr r3, [r3]
ldr r2, [r2]
cmp r2,r3
bgt done
cmp r2,r3
beq done
sub r3,r2
mov r2,#0
mov r1,#0
loop:
cmp r2,r3
beq next2
add r2, r2, #1
add r1, r1, #4
b loop
next2:
ldr r3, [r0]
add r0, r0, r1
ldr r2, [r0]
str r3, [r0]
sub r0, r0, r1
str r2, [r0]
add r0, r0, #4
ldr r3,=end
ldr r1, [r3]
sub r1, r1, #1
str r1, [r3]
ldr r3,=start
ldr r1, [r3]
add r1, r1, #1
str r1, [r3]
b next
done:
bx lr
Я пытаюсь изменить массив, и это моя обратная функция в сборке, функция обратная (int data *, size); data - массив, а размер - размер. Он работает с любым массивом размером 5, но для более длинных массивов, например размером 10, он будет игнорировать последние 2 и действовать так, как будто массив имеет размер 8 и свопит его все, как если бы последние 2 числа в массиве не есть, он вернется:Сборка, не могу сказать, что не так с моим кодом ARM-процессор
Array:
1 2 3 4 5 6 7 8 9 10
My Return:
8 7 6 5 4 3 2 1 9 10
Я не могу понять, в чем моя проблема.
Я не могу найти, почему ваш код даже иногда работают, поскольку это выглядит очень сложным для меня, плюс все переменные памяти. Но отладчик может показать вам, что он делает. Я бы начал с массивов размером 0, 1, 2, ... Я думаю, что должно произойти что-то неожиданное раньше, чем в размере 10. (и не смотрите только на вывод, посмотрите на один шаг инструкции, что действительно происходит иногда. Вы можете получить корректный результат, даже если код не работает, когда вы его пишете, просто по счастливой случайности) – Ped7g