汇编语法
1
arm中的指令、伪指令、伪操作、寄存器名,可以全大写(全小写)但是不能混写
2.
label:instruction@comment 标号: 指令@注释 add: MOVS R0,#0X12@设置R0=0X12
3.伪操作段名
.txt 代码段 .data 数据段 .bss 未初始化的数据段 .rodata 只读数据段 例如: .global _start
_start: ldr r0,=0x12 @r0=0x12
4.位操作全局变量
.byte 定义单字节数据,比如byte 0x12 .short 定义双字节数据,比如.byte 0x1234。 .long 定义一个 4 字节数据,比如.long 0x12345678。 .equ 赋值语句,格式为:.equ 变量名,表达式,比如.equ num, 0x12,表示 num=0x12。 .align 数据字节对齐,比如:.align 4 表示 4 字节对齐。 .end 表示源文件结束。 .global 定义一个全局符号,格式为:.global symbol,比如:.global _start。
5.GNU汇编函数
函数名: 函数体 返回语句 例如:
/* 未定义中断 */
Undefined_Handler:
ldr r0, =Undefined_Handler
bx r0
/* SVC 中断 */
SVC_Handler:
ldr r0, =SVC_Handler
bx r0
/* 预取终止中断 */
PrefAbort_Handler:
ldr r0, =PrefAbort_Handler
bx r0
arm7常用汇编指令
1.数据传输
- 寄存器到寄存器
MOV R0,R1 - 寄存器到特殊寄存器
MRS R0,CPSR @特殊寄存器到寄存器 MSR CPSR,R0 - 立即数到寄存器
MOV R0,#0X12
2.存储器访问
CPU不能直接访问存储器,需要通过寄存器做桥梁
- LDR Rd, [Rn,#offset]
从存储器Rn+offset的位置读取数据存放到Rd中
- STR Rd,[Rn,#offset]
将Rd中的数据写入到存储器中的Rn+offset位置
@LDR
LDR R0,=0X0209C004
LDR R1,[R0]
@STR
LDR R0,=0X0209C004
LDR R1,=0X20000002
STR R1,[R0]
3.栈的出入
函数的调用和切换需要保存现场
- 将寄存器列表存入栈中
PUSH PUSH {R0~R3,R12} - 从栈中恢复寄存器列表
POP POP{R0~R3,R12} 替代以上的写法 STMFD LDMFD
STMFD SP!,{R0~R3,R12}
STMFD SP!,{LR}
LDMFD SP!.{LR}
LDMFD SP!,{R0~R3,R12}
4.跳转
- B
_start:
ldr sp,=0x80200000
b main
- BL指令
BL指令相比B指令,在跳转之前会在寄存器LR中保存当前PC寄存器值
push {r0,r1} @保存r0,r1
cps #0x13 @进入**SVC模式**,允许其他中断再次进去
bl system_irqhandler @加载c语言中断处理函数到r2寄存器中
cps #0x12 @进入**IRQ模式**
pop {r0,r1}
str r0,[r1,#0X10] @中断执行完成,写EOIR
5.算数运算
-
加法运算,指令为ADD ADD Rd,Rn,Rm Rd=Rn+Rm ADD Rd,Rn,#immed Rd=Rn+#immed -
带进位的加法运算,指令ADC ADC Rd,Rn,Rm Rd=Rn+Rm+进位 ADC Rd,Rn,#immed Rd=Rn+#immed+进位 -
减法SUB SUB Rd, Rn, Rm Rd = Rn – Rm SUB Rd, #immed Rd = Rd - #immed SUB Rd, Rn, #immed Rd = Rn - #immed -
带借位的减法SBC SBC Rd, Rn, #immed Rd = Rn - #immed – 借位 SBC Rd, Rn ,Rm Rd = Rn – Rm – 借位 -
乘法(32位)MUL MUL Rd, Rn, Rm Rd = Rn * Rm -
无符号除法UDIV UDIV Rd, Rn, Rm Rd = Rn / Rm -
有符号除法SDIV SDIV Rd, Rn, Rm Rd = Rn / Rm
6.逻辑运算
-
按位与 AND Rd, Rn Rd = Rd &Rn AND Rd, Rn, #immed Rd = Rn &#immed AND Rd, Rn, Rm Rd = Rn & Rm -
按位或 ORR Rd, Rn Rd = Rd | Rn ORR Rd, Rn, #immed Rd = Rn | #immed ORR Rd, Rn, Rm Rd = Rn | Rm -
位清除 BIC Rd, Rn Rd = Rd & (~Rn) BIC Rd, Rn, #immed Rd = Rn & (~#immed) BIC Rd, Rn , Rm Rd = Rn & (~Rm) -
按位或非 ORN Rd, Rn, #immed Rd = Rn | (w#immed) ORN Rd, Rn, Rm Rd = Rn | (wRm) -
按位异或 EOR Rd, Rn Rd = Rd ^ Rn EOR Rd, Rn, #immed Rd = Rn ^ #immed EOR Rd, Rn, Rm Rd = Rn ^ Rm
本人也是初学者,有一起学习的伙伴可以一起交流啊 !一下是我的联系方式: QQ 微信
|