微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM9学习笔记之——汇编

ARM9学习笔记之——汇编

时间:11-20 来源:互联网 点击:
ARM系列芯片与PC系列(可能我说法不太准确)芯片在指令设计上就有本质的区别。ARM中每条指令是精简指令集要么是32位,要么是16位。而PC的指令是复杂指令集,一条指令可以由多个字节组成。

在写ARM汇编程序时,发现ARM的指令非常的灵活,同样一个功能可以使用多种方式实现。给开发者更多DIY的地方。以下是一些小总结,如有不正确的地方欢迎指正。

1. 关于函数调用方法

在ARM汇编中,函数调用非常灵活。

(1)BL指令

  1. blinitmem;调用
  2. mem
  3. ....
  4. movpc,lr;返回

BL指令在编译时,是以当前指令地址为基准相对跳转。由于指令中地址区域为16位,其中1位作前后标志,剩下15位作为跳转范围。所以跳转地址范围为当前地址前后32MB地址。

(2)LDR PC, = xmain

  1. ldrlr,=endmain;保存绝对返回地址
  2. ldrpc,=xmain;绝对地址跳转
  3. endmain
  4. bendmain

当编译器在对LDR宏进行编译时,xmain作为绝对地址赋给PC。

(3)BX

  1. ldrr0,=xmain
  2. bxr0

也是绝对地址跳转。在跳转中,可以进行ARM与thumb指令集转换。

2.关于LDR与ADR宏

在做“2.6.8内存驱动实验”时,我关注了initmemloop前一个指令"adr r2, memdata"。尝试着将它换成 ldr 进行实验。

经过反汇编与寄存器跟踪,我看到它们的区别:

  1. ldrr2,=memdata;r2=运行地址
  2. adrr2,memdata;r2=加载地址
  3. ldrr2,memdata;r2=0x22000000
  4. adrr2,=memdata;编译错误


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top