我正在为 UNI 做一个项目,但遇到了问题。
我们正在学习如何在调用子程序时将寄存器压入/弹出堆栈。
我需要编写一个子程序将十进制数 0-15 转换为相应的十六进制 ASCII 码,并保留所有寄存器的值,除了r0
应该存储结果的位置。我有一个 ASCII 代码表,基本上只需将number*4
ASCII 表的起始地址添加,然后将值存储回r0
.
我得到了正确的结果,但子程序循环。它不停地从跳到ldmfd
跳sub
。知道为什么吗?
main:
adr r0,num
adr r1,ascii
ldr r2,[r0]
bl sub
sub: stmfd sp!,{r1-r2,lr}
ldr r0,[r1,r2,LSL #2]
ldmfd sp!,{r1-r2,pc}
/* variables here */
num: .word 15
ascii: .word 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46
/* end variables */