分类:
2012-08-16 12:40:30
在windows上用ARM公司的那些工具进行开发的时候,我们用的是ARM ASM,但是在linux环境下开发,用GNU工具的时候,那么我们就是用的是GNU ARM ASM了,所以学习GNU ARM 汇编就很有必要了,在很多地方,我们会看到它的身影,学习了的话,就不会看到一头雾水了。
汇编行的结构:
[<标签>:][<指令>}@注释
GNU ARM 汇编中,任何以冒号结尾的都被认为是一个标签,而不一定非要在一行的开始。
下面就看看常用的这些伪操作指令,记住了的话,看很多地方的代码就没那么痛苦了。
.byte expr{,expr}… 分配一段字节内存单元,并用expr初始化
.hword/.short expr{,expr}… 分配一段半字内存单元,并用expr初始化
.ascii expr{,expr}… 定义字符串expr(非零结束符)
.asciz/.string expr{,expr}… 定义字符串expr(以/0为结束符)
.float/.single expr{,expr}… 定义一个32bit IEEE浮点数expr
.double expr{,expr}… 定义64bit IEEE浮点数expr
.word/.long/.int expr{,expr}… 分配一段字内存单元,并用expr初始化
.fill repeat {, size}{.value} 分配一段字节内存单元,用size长度value填充repeat次。
.zero size 分配一段字节内存单元,并用0填充内存
.space/.skip size {,value} 分配一段内存单元,用value将内存单元初始化
.section expr 定义域中包含的段
.text {subsection} 将操作符开始的代码编译到代码段或代码段子段
.data {subsection} 将操作符开始的数据编译到数据段或数据段子段
.bss {subsection} 将变量存到bss段或bss段的子段
.code16/.thumb 表明当前汇编的指令集选择Thumb指令集
.code32/.arm 表明当前汇编的指令集选择ARM指令集
.end 标记汇编文件的结束行
.include 将一个源文件包含到当前源文件
.align/.balign 通过添加填充字节使当前位置满足一定的对齐方式
.macro、.exitm .endm .macro伪操作标识宏定义的开始,.endm标识宏定义的结束。用.macro及.endm定义一段代码,称为宏定义体。.exitm伪操作用于提前退出宏。
.ifdef .else .endif 当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句,其中else可以缺省。
.eject 在汇编符号列表文件中插入一分页符
.list 产生汇编列表
.nolist 表示汇编列表结束处
.title “heading” 使用heading作为标题
.sbttl “heading” 使用heading作为子标题
.ltorg 在当前段的当前地址(字对齐)产生一个文字池
.req name,expr 为一个寄存器定义名称
.err 使编译时产生错误报告
.print string 打印信息到标准输出
.fail expr 编译汇编文件时产生警告