现在的位置: 首页 > 综合 > 正文

ARM处理器 八种寻址方式

2018年04月11日 ⁄ 综合 ⁄ 共 1905字 ⁄ 字号 评论关闭

ARM处理器的八种寻址方式:

前言:1.什么是寻址?数据都存在存储器中,寻址简单地说就是找到存储数据或指令的地址。存储器有很多存储单元,用于存储数据。或者说,寻址就是读取数据所在储存装置中对应地址编号中存储的内容。以存储单位寻址分为位,字,节,字,双字寻址。以功能寻址分为直接寻址,间接寻址,寄存器寻址。寻址就是为运算和执行命令。
            2.什么是寻址方式?通常是指某一个CPU指令系统中规定的寻找操作数所在地址的方式,或者说通过什么的方式找到操作数。寻址方式的方便与快捷是衡量CPU性能的一个重要方面. 
1.立即数寻址:
        操作数在指令中,如: ADD R0,R0,#10   ---->R0 = R0 + 10
        特点:快,单周期;但受合法立即数的限制;
2.寄存器寻址:
        利用寄存器中的值作为操作数,如:ADD R0,R1,R2   ---->R0 = R 1 + R 2
        特点:也是单周期
3.寄存器移位寻址:
        寄存器中的值移位后得到操作数,用到桶形移位器
            介绍一下桶形移位器:
                            LSL:(逻辑左移),相当于无符号数x2;
                            ASR: (算术右移),相当于带符号的数除2;
                            LSR: (逻辑右移),相当于无符号数除2;
                            ROR:(循环右移),相当于位轮换;
                            RRX:(带扩展的循环右移),位轮换,从CF到MSB都参与(这一项谁比较懂的帮忙解释一下)
            如:ADD  R0,R1,R2,LSL #2    -------->R0 = R1 + R2<<2;
4.寄存器间接寻址:
        寄存器中的值作为操作数的地址,操作数本身放在存储器中;
        如:LDR   R0,【R1】   ---->R0 = 【R1】,取出R1存的地址中的值,赋给R0;
5.基址变址寻址:
        基址寄存器的内容与指令中的偏移量相加,得到有效操作数的地址,然后访问该地址空间;
        分三种:
        1)、前索引:
                如:LDR  R0,【R1,#4】  --->R1存的地址+4,访问新地址里面的值,放到R0;
        2)、自动索引:
                如:LDR  R0, 【R1,#4】!  --->在前索引的基础上,新地址回写进R1;
                            注:!表示回写地址
        3)、后索引:
                如:LDR  R0  【R1】,#4  --->R1存的地址的内容写进R0,R1存的地址+4再写进R1;
6.多寄存器寻址:
        一条指令完成多个寄存器的传送,最多16个寄存器;
        如:STMxx  R0!,{R1-R5}
                                            注:xx是IDAB的任意组合:I-增;D-减;A-后;B-先;
        执行这类指令要考虑如下几个问题:
                1)、基址寄存器指向原始地址有没有放一个有效值?
                2)、寄存器列表哪个寄存器被最先传送?
                3)、存储器地址增长方向?
                4)、指令执行完成后,基址寄存器有没有指向一个有效值?
        如:STMia  R0!,{R1-R5} 的答案分别是:有;R1;低-高;没有。
        为什么要考虑这么多,因为涉及到数据还原的问题;
                如:STMib   r0!,[r1-r5]
                        LDMda  r0! , [r1-r5]             ------还原
7.相对寻址:
        pc当前值位基址,指令中值为偏移量,相加作为操作数的地址;
        如  B/BL    不过有范围限制 pc+-32Mbytes
8.堆栈寻址:
        先进先出的原则;
            如:STMxx  SP! (r0 - r12)   ---  xx是FEAD的任意组合,不过规定只用fd;
            4中堆栈方式:F-满;E-空;A-后;B-先;
            如:入栈:STMfd  SP!,(r0-r12)
                    出栈:LDMfd SP! ,(r0-r12)

抱歉!评论已关闭.