ARM 汇编程序的框架结构
.section .data
<初始化的数据>
.section.bss
<未初始化的数据>
.section .text
.global _start
_start:
<汇编代码>
注意: 一般是将上面结构进行简化
.text
.global _start
_start:
<汇编代码>
寄存器操作指令:
算术和逻辑指令:
MOV :用于将一个寄存器或被移位寄存器或一个立即数移动到目的寄存器
MOV r1 ,#8 (注意:#+数,表示一个十进制数,#+0b数,表示一个二进制数,#+0x数,表示一个十六进制数)
MVN :对源操作数取反再赋值给目的寄存器
MOV R1,#8
SUB : 将一个数减去另外一个数再存放如寄存器
SUB R1,#8,#6(8-6)
ADD:将一个数加上另外一个数后将其存放如寄存器中
ADD R1,R2,R3
AND :逻辑与
AND R1,R2,#0
BIC:位清除
BIC R1,R2,#0B1101
将R2中所与#b1101中1所对应的位清零后的结果保存在R1中
比较指令:
CMP:顾名思义,用于比较两个数的大小,比较的结果不过会放在哪个通用寄存器中而是改在程序状态寄存器中的一个标志状态位
CMP R1,#0B111010
TST:测试位,将两个数按位与
TST R1,R2
分枝指令:
B:条件跳转指令
B [条件] 标号 (注意 :中括号在编写程序时不需要写出)
BL :带连接的返回(类似于C语言中的子函数调用,调用子函数后返回主函数)
移位指令:
LSL:算术左移位
MOV R1,R1,LSL#2(将R1中的数据左移两位存入R1)
ROR:循环右移
MOV R1,R1,#ROR 2(将R1中的数据循环右移后存入R1中)
程序状态字访问指令:
上面所学指令都不能对计算机中的程序状态字中的指令进行访问和读写,所以需要专用计算机指令来将程序状态字中的数据读写到通用寄存器中,在进行修改后写入
MRS :将程序状态字中的数据搬出来
MRS R0,CPRS
MSR:将数据搬回程序状态字中
MSR CPRS, R0
存储器操作指令:
LDR :将内存中的值导出到通用寄存器中
LDR R0 ,#0XFF ‘
STR:将同用寄存器中的数据写回到内存中
STR R0 ,#0XFF
伪指令:
定义类伪指令:(1:编译时起作用2:起作用但是转化为其他机器指令)
.global 表明一个全局的符号 (注意GNU伪指令的特点在前面加上一个“.”)
.data 定义一个数据段
.ascii 定义字符串的数据
.byte 定义一个字节的数据
.word 定义一个字的数据
.data
.equ (类似于C语言中定义宏)
.align 用于字节对齐
操作类伪指令:
nop:空操作指令 \
具体实现:mov r0 ,r0
ldr:用于将一个大于八位的数据装入寄存器
注意:ldr r0 ,=0x1ff
这里后面是用的等号这里和其他地方有些不一样
协处理指令:(最重要是就是CP15)
作用:系统控制
mcr:
mrc:
mrc p15,0, r0 ,c0,c0,0
注意:蓝色部分是由芯片手册的cp15寄存器访问列表给出的以访问不同寄存器 。红色部分是内核内部通用寄存器