0
(这个问题基于汇编语言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步)和其实不要犹豫,把它写成简单和简单的步骤,它可能会变成真正有用的写作。 – Ped7g