(Проблема основана на ассемблере ARM.) Я имею дело с проблемой, которая просит меня изменить данный массив. Так же, как это:Как изменить массив на языке ассемблера ARM?
Given array: 1, 2, 3, 4, 5
Reversed array: 5, 4, 3, 2, 1
И ограничение этой проблемы заключается в том, что я только должен использовать регистры r0-r3.
У меня есть базовый алгоритм, но я действительно смущен, когда пытаюсь реализовать идею. Мой алгоритм:
Loop:
1. get value from head pointer, ptr++
2. get value from tail pointer, ptr--
3. swap them
4. check if head pointer and tail pointer cross,
if so, exit loop and return.
if not, go back to loop.
Но я просто не знаю, как использовать только 4 регистров, чтобы решить эту проблему ..
Ниже будет все, что я в настоящее время.
.text
.global reverse
reverse:
@ See if head and tail ptr cross
@ If so, end loop (b end)
head:
@ use r2 to represent head value
ldr r2,[r0] @ r2 <-*data get the first value
tail:
@ mov r1,r1 @ size
sub r1,r1,#1 @ size-1
lsl r1,r1,#2 @ (size-1)*4
add r0,r0,r1 @ &data[size-1] need to ldr r1,[r0] to get value
ldr r1,[r0] @ get value for r1 (from tail)
swap:
@ swap values
mov r3, r1 @store value to r3
str r2, [r0]
@ head ptr ++
@ tail ptr --
@ back to reverse
end:
@ loop ends
Вы алгоритм является неполным, он будет поменять местами головы и хвоста навсегда. – Ped7g
почему бы вам не попытаться скомпилировать это на C, а затем разобрать его и изучить ... это то, что я делаю, когда хочу узнать, что находится под капотом –
после редактирования вашего алгоритма навсегда замените голову + 1 и хвост-1 (если они даже существуют .. и если слово «ptr» означает этот указатель головы/хвоста, а не что-то совершенно другое) ... вы должны записать его правильно (потребуется немного больше 4 шагов) .. и на самом деле, не стесняйтесь записывать его на простые и простые шаги, это может оказаться очень полезным для написания asm. – Ped7g