好的,我正在尝试在 ARM7 汇编中实现选择排序算法。它从数组的最后一个元素开始,一直到第一个元素。它适用于第一次交换,但在继续之前退出。我和我的教授谈过,他说要使用堆栈变量,这样 lr 就不会被覆盖等,但我仍然不明白该怎么做。我搜索了执行此操作的方法,但似乎找不到我了解如何在我的代码中实现的任何内容。
我的代码如下:(a1 是指向长度为 a2 的字符数组的指针。两者都通过 C 传入)
sort2:
stmdb sp!, {v1-v8, lr} @ Copy registers to stack
mov v1, a2 @store number of elements in v1,v2 (a2 is passed in via C)
mov v2, a2
sub v1, v1,#1 @subtract 1 from a2 to get number last element in array
sub v2, v1,#1 @subtract 1 from v1 to get element just below last element
bl loop2
ldmia sp!, {v1-v8, pc}
loop2:
ldrb v4, [a1,v1] @store value of last element in array a1(passed in via C) into r4
ldrb v5, [a1,v2] @store value of next to last element in array a1(passed in via C) into r4
cmp v4, v5
blt swap2 @if last element is less than current element a[v2], swap them
cmp v2, #0 @if v2 = 0, we cycled through one iteration
subeq v1, v1,#1 @so now move on to a[v1-1] element in array
moveq v2, v1 @if v2 = 0, move the value of v1 into v2
sub v2, v2,#1 @subtract 1 from v2 to get element below a[v1]
cmp v1, #0 @if v1 = 0, were done
bne loop2
mov pc, lr @return to sort2
swap2:
mov v8, lr @store return address in v8
ldrb v6, [a1,v2] @store value of a[v2] into v6
strb v4, [a1,v2] @store v4 into a[v2]
strb v6, [a1,v1] @store value of v6 into a[v1]
mov lr, v8 @falls through and exits here instead of returning to loop2
已经有几个地方可以从子例程返回。
输入 sort2
时,在堆栈上保存了一些寄存器:
stmdb sp!, {v1-v8, lr} @ Copy registers to stack
当您离开 sort2
时,您可以从堆栈中恢复一些寄存器:
ldmia sp!, {v1-v8, pc}
当你离开loop2
时,你会做类似的事情:
mov pc, lr @return to sort2
仔细看看。注意到那里的模式了吗?离开swap2
应该有类似的东西。
现在,loop2
应该调用另一个函数:swap2
。为了支持调用其他函数,调用函数应该保存一些寄存器,就像sort2
一样。叶函数(不调用其他函数的函数)不需要保存调用方保存的寄存器。此外,正如@PeteFordham删除的答案所指出的那样:blt
= 分支小于; bllt
= 分支和链接小于。