概述
1.两种不同风格的ARM汇编指令:
一种是ARM官方的汇编风格,该风格的指令一般用大写字母表示,在Windows中的IDE开发环境经常用到,如:LDR R0,[R1]。另一种风格是GNU风格的汇编,指令一般采用小写字符,在Linux中常见,如:ldr r0,[r1]。
2.关于内存和寄存器在CPU操作时的一些差别:
RISC架构的CPU不能直接操作内存,它可以直接操作寄存器,所以它需要先将内存中的内容加载到CPU的通用寄存器中,才可以被CPU处理。RISC架构的CPU通过ldr和str两个指令实现CPU和内存的数据交互。ldr是将内存内容加载到通用寄存器中,str是将寄存器内容存入内存中。
3.ARM汇编的8种寻址方式:
寄存器寻址:mov r1,r2 将r2中的数据拷贝到r1中
立即数寻址: mov r0,#0xff00 将立即数0xff00存入r0中
寄存器移位寻址:mov r0,r1,lsl#3 将r1的值左移3位后赋给r0
寄存器间接寻址:ldr r1,[r2] 将r2的值作为地址,取出该地址的值赋给r1
基址变址寻址:ldr r1,[r2,#4] 将r2的值加上4后的值作为地址,取出该地址的值赋给r1
多寄存器寻址:ldmia r1!,{r2-r7,r12} 将r1的值赋给r2,将r1+4地址的值赋给r3------------
堆栈寻址:stmfd sp!,{r2-r7,lr} 使用满减栈的方式将sp的连续地址的值依次赋给r2-r7,sp赋给r2,sp-4给r3以此类推
相对寻址:lb test1 调用test1函数。以当前的PC地址为基地址,向前向后偏移N个地址,然后去执行,
4.ARM常用的指令后缀
b(byte) 功能不变,操作长度为8位
h(half word)功能不变,操作长度为16位
s(signed)功能不变,操作数变为有符号数
s(s标志)功能不变,影响CPSR条件标志位,大部分的指令默认不会影响CPSR位,除非使用s标志,如:mov r0,#0和movs r0,#0 后者就可以影响CPSR位的变化
5.ARM的条件执行后缀(ARM特有)
EQ:Z=1执行 NE:Z=0执行 CS/HS:C=1执行 CC/LO:C=0执行
MI:N=1执行 PL:N=0执行 VS:V=1执行 VC:V=0执行
HI:C=1,Z=0执行 LS:C=1,Z=0执行 GE:N=V执行 LT:N!=V执行
GT:Z=0,N=V执行 LE:Z=1.N!=V执行 AL 任意 NV 从不执行
含义:EQ相等、NE不相等、CS无符号数大于或等于、CC无符号数小于、MI负数、PL正数或零、VS溢出、VC未溢出、HI无符号大于、LS无符号小于、GE有符号大于等于、LT有符号小于、GT有符号小于、LE有符号小于等于、AL无条件执行。
6.ARM的流水线
S5PV210拥有13级流水线,ARM有分支预测的功能,准确率在60%以上,它可以根据预测事先将指令读取到流水线上,这样极大的提高了CPU的处理效率。流水线比较忌讳代码随意跳转,因为这样会导致预先加载到流水线上的指令失效,再重新预测加载新的指令。
7.ARM常用的数据处理指令
数据传输指令:mov,mvn。这两个指令均用作寄存器间的数据传递,mvn会在赋值前对数据进行取反操作。
算数指令(默认不影响CPSR位):add r0,r1,r2(r0=r1+r2)、sub r0,r1,r2(r0=r1-r2)、rsb r0,r1,r2(r0=r2-r1)
adc r0,r1,r2(r0=r1+r2+c位)、sbc r0,r1,r2(r0=r1-r2-~c位)、rsc r0,r1,r2(r0=r2-r2-~c位)
逻辑指令:and与、orr或、eor亦或,bic位清零
比较指令:cmp(是否相等)、cmn r1,r2(r1是否等于-r2?)、tst(测试指定位是否为0)、teq(对两个数异或操作,判断是否相等)、
乘法指令:mvl、mla、umall、umlal、smull、smlal
零计数指令:clz
8.ARM常用的PSR(cpsr/spsr)访问指令
mrs/msr
mrs用来读取PSR,msr用来写PSR
PSR只能使用专用指令访问
9.ARM常用的跳转指令
b/bl/bx
b:直接跳转
bl:跳转前将返回地址放入lr中,以便返回(函数调用)
bx:跳转同时切换到ARM模式,一般用于异常处理的跳转
10.ARM常用内存访问指令
ldr/str ldm/stm swp
ldr/str 单字,半字,字节访问
ldm/stm 多字批量访问
swp寄存器与存储器内容互换
11.ARM中的立即数
立即数分为合法立即数和非法立即数,32位指令总线中除了指令标记和操作标记外,本身可以附带的立即数位数很少,因此立即数被分为合法立即数与非法立即数。
合法立即数的定义:经过任意位数的移位后剩下的非零部分可以用8位表示
12.ARM中的软中断指令
swi软中断主要用于操作系统中的使用
13.协处理器CP15操作指令
mcr用于写入cp15中的寄存器
mrc用于读取cp15中的寄存器
协处理器主要和mmu,cache,tlb等处理有关
在功能上和操作系统的虚拟地址映射cache管理有关
14.ARM中的4中栈
空栈:栈指针永远指向一个空的栈区,可以先写入再移动栈指针
满栈:栈指针永远指向已使用的最后一个栈区,写入时需要先移位再写入
增栈:栈指针向地址增加处移动
减栈:栈指针向地址减小处移动
15.ARM指令的8种后缀
基于块复制: ia每次传输后地址+4 ib地址先+4再传输 da传输完成后地址-4 db地址先-4再进行传输
基于堆栈操作:fd满减栈 ed空减栈 fa满增栈 ea空增栈
16.多寄存器的访问指令
ldr/str每周期只能访问4字节内存
stm/ldm可以用在批量读取写入内存时使用
stmia sp,{r0-r12} sp=r0,sp+4=r1,sp+8=r3……
17.关于 !以及^的作用
ldmia r0,{r2-r3} ldmia r0!,{r2-r3}前者操作完成后r0地址不变,而后者地址变为r0+8
ldmfd sp!,{r0-r6,pc}^ "^"的作用在目标寄存器中有pc时会自动将spsr写入cpsr
最后
以上就是自然大米为你收集整理的ARM汇编指令的全部内容,希望文章能够帮你解决ARM汇编指令所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复