日期:2014-05-16 浏览次数:21169 次
以下分析及总结结果并未进行运行确认。
?
任何汇编行都是如下结构:
[:] [} @ 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 程序计数器