GNU汇编常用语法
汇编源程序一般用于系统最基本的初始化:初始化堆栈指针、设置页表、操作ARM的协处理器等。这些初始化工作完成后就可以跳转到C代码main函数中执行。
GNU 汇编语法适用于所有的架构,例如ARM。GNU 汇编由一系列的语句组成,每行一条语句,每条语句有三个可选部分,如下:
label: instruction @comment
- label 即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到指令的地址,标号也可以用来表示数据地址。注意 :label 后面的":",任何以":"结尾的标识符都会被识别为一个标号。
- instruction 即指令,也就是汇编指令或伪指令。
- @符号,表示后面的是注释,就跟 C 语言里面的"/*"和"*/"一样,其实在 GNU 汇编文件中我们也可以使用"/*"和"*/"来注释。
- comment 就是注释内容。
比如如下代码:
add: MOVS R0, #0X12 @设置 R0=0X12
上面代码中"add:"就是标号,"MOVS R0,#0X12"就是指令,最后的"@设置 R0=0X12"就是注释。
然而"#"又是什么意思呢,这种符号又称为"指令中的操作数符号",可总结如下:
- 立即数符号"#"
"#"符号表示立即数,该符号后的数据可以是二进制数,也可以是十进制数或者十六进制数据,如果操作数为十进制数据,则前面除了"#"外,没有其他符号。
- 二进制数符号"%" (或者"2_",有的地方这么用)
"%"符号后面的数字为二进制数,如%10010101表示二进制数10010101,即十进制数149。
- 十六进制数符号"0x"
"0x"符号表示后面的数据为十六进制数,如0xFFFF表示十六进制数FFFF,即十进制树65535。
注意!ARM 中的指令、伪指令、伪操作、寄存器名等可以全部使用大写,也可以全部使用小写,但是不能大小写混用。