arm中的指令、伪指令、伪操作、寄存器名,可以全大写(全小写)但是不能混写
label:instruction@comment
标号:
指令@注释
add:
MOVS R0,#0X12@设置R0=0X12
.txt 代码段
.data 数据段
.bss 未初始化的数据段
.rodata 只读数据段
例如:
.global _start
_start:
ldr r0,=0x12 @r0=0x12
.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。
函数名:
函数体
返回语句
例如:
/* 未定义中断 */ 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
CPU不能直接访问存储器,需要通过寄存器做桥梁
@LDR LDR R0,=0X0209C004 LDR R1,[R0] @STR LDR R0,=0X0209C004 LDR R1,=0X20000002 STR R1,[R0]
函数的调用和切换需要保存现场
PUSH {R0~R3,R12}
POP{R0~R3,R12}
STMFD SP!,{R0~R3,R12} STMFD SP!,{LR} LDMFD SP!.{LR} LDMFD SP!,{R0~R3,R12}
_start: ldr sp,=0x80200000 b main
push {r0,r1} @保存r0,r1 cps #0x13 @进入**SVC模式**,允许其他中断再次进去 bl system_irqhandler @加载c语言中断处理函数到r2寄存器中 cps #0x12 @进入**IRQ模式** pop {r0,r1} str r0,[r1,#0X10] @中断执行完成,写EOIR
加法运算,指令为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
按位与
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
微信