汇编常用语法
-
GNU汇编语句:
[lable:] instruction [@comment]
lable 表示标号,表示地址位置,可选.
instruction即指令,也就是汇编指令或伪指令。
comment 就是注释内容。
-
用户使用.section 伪操作来定义一个段,汇编系统预定义了一些段名:
.text :代码段,只读的代码信息。
.data :初始化的数据段,初始化的全局变量和局部静态变量。
.bss :未初始化的数据段,未初始化的全局变量和局部静态变量,使用动态的变量来初始化。
.rodata :只读数据段,const修饰的static 变量都,以及一些字面量。
我们当然可以自己使用.section 来定义一个段,每个段以段名开始,以下一段名或者文件结尾结束,比如:
.section .section_name @定义了一个testsection段。
3. 伪指令:对会汇编过程进行控制的代码,该类指令并不是可执行指令,没有机器代码,只用于汇编过程中为汇编陈旭提供汇编信息。相当于c语言关键字,汇编代码种全大写的很可能是伪指令,或者宏。
(1)伪指令只会存在汇编语言中,在其他代码中叫语句。
(2)伪指令,不是可执行指令,不会产生机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息。
例如,.global,.byte, .section都是伪指令
4. 汇编中的函数定义:
函数名:函数体返回语句5. 常见的指令: 处理器(cpu)内部数据传输指令:
指令 | 目的 | 源 | 描述 |
---|---|---|---|
mov | R0 | R1 | 将R1复制到R0 |
MRS | R0 | CPSR | 将特殊寄存器CPSR里面的数据复制到R0中 |
MSR | CPSR | R1 | 将R1里面的数据复制到特殊寄存器CPSR中 |
存储器访问指令:外设寄存器属于存储器的一种,
指令 | 描述 |
---|---|
LDR Rd, [Rn, #offset] | 从存储器Rn+offset的位置读取数据存放到Rd中。 |
STR Rd, [Rn, #offset] | 将Rd中的数据写入到存储器中的Rn+offset位置。 |
压栈和出栈指令:
指令 | 描述 |
---|---|
PUSH <req list> | 将寄存器列表存入栈中。 |
POP <req list> | 从栈中恢复寄存器列表。 |
跳转指令:
(1)直接跳转指令B,BL,BX等
(2)直接向PC寄存器里面写入数据。
算术运算指令:
ADD, ADC (带进位),SUB(减法),MUL(乘法),UDIV(无符号除法),SDIV(有符号除法)
逻辑运算指令:与或非异或。