ARM指令:
1.几种简单的和重要的伪指令
1.AREA:定义一个段,代码段 code、数据段data、自己定义的段
2.CODE32/CODE16:指令类型32位arm,16位thumb。(不指定,默认为32位arm)
3.ENTRY:程序入口
4.EXPORT/IMPORT:export声明一个符号可以被其他文件引用,import在当前文件引用一个其他文件声明的符号(类似于C语言中的exstern)。
5.EQU:常量定义,相当于C语言中的#define
6.label:所有顶格写的为标号(只有label可以顶格写),标号就是地址,相当于C语言中的函数名
7.DCD:连续分配一个字的内存单元(从一个label分配)
8.DCB:分配一个字节的内存单元
9.END:源程序结尾(一个源文件必须有一个END,END之后不能再出现汇编文件)
2.程序执行过程
1.预处理-----生成 (.i)文件
2.编译---检查语法---生成 (.s)汇编源文件
3.汇编---由汇编指令助记符翻译成 (.o)二进制文件
4.链接---将代码中的0x。。。地址填入
3.MDK的启动代码:最主要的目的为CPU分配各种模式下的堆栈SP
4.调试 F10 和F11
5.条件执行及标志位
1.CMP 更新NZCV的C位。。。。
2.数据处理指令(mov、sub等)默认不影响条件标志位,但可以选择通过添加“s”来影响标志位。
3.所有可能的条件代码
4.mov r2,r1,lsl #2 执行这段代码,必须考虑一下7步。。。
0.作什么操作 (操作码)
1.目的寄存器
2.源操作数是什么(立即数,寄存器移位获得的数)
3.源操作数寄存器
4.移位数
5.移位的形式(方向)
6.是否影响标志 (带S)
5.分支指令
1.B {<cond>} label 跳转到指令B限制在当前指令的正负32Mb的范围内
6.数据处理指令
7.逻辑运算的真值表
1.异或(EOR) 相异为1,相同为0
2.或
8.位清除 BIC R0,R0,#9 干掉R0中 与#9,0000 1001 中 1 对应的位。
9.桶型移位器
1.算数右移(ASR),相当于带符号位的除法
10.立即数 以#号开头的数
1.判断一个合法的立即数的方法
①正好占用一个连续的合法字节 例如:0x100000f
②正好连续的3个半字节,如果超过3个半字节,不是立即数
0x1fe0000------1fe 0001 1111 1110 前后2个有效字间的个数为<=8 ,但(最低2位半字节)最后两位不是00,所以不是立即数
11.装载非法立即数
1.LDR rd, = 0xfffffe0e ldr r0,[PC] offset 4095
ldr不受合法立即数的限制,缺点[PC,$offset]offset有范围 正负4095
6.乘法
7.单寄存器传送指令
什么是寻址方式:??
根据指令中给出地址码字段来实现寻找真实的操作数地址的方式
8.ARM处理器寻址方式(8种寻址方式)
1.立即数寻址 mov r0,#1 速度最快的操作方式
2.寄存器寻址 mov r0,r1
3.寄存器移位寻址 mov r1,r2,lsl #2
4.寄存器间接寻址 ldr r0,[r1] 数据从 存储器到寄存器
str r0,[r1] 数据从 寄存器到存储器
5.基址变址寻址(提供3种方式)
①前索引 LDR R0,[R1,#4] 其中的R1为基址寄存器
STR R0,[R1, #4] 将R0的值存到新的地址中
②自动索引 LDR R0,[R1,#4]! “!”表示要回写,更新基址寄存器的值
STR R0,[R1, #4] ! 回写,新的地址回写到基址寄存器中
③后索引 LDR R0,[R1],#4取R1地址中的值,存到R0中,然后回写R1
STR R0,[R1], #4
6.多寄存器寻址 LDMIA R1!{R2-R7,R12}将R1单元中的数据读出到R2-R7,R12中,R1 自动加1,回写
LDMIB
LDMDA
LDMDB PC先减
使用时:STDIB和LDMIA(STDda和LDMib)是配对使用的
7.相对寻址
8.堆栈寻址
1.满增栈FA 满是栈顶指针
2.满减栈FD 满是栈顶指针
3.空增栈EA
4.空减栈ED
例如:stmfd sp!,{r1-r5}
ldmfd sp!,{r1-r5} 堆栈,入栈退栈的尾缀方式相同
9.存储器块拷贝
10.堆栈
11.SWP指令(存储器的一次读和写的原子操作,通常用于信号量)
在寄存器和存储器之间,由一次存储器读和一次存储器写组成的原子操作。
SWP R0,R1,[R2] 读出R2地址中的值放到R0中,同时R1写入R2;
12.SWI(软件中断)
通过软件中断号区分一些系统调用的函数(从而决定采用何种操作)。。。。。。
13.PSR传送指令
MRS/MSR允许传送CPSR/SPSR中的内容
MRS {<>} rd,<psr> 读<psr>中的内容
MSR{<cond>} rd,<psr> 写<psr>中的内容 (主要作用可以分位域访问)
14.协处理器指令
ATPCS标准。。。ARM公司推出的的一个标准,当函数传参时,func(r1,r2,r3, r4)多余的参数要放到堆中。。。