我是靠谱客的博主 自然大米,最近开发中收集的这篇文章主要介绍ARM汇编指令,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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汇编指令所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部