• ARM寻址方式


    以ARM7TDMI为例,共9种寻址方式:
    1.立即数寻址:
    操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。
    例如以下指令:
    ADD R0,R0,#1;R0←R0+1
    ADD R0,R0,#0x3f;R0←R0+0x3f
    第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”。
    在32位指令编码中存放32位立即数的方法是:
    在ARM数据处理指令中,当参与操作的第二操作数为立即数型时,8位常数记作immed_8,4位的循环右移值记作rotate_imm,有效 的立即数是由一个8位的立即数循环右移偶数位得到。
    因此有效立即数immediate可以表示成:
    =immed_8循环右移(2×rotate_imm)
    2.寄存器寻址:
    寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。以下指令:
    ADD R0,R1,R2;R0←R1+R23.寄存器间接寻址:
    寄存器间接寻址:以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。
    LDR R0,[R1];R0←[R1]
    STR R0,[R1];[R1]←R04.基址变址寻址:
    基址变址寻址:将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。

    采用变址寻址方式的指令常见有以下几种形式,如下所示:
    前变址模式:
    LDR R0,[R1,#4];R0←[R1+4]
    自动变址模式:
    LDR R0,[R1,#4]!;R0←[R1+4]、R1←R1+4
    后变址模式:
    LDR R0,[R1] ,#4;R0←[R1]、R1←R1+45.多寄存器寻址:
    采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。
    LDMIA R0!,{R1,R2,R3,R4};R1←[R0]
    ;R2←[R0+4]
    ;R3←[R0+8]
    ;R4←[R0+12]
    该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。6.相对寻址
    与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,
    指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。
    以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:

    BL NEXT;跳转到子程序NEXT处执行
    ……
    NEXT
    ……
    MOV PC,LR ;从子程序返回7.堆栈寻址
    堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。满堆栈(Full Stack):当堆栈指针指向最后压入堆栈的数据时;
    空堆栈(Empty Stack):当堆栈指针指向下一个将要放入数据的空位置时;
    根据堆栈的生成方式,又可以分为递增堆栈和递减堆栈,
    递增堆栈(Ascending Stack) :当堆栈由低地址向高地址生成时;
    递减堆栈(Decending Stack) :当堆栈由高地址向低地址生成时;
    四种类型的堆栈工作方式,即:
    -满递增堆栈FA:堆栈指针指向最后压入的数据,且由低地址向高地址生成。-满递减堆栈FD:堆栈指针指向最后压入的数据,且由高地址向低地址生成。-空递增堆栈EA:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。

    -空递减堆栈ED:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
    8.块拷贝寻址
    STMIA R0!,{R1-R7}
    9.相对寻址
    有PC提供基值,指令中的地址码为偏移量
    BL SYBR1BEQ LOOPLOOP MOV R6, #1
    ...
    SUBR!....



  • 相关阅读:
    cf Round #764(Div. 3)
    查看w3wp.exe 进程
    CAML语法 Query写法
    InfoPaht 复选框
    性能工具MiniProfiler在Asp.Net WebForm跟踪EntityFramework
    CAML基础语法
    Moss 本机无法访问(转)
    STSADM 不是内部或外部命令
    spBodyOnLoadFunctionNames
    关于代码调用SSP获取UserProfile出错的解决方案(转)
  • 原文地址:https://www.cnblogs.com/feisky/p/1586457.html
Copyright © 2020-2023  润新知