ARM9学习笔记之——汇编
在写ARM汇编程序时,发现ARM的指令非常的灵活,同样一个功能可以使用多种方式实现。给开发者更多DIY的地方。以下是一些小总结,如有不正确的地方欢迎指正。
本文引用地址:https://www.eepw.com.cn/article/201611/318807.htm1. 关于函数调用方法
在ARM汇编中,函数调用非常灵活。
(1)BL指令
- blinitmem;调用
- mem
- ....
- movpc,lr;返回
BL指令在编译时,是以当前指令地址为基准相对跳转。由于指令中地址区域为16位,其中1位作前后标志,剩下15位作为跳转范围。所以跳转地址范围为当前地址前后32MB地址。
(2)LDR PC, = xmain
- ldrlr,=endmain;保存绝对返回地址
- ldrpc,=xmain;绝对地址跳转
- endmain
- bendmain
当编译器在对LDR宏进行编译时,xmain作为绝对地址赋给PC。
(3)BX
- ldrr0,=xmain
- bxr0
也是绝对地址跳转。在跳转中,可以进行ARM与thumb指令集转换。
2.关于LDR与ADR宏
在做“2.6.8内存驱动实验”时,我关注了initmemloop前一个指令"adr r2, memdata"。尝试着将它换成 ldr 进行实验。
经过反汇编与寄存器跟踪,我看到它们的区别:
- ldrr2,=memdata;r2=运行地址
- adrr2,memdata;r2=加载地址
- ldrr2,memdata;r2=0x22000000
- adrr2,=memdata;编译错误
评论