ARM汇编基础知识点总结

来源:互联网 发布:mac压缩解压软件 编辑:程序博客网 时间:2024/06/01 09:02

最近在看2440A的引导代码, 发现学习汇编还真的是挺费力的, 每天的进展也不大, 不过做什么事还是贵在坚持。

现把ARM汇编的一些基础知识总结一下, 以更好的总结学习。

 

1. ARM源程序文件名的后缀名分类如下:
   汇编文件: *.S
   引入文件: *.inc
   C程序 :     *.c
   头文件 :    *.h

 

2. 汇编语句格式:
[ 标号 ]  <指令 | 条件 | S >   <操作数>   [ ;注释]

 说明:[]中的内容是可以省略的;而<>中的内容绝对不能省略
(1)、所有标号必须在一行的顶格书写, 其前面不能有空格, 并且其后面不要加:
(2)、所有指令均不能顶格书写
(3)、ARM汇编器对标识符大小写敏感, 书写标号及指令时字母大小要一致, 在ARM汇编程序中, 一个ARM指令/伪指令/寄存器名可以全部为大写字母, 也可以全部为小写字母, 但不要大小写混合使用
(4)、注释使用 ;或者 @.   @表示开始到此行结束, 注释可以在一行顶格书写(对ADS汇编格式, 只支持;)

(5)、源程序中允许空行
(6)、如果单行太长,可以使用字符 / 将其分行, / 后不能有任何字符,包括空格
(7)、对于变量的设置, 常量的定义, 其标识符必须在一行的顶格书写

备注:标号---在ARM汇编中, 标号代表一个地址, 根据标号生成方式, 可以分为以下3种
(1)、基于PC的标号,例如: BL  LEDTEST
(2)、基于寄存器的标号,例如: MAP  0x00,R9
(3)、绝对地址,例如: LDR R0,=WTCON

 

3. 局部标号:

    说明:主要用于局部范围代码中, 对宏定义也非常有用, 格式如下:
   N { routname }
  N是局部标号, 为 0 ~ 99
  routname是局部标号作用范围的名称, 可省略
  局部标号引用格式: % {F | B }  {A | T}  N {routname }
其中:
% 表示局部标号引用操作
F 指示编译器只向前搜索
B 指示编译器只向后搜索
A 指示编译器搜索宏的所有嵌套层次
T 指示编译器搜索宏的当前层
应用举例如下:
       mov   r1, #16
0     subs  r1,r1, #1
       bne    %B0      ;若r0不等于0, 则返回到局部标号为0处继续执行

4. ARM编译器特定的关键词
     __asm:告诉编译器下面的代码是用汇编写的
     __inline:声明该函数在其被调用的地方展开
     __irq:声明该函数可以被用做irq或者fiq异常的中断处理程序
     __pure:声明一个函数, 其结果仅仅依赖于其输入参数, 而且它没有负效应
     __int64:是long long 的同义词
     __volatile:告诉编译器该对象可能在程序之外被修改
     __weak:用于限定一个对象, 该对象如果连接时不存在, 不会报错

 

5. C与汇编相互调用
     寄存器的使用规则为: 子程序间通过寄存器R0 - R3 来传递参数,使用 R4 - R11来保存局部变量,R12用作过程调用中间临时寄存器, 即IP,  R13用作堆栈指针,即SP, R14作为链接寄存器,即LR, R15是程序计数器,即PC

    子程序参数传递规则: 当寄存器不超过4个时, 使用 R0 - R3来传递参数, 当超过4个时,可以使用堆栈来传递参数,入栈的顺序与参数顺序相反,即最后一个字数据先入栈

    子程序结果返回规则: 结果为一个32位的整数时, 可以通过寄存器R0返回, 如果是64位, 通过R0和R1返回,对于位数更多的结果, 需要通过内存来传递

 

   5.1  C语言调用汇编程序

        在汇编程序中使用 EXPORT 伪指令声明本子程序, 使其它程序可以调用子程序, 在C语言程序中使用extern关键字声明外部函数(声明要调用的汇编子程序), 即可调用此汇编子程序

 

   5.2  汇编程序调用C程序

        在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数, 在调用C程序时, 要正确设置入口参数, 然后使用BL调用

 

待续~~~~




 



原创粉丝点击