ARM9学习笔记之——汇编
时间:11-20
来源:互联网
点击:
ARM系列芯片与PC系列(可能我说法不太准确)芯片在指令设计上就有本质的区别。ARM中每条指令是精简指令集要么是32位,要么是16位。而PC的指令是复杂指令集,一条指令可以由多个字节组成。
在写ARM汇编程序时,发现ARM的指令非常的灵活,同样一个功能可以使用多种方式实现。给开发者更多DIY的地方。以下是一些小总结,如有不正确的地方欢迎指正。
1. 关于函数调用方法
在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;编译错误
ARM9汇 相关文章:
- ARM9 汇编指令总结1(11-28)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)