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;编译过错