日期:2014-05-16  浏览次数:20980 次

Linux Arm GNU Compiler 语法小结

以下分析及总结结果并未进行运行确认。

?

任何汇编行都是如下结构:
[:] [} @ comment
[:] [} @ 注释
Linux ARM 汇编中,任何以冒号结尾的标识符都被认为是一个标号,而不一定非要在一行的开始。

标号只能由a~z,A~Z,0~9,“.”,_等字符组成。当标号为0~9的数字时为局部标号,局部标号可以重复出现,使用方法如下:
  标号f: 在引用的地方向前的标号
  标号b: 在引用的地方向后的标号

.section伪操作
用户可以通过.section伪操作来自定义一个段,格式如下:
.section section_name [, "flags"[, %type[,flag_specific_arguments]]]
每一个段以段名为开始, 以下一个段名或者文件结尾为结束。这些段都有缺省的标志(flags),连接器可以识别这些标志。(与armasm中的AREA相同)。
下面是ELF格式允许的段标志
含义
a 允许段
w 可写段
x 执行段

Linux汇编程序中的宏定义
格式如下:
.macro 宏名 参数名列表 @伪指令.macro定义一个宏
    宏体
.endm   @.endm表示宏结束
如果宏使用参数,那么在宏体中使用该参数时添加前缀“/”。宏定义时的参数还可以使用默认值。
可以使用.exitm伪指令来退出宏。

?

寄存器规范:

r0,r1,r2,r3  四个寄存器在函数调用时不保证保存,需要程序员在调用前进行保存。因为这四个寄存器将被用于函数调用的前四个参数(32bits,如果64bits则会占用两个)保存。函数调用返回时会暂存使用。
r4~r11: 变量寄存器
r9: sb 静态基址
r10: sl 堆栈限制
r11: fp 帧指针
r12: ip 过程调用中间临时寄存器
r13: sp 堆栈指针
r14: lr 链接寄存器
r15: pc 程序计数器