精华内容
下载资源
问答
  • ARM的寻址方式

    千次阅读 2016-07-27 11:32:31
    目前ARM处理器支持9种寻址方式,分别是立即数寻址、寄存器寻址、寄存器偏移寻址、寄存器间接寻址、基址变址寻址、多寄存器寻址、相对寻址、堆栈寻址和块拷贝寻址。 1. 立即数寻址 也叫立即寻址,是一种特殊寻址...

    ARM寻址方式

    所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式

    ARM处理器的寻址方式

    目前ARM处理器支持9种寻址方式,分别是立即数寻址寄存器寻址寄存器偏移寻址寄存器间接寻址基址变址寻址多寄存器寻址相对寻址堆栈寻址块拷贝寻址

    1. 立即数寻址

    也叫立即寻址,是一种特殊的寻址方式,操作数本身包含在指令中,只要取出指令也就取到了操作数。这个操作数叫做立即数,对应的寻址方式叫做立即寻址。例如:

    MOV R0,#64     ;R0  ← 64

    ADD R0, R0, #1  ;  R0   ← R0 + 1

    SUB R0, R0, #0X3D  ;  R0   ← R0 – 0X3D

    在立即数寻址中,要求立即数以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0X”或“&”或”0x“。

    在ARM处理器中,立即数必须对应8位位图格式,即立即数是一个在16位或32位的寄存器中的8bit常数,经循环移动偶数位得到。合法的立即数必须能够找到得到它的那个常数,否则这个立即数就是非法的。

    例如:0X80是合法的,它可以通过0X80向左或向右移动0位得到,由于8位的常数都可以由其自身移动0位得到,因此8位的立即数都是合法的

    0X03F8也是合法的,把它写成二进制形式为:0011 1111 1000,可以看出如果使用0XFE这个8位的常数在16位寄存器中循环左移2位就可以得到0X03F8。

    判断一个立即数是否合法可以用以下的办法:即对于这个立即数进行循左移或右移操作,看看经过移动偶数位后,是否可以得到一个不大于0XFF的立即数(即不超过8位的立即数),如果可以得到,这个立即数就是合法的,否则就是非法的。象0X1010、0X1FA、0X1FF都是不合法的。

    2. 寄存器寻址

    寄存器寻址就是利用寄存器中的数值作为操作数,也称为寄存器直接寻址

    例如:ADD R0,R1, R2         ;R0  ← R1 + R2

    该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。

    这种寻址方式是各类微处理器经常采用的一种方式,也是执行效率较高的寻址方式。

    3. 寄存器间接寻址

    寄存器间接寻址就是把寄存器中的值作为地址,再通过这个地址去取得操作数,操作数本身存放在存储器中

    例如:

    LDR R0,[R1]

    ;R0 ←[R1],以寄存器R1的值作为操作数的地址,把取得操作数传送到R0中

    ADD R0,R1,[R2]

    ;R0 ←R1 + [R2],以寄存器R2的值作为操作数的地址,取得操作数后与R1相加,结果存入寄存器R0中。

    4. 寄存器偏移寻址

    这是ARM指令集特有的寻址方式,它是在寄存器寻址得到操作数后再进行移位操作,得到最终的操作数。

    例如:

    MOV R0,R2,LSL  #3   ;R0 ← R2 * 8 ,R2的值左移3位,结果赋给R0。

    MOV R0,R2,LSL  R1 ;R2的值左移R1位,结果放入R0。

    可采用的移位操作如下:

    LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0。

    LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0。

    ASL:算术左移(Arithmetic Shift Left),和逻辑左移LSL相同。

    ASR:算术右移(Arithmetic Shift Right),移位过程中符号位不变,即如果源操作数是正数,则字的高端空出的位补0,否则补1。

    ROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位。

    RRX:带扩展的循环右移(Rotate Right eXtended),操作数右移一位,高端空出的位用进位标志C的值来填充,低端移出的位填入进位标志位。

    5. 寄存器基址变址寻址

    寄存器基址变址寻址又称为基址变址寻址,它是在寄存器间接寻址的基础上扩展来的。它将寄存器(该寄存器一般称作基址寄存器)中的值与指令中给出的地址偏移量相加,从而得到一个地址,通过这个地址取得操作数

    例如:

    LDR R0,[R1,#4]

    ;R0 ←[R1 + 4],将R1的内容加上4形成操作数的地址,取得的操作数存入寄存器R0中。

    LDR R0,[R1,#4]

    ;R0 ←[R1 + 4]、R1 ←R1 + 4,将R1的内容加上4形成操作数的地址,取得的操作数存入寄存器R0中,然后,R1的内容自增4个字节。其中!表示指令执行完毕把最后的数据地址写到R1

    LDR R0,[R1,R2]

    ;R0 ←[R1 + R2],将寄存器R1的内容加上寄存器R2的内容形成操作数的地址,取得的操作数存入寄存器R0中。

    STR R0, [R1,#-4]

    ;R0→[R1 -4],将R1中的数值减4作为地址,把R0中的数据存放到这个地址中。

    LDR R0,[R1],#4    ;R0 ←[R1]、R1 ←R1+4

     

    6. 多寄存器寻址

    这种寻址方式可以一次完成多个寄存器值的传送。例如:

    LDMIA  R0,{R1,R2,R3,R4}

    LDM:Load Data from Memory to Register.

    ;R1←[R0],R2←[R0+4],R3←[R0+8],R4←[R0+12]

    该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。

    LDMIA  R0,{R1-R4}  ;功能同上。

    使用多寄存器寻址指令时,寄存器子集的顺序如果由小到大的顺序排列,可以使用“-”连接,否则,用“,”分隔书写。

    7. 相对寻址

    相对寻址是一种特殊的基址寻址,特殊性是它把程序计数器PC中的当前值作为基地址,语句中的地址标号作为偏移量,将两者相加之后得到操作数的地址。

    BL   NEXT  ;相对寻址,跳转到NEXT处执行。

    ……

    ……

    NEXT

    ……

     

    8. 堆栈寻址

    堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用堆栈指针(Stack Pointer, SP)指示当前的操作位置,堆栈指针总是指向栈顶。

    根据堆栈的生成方式不同,可以把堆栈分为递增堆栈和递减堆栈两种类型。如下图所示:

    l  递增堆栈:向堆栈写入数据时,堆栈由低地址向高地址生长。

    l  递减堆栈:向堆栈写入数据时,堆栈由高地址向低地址生长。

    同时,根据堆栈指针(SP)指向的位置,又可以把堆栈分为满堆栈(Full Stack)和空堆栈(Empty Stack)两种类型。

    l  满堆栈(Full Stack):堆栈指针指向最后压入堆栈的数据。满堆栈在向堆栈存放数据时的操作是先移动SP指针,然后存放数据。在从堆栈取数据时,先取出数据,随后移动SP指针。这样保证了SP一直指向有效的数据。

    l  空堆栈(Empty Stack):堆栈指针SP指向下一个将要放入数据的空位置。空堆栈在向堆栈存放数据时的操作是先放数据,然后移动SP指针。在从堆栈取数据时,是先移动指针,再取数据。这种操作方式保证了堆栈指针一直指向一个空地址(没有有效数据的地址)。

    上述两种堆栈类型的组合,可以得到四种基本的堆栈类型,即:

    • 满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生长。
    • 满递减堆栈(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生长。
    • 空递增堆栈(EA):堆栈指针指向下一个将要压入数据的地址,且由低地址向高地址生长。
    • 空递减堆栈(ED):堆栈指针指向下一个将要压入数据的地址,且由高地址向低地址生长。

    堆栈寻址举例如下:

    STMFD  SP,{R1-R7, LR}

    STM: Store Data From register to Stack (Memory).

    ;将R1-R7, LR压入堆栈。满递减堆栈。

    LDMED  SP,{R1-R7, LR}

    ;将堆栈中的数据取回到R1-R7, LR寄存器。空递减堆栈。

     

    9. 块拷贝寻址

    块拷贝寻址用于寄存器数据的批量复制,它实现从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器传送数据。块拷贝寻址与堆栈寻址有所类似。两者的区别在于:堆栈寻址中数据的存取是面向堆栈的,块拷贝寻址中数据的存取是面向寄存器指向的存储单元的

    在块拷贝寻址方式中,基址寄存器传送一个数据后有4种增长方式,即:

    1. IA:每次传送后地址增加4;(Increment After Operating)
    2. IB:每次传送前的地址增加4;(Increment Before Operating)
    3. DA:每次传送后地址减少4;(Decrement After Operating)
    4. DB:每次传送前地址减少4。(Decrement Before Operating)

    对于32位的ARM指令,每次地址的增加和减少的单位都是4 个字节单位。

    例如:

    STMIA  R0!,{R1—R7}

    ;将R1-R7的数据保存到R0指向的存储器中,存储器指针在保存第一个值之后增加4,向上增长。R0作为基址寄存器。

    STMIB  R0!,{R1—R7}

    ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前增加4,向上增长。R0作为基址寄存器。

    STMDA  R0!,{R1—R7}

    ;将R1-R7的数据保存到R0指向的存储器中,存储器指针在保存第一个值之后减少4,向下减少。R0作为基址寄存器。

    STMDB  R0!,{R1—R7}

    ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前减少4,向下减少。R0作为基址寄存器。

     

    ARM指令中{!},为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。

    基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。

    {^}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

     

    LDMIA  R0,{R1,R2,R3,R4}

    与LDM IA  R0,{R1,R2,R3,R4}的区别?

    前一条指令,执行完毕之后,R0的值保持不变;后一条指令执行完毕之后,R0的值发生了变化。

    展开全文
  • ARM寻址方式

    2015-08-05 15:39:15
    目前ARM处理器支持9种寻址方式,分别是立即数寻址、寄存器寻址、寄存器偏移寻址、寄存器间接寻址、基址变址寻址、多寄存器寻址、相对寻址、堆栈寻址和块拷贝寻址。 1. 立即数寻址 也叫立即寻址,是一种...

    所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式


    ARM处理器的寻址方式

    目前ARM处理器支持9种寻址方式,分别是立即数寻址寄存器寻址寄存器偏移寻址寄存器间接寻址基址变址寻址多寄存器寻址相对寻址堆栈寻址块拷贝寻址


    1. 立即数寻址


    也叫立即寻址,是一种特殊的寻址方式,操作数本身包含在指令中,只要取出指令也就取到了操作数。这个操作数叫做立即数,对应的寻址方式叫做立即寻址。

    例如:

    MOV R0,#64     ;R0  ← 64

    ADD R0, R0, #1  ;  R0   ← R0 + 1

    SUB R0, R0, #0X3D  ;  R0   ← R0 – 0X3D

    在立即数寻址中,要求立即数以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0X”或“&”或”0x“。

    在ARM处理器中,立即数必须对应8位位图格式,即立即数是一个在16位或32位的寄存器中的8bit常数,经循环移动偶数位得到。合法的立即数必须能够找到得到它的那个常数,否则这个立即数就是非法的。

    例如:0X80是合法的,它可以通过0X80向左或向右移动0位得到,由于8位的常数都可以由其自身移动0位得到,因此8位的立即数都是合法的

    0X03F8也是合法的,把它写成二进制形式为:0011 1111 1000,可以看出如果使用0XFE这个8位的常数在16位寄存器中循环左移2位就可以得到0X03F8。

    判断一个立即数是否合法可以用以下的办法:即对于这个立即数进行循左移或右移操作,看看经过移动偶数位后,是否可以得到一个不大于0XFF的立即数(即不超过8位的立即数),如果可以得到,这个立即数就是合法的,否则就是非法的。象0X1010、0X1FA、0X1FF都是不合法的。


    2. 寄存器寻址


    寄存器寻址就是利用寄存器中的数值作为操作数,也称为寄存器直接寻址

    例如:ADD R0,R1, R2         ;R0  ← R1 + R2

    该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。

    这种寻址方式是各类微处理器经常采用的一种方式,也是执行效率较高的寻址方式。


    3. 寄存器间接寻址


    寄存器间接寻址就是把寄存器中的值作为地址,再通过这个地址去取得操作数,操作数本身存放在存储器中

    例如:

    LDR R0,[R1]

    ;R0 ←[R1],以寄存器R1的值作为操作数的地址,把取得操作数传送到R0中

    ADD R0,R1,[R2]

    ;R0 ←R1 + [R2],以寄存器R2的值作为操作数的地址,取得操作数后与R1相加,结果存入寄存器R0中。


    4. 寄存器偏移寻址


    这是ARM指令集特有的寻址方式,它是在寄存器寻址得到操作数后再进行移位操作,得到最终的操作数。

    例如:

    MOV R0,R2,LSL  #3   ;R0 ← R2 * 8 ,R2的值左移3位,结果赋给R0。

    MOV R0,R2,LSL  R1 ;R2的值左移R1位,结果放入R0。

    可采用的移位操作如下:

    LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0。

    LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0。

    ASL:算术左移(Arithmetic Shift Left),和逻辑左移LSL相同。

    ASR:算术右移(Arithmetic Shift Right),移位过程中符号位不变,即如果源操作数是正数,则字的高端空出的位补0,否则补1。

    ROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位。

    RRX:带扩展的循环右移(Rotate Right eXtended),操作数右移一位,高端空出的位用进位标志C的值来填充,低端移出的位填入进位标志位。


    5. 寄存器基址变址寻址


    寄存器基址变址寻址又称为基址变址寻址,它是在寄存器间接寻址的基础上扩展来的。它将寄存器(该寄存器一般称作基址寄存器)中的值与指令中给出的地址偏移量相加,从而得到一个地址,通过这个地址取得操作数

    例如:

    LDR R0,[R1,#4]

    ;R0 ←[R1 + 4],将R1的内容加上4形成操作数的地址,取得的操作数存入寄存器R0中。

    LDR R0,[R1,#4]

    ;R0 ←[R1 + 4]、R1 ←R1 + 4,将R1的内容加上4形成操作数的地址,取得的操作数存入寄存器R0中,然后,R1的内容自增4个字节。其中!表示指令执行完毕把最后的数据地址写到R1

    LDR R0,[R1,R2]

    ;R0 ←[R1 + R2],将寄存器R1的内容加上寄存器R2的内容形成操作数的地址,取得的操作数存入寄存器R0中。

    STR R0, [R1,#-4]

    ;R0→[R1 -4],将R1中的数值减4作为地址,把R0中的数据存放到这个地址中。

    LDR R0,[R1],#4    ;R0 ←[R1]、R1 ←R1+4

     

    6. 多寄存器寻址


    这种寻址方式可以一次完成多个寄存器值的传送。例如:

    LDMIA  R0,{R1,R2,R3,R4}

    LDM:Load Data from Memory to Register.   ;R1←[R0],R2←[R0+4],R3←[R0+8],R4←[R0+12]

    该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。

    LDMIA  R0,{R1-R4}  ;功能同上。

    使用多寄存器寻址指令时,寄存器子集的顺序如果由小到大的顺序排列,可以使用“-”连接,否则,用“,”分隔书写。


    7. 相对寻址


    相对寻址是一种特殊的基址寻址,特殊性是它把程序计数器PC中的当前值作为基地址,语句中的地址标号作为偏移量,将两者相加之后得到操作数的地址。

    BL   NEXT  ;相对寻址,跳转到NEXT处执行。

    ……

    ……

    NEXT

    ……

     

    8. 堆栈寻址


    堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用堆栈指针(Stack Pointer, SP)指示当前的操作位置,堆栈指针总是指向栈顶。

    根据堆栈的生成方式不同,可以把堆栈分为递增堆栈和递减堆栈两种类型。如下图所示:

    递增堆栈:向堆栈写入数据时,堆栈由低地址向高地址生长。

    递减堆栈:向堆栈写入数据时,堆栈由高地址向低地址生长。

    同时,根据堆栈指针(SP)指向的位置,又可以把堆栈分为满堆栈(Full Stack)和空堆栈(Empty Stack)两种类型。

    满堆栈(Full Stack):堆栈指针指向最后压入堆栈的数据。满堆栈在向堆栈存放数据时的操作是先移动SP指针,然后存放数据。在从堆栈取数据时,先取出数据,随后移动SP指针。这样保证了SP一直指向有效的数据。

    空堆栈(Empty Stack):堆栈指针SP指向下一个将要放入数据的空位置。空堆栈在向堆栈存放数据时的操作是先放数据,然后移动SP指针。在从堆栈取数据时,是先移动指针,再取数据。这种操作方式保证了堆栈指针一直指向一个空地址(没有有效数据的地址)。


    上述两种堆栈类型的组合,可以得到四种基本的堆栈类型,即:

    • 满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生长。
    • 满递减堆栈(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生长。
    • 空递增堆栈(EA):堆栈指针指向下一个将要压入数据的地址,且由低地址向高地址生长。
    • 空递减堆栈(ED):堆栈指针指向下一个将要压入数据的地址,且由高地址向低地址生长。

    堆栈寻址举例如下:

    STMFD  SP,{R1-R7, LR}

    STM: Store Data From register to Stack (Memory).

    ;将R1-R7, LR压入堆栈。满递减堆栈。

    LDMED  SP,{R1-R7, LR}

    ;将堆栈中的数据取回到R1-R7, LR寄存器。空递减堆栈。

     

    9. 块拷贝寻址


    块拷贝寻址用于寄存器数据的批量复制,它实现从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器传送数据。块拷贝寻址与堆栈寻址有所类似。两者的区别在于:堆栈寻址中数据的存取是面向堆栈的,块拷贝寻址中数据的存取是面向寄存器指向的存储单元的

    在块拷贝寻址方式中,基址寄存器传送一个数据后有4种增长方式,即:

    1. IA:每次传送后地址增加4;(Increment After Operating)
    2. IB:每次传送前的地址增加4;(Increment Before Operating)
    3. DA:每次传送后地址减少4;(Decrement After Operating)
    4. DB:每次传送前地址减少4。(Decrement Before Operating)

    对于32位的ARM指令,每次地址的增加和减少的单位都是4 个字节单位。


    例如:

    STMIA  R0!,{R1—R7}

    ;将R1-R7的数据保存到R0指向的存储器中,存储器指针在保存第一个值之后增加4,向上增长。R0作为基址寄存器。

    STMIB  R0!,{R1—R7}

    ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前增加4,向上增长。R0作为基址寄存器。

    STMDA  R0!,{R1—R7}

    ;将R1-R7的数据保存到R0指向的存储器中,存储器指针在保存第一个值之后减少4,向下减少。R0作为基址寄存器。

    STMDB  R0!,{R1—R7}

    ;将R1-R7的数据保存到存储器中,存储器指针在保存第一个值之前减少4,向下减少。R0作为基址寄存器。

     

    ARM指令中{!},为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。

    基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。

    {^}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

     

    LDMIA  R0,{R1,R2,R3,R4}

    与LDM IA  R0,{R1,R2,R3,R4}的区别?

    前一条指令,执行完毕之后,R0的值保持不变;后一条指令执行完毕之后,R0的值发生了变化。


    展开全文
  • ARM九种寻址方式

    2020-03-23 20:40:26
    寻址方式就是CPU根据指令中的地址信息,找出物理地址也就是内存地址的方式,通俗理解就是ARM指出内存地址的方式。 寻址的目的就是找出操作数,比如ARM要做一个除法运算,就需要除数和被除数,除数和被除数都是除法...

    寻址方式就是CPU根据指令中的地址信息,找出物理地址也就是内存地址的方式,通俗理解就是ARM指出内存地址的方式。

    寻址的目的就是找出操作数,比如ARM要做一个除法运算,就需要除数和被除数,除数和被除数都是除法指令的操作数,要找到这些操作数,可以有多种方法,寻找操作数的过程就叫做寻址。(我个人理解)

    ARM支持九种寻址方式:

    • 立即数寻址
    • 寄存器寻址
    • 寄存器偏移寻址
    • 寄存器间接寻址
    • 寄存器基址变址寻址
    • 多寄存器寻址
    • 相对寻址
    • 堆栈寻址
    • 块拷贝寻址

    1.立即数寻址

    立即数寻址就是直接将内存中的数据发给CPU作为操作数。注意,由于ARM是32位指令集,所以立即数的范围不可以超出0255,也就是说立即数的范围只能是0255。

    格式:就是在立即数前面加上 # 来作为操作数

    典型的例子就是直接对寄存器进行写值:

    ldr r0, #254   ;将254写入r0寄存器
    add r1, r2, #3 ;将r2寄存器中的值与3相加后,在写入r1寄存器
    

    2.寄存器寻址

    寄存器寻址就是直接将寄存器中的数值作为操作数:

    ldr r1, r0      ;将r0寄存器中的值写到r0
    add r3, r2, r1  ;将r1、r2寄存器的值相加,结果写入r3寄存器
    

    3.寄存器间接寻址

    还是利用了寄存器,只不过操作数不是寄存器中的值了,操作数在内存中,那怎么办?没事,操作数的地址就在寄存器中。所以寄存器间接寻址相当于以寄存器中的值作为内存地址,去内存中寻找操作数。

    格式:在提供操作数地址的寄存器上加上[],比如[r0]

    mov r0, #0X54000032
    ldr r1, [r0]           ;将地址为0X54000032的数据写入r1寄存器中
    

    4.寄存器偏移寻址

    以寄存器寻址为本,将寄存器中的数移位后作为操作数。

    一共有6中移位操作:

    LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0。

    LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0。

    ASL:算术左移(Arithmetic Shift Left),和逻辑左移LSL相同。

    ASR:算术右移(Arithmetic Shift Right),移位过程中符号位不变,即如果源操作数是正数,则字的高端空出的位补0,否则补1。

    ROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位。

    RRX:带扩展的循环右移(Rotate Right eXtended),操作数右移一位,高端空出的位用进位标志C的值来填充,低端移出的位填入进位标志位。

    格式:rx, 移位命令 移位操作数

    ldr r0, r1, lsl #3   ;将r1的值逻辑左移3位后写入r0
    ldr r0, r1, ror r2   ;将r1的值循环右移r2中的值对应位后,写入r0
    

    5.寄存器基址变址寻址

    基址变址寻址是基于寄存器间接寻址的,只不过地址不再是寄存器中的值了,而是偏移后的值,这里的偏移值可以理解为地址相加值。

    加上感叹号应该有优先执行的意思吧(个人理解)

    格式:[rx, n],表示在rx寄存器所指向的地址上,再偏移(相加)n字节

    ldr r0, [r1, #3]     ;地址为:r1值+3字节,指令执行完r1不变
    ldr r0, [r1, #3]!    ;地址为:r1值+3字节,指令执行完r1+3
    ldr r0, [r1, #-1]    ;地址为:r1值-1字节,指令执行完r1不变
    ldr r0, [r1, r2]     ;地址为:r1值+r2值
    ldr r0, [r1], #4     ;地址为:r1值,但指令执行完后,r1值+4字节
    

    6.批量寄存器寻址

    批量寄存器寻址就是使用一个大括号{}包含多个寄存器

    ldmia r0, {r1, r2, r3, r4}     ;将r1,r2,r3,r4中的数据依次放入R0指向的内存地址,r0+4指向的内存地址...
    ldmia r0, {r1-r4}             ;同上。
    

    7.相对寻址

    通过标号进行寻址,经常与跳转指令相配合使用

    	bl heihei 
    
    heihei:        ;跳转到heihei执行
    

    8.堆栈寻址

    堆栈即Stack,因为CPU的寄存器总是及其有限的,很多时候我们不得不使用内存来存储数据,比如进行多级跳转的时候,这时候堆栈就是一个很好的工具,每次跳转就将当前函数的返回地址存储到内存,最底层被调用的子函数会最先返回,就先将压入栈的现场返回,以此类推…,ARM使用SP(R13)作为栈指针,ARM设计的内存栈模型有2×2=4种

    按照栈在内存增长的方向分为递增栈递减栈

    递增(Increase) 堆栈:向堆栈写入数据时,堆栈由低地址向高地址生长。

    递减(Descend) 堆栈:向堆栈写入数据时,堆栈由高地址向低地址生长。

    根据堆栈指针SP指向的位置,又可以把堆栈分为满堆栈空堆栈两种。

    满堆栈(Full Stack):SP始终指向栈顶元素,压栈的时候先移动SP,再将数据放入SP指向的地址。

    空堆栈(Empty Stack):SP始终指向下一个将要放入元素的位置,压栈时先将数据放入SP指向的地址,再移动SP

    最后,可以得到4种基本的堆栈类型:

    满增栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生长。

    满减栈(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生长。常用这种

    空增栈(EA):堆栈指针指向下一个将要压入数据的地址,且由低地址向高地址生长。

    空减栈(ED):堆栈指针指向下一个将要压入数据的地址,且由高地址向低地址生长。

    stmfd sp!, {r1-r7, lr}  ;将r1到r7和lr的数据压入fd栈
    

    9.块拷贝寻址

    块拷贝寻址提供了一块内存和一组寄存器之间的拷贝,按照内存使用方式的不同,可以分为2×2=4种。地址增方向/地址减方向×先偏移/后偏移。堆栈寻址就可以看作是块拷贝寻址的的一个实例。

    即:

    IB:Increment Before Operating

    IA:Increment After Operating

    DB:Decrement Before Operating

    DA:Decrement After Operating

    STMIA  R0!,{R1—R7}  ;将R1-R7的寄存器中的值放入R0指向的地址,R0自动更新,指向操作后的地址
    

    参考

    展开全文
  • 文章目录2.1 8086/8088寄存器组cpu寄存器标志寄存器2.2 存储分段和地址形成存储单元地址和内容存储器分段物理地址的形成段寄存器的引用8086/8088的寻址方式立即寻址方式寄存器寻址方式直接寻址方式寄存器间接...

    2.1 8086/8088寄存器组

    cpu寄存器

    • 通用寄存器
      • 数据寄存器
        • AX
          • AH
          • AL
        • BX
          • BH
          • BL
        • CX
          • CH
          • CL
        • DX
          • DH
          • DL
      • 指针寄存器
        • SP
        • BP
      • 变址寄存器
        • SI
        • DI
    • 控制寄存器
      • IP
      • FLAG
    • 段寄存器
      • CS
      • DS
      • SS
      • ES

    标志寄存器

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    OF DF IF TF SF ZF AF PF CF

    运算结果标识

    • 进位标志(CF) : 用于反映运算是否产生进位或借位
    • 零标志(ZF):用于反映运算结果是否为零
    • 符号标志(SF): 用于反映运算的符号位
    • 溢出标志(OF): 用于反映加减法是否产生溢出
    • 奇偶标志 (PF): 用于反映运算结果中1的个数是否为1
    • 辅助进位标示(AF): 用于反映半字节向高字节是否进位或借位
    • 方向标识(DF): 决定字符串操作的方向
    • 中断允许标识(IF): 决定CPU是否允许响应外部中断
    • 追踪标示(TF): 决定cpu是否进入单步模式

    2.2 存储分段和地址的形成

    存储单元的地址和内容

    8086或8088系统中以字节为单位线性组织存储器

    存储器的分段

    因为8086或8088有20根地址线,所以可以直接寻址1M(2^20)的空间,但是由于寄存器只有16位,所以通过对1M的空间进行逻辑分段来实现寻址1M的能力。

    物理地址的形成

    物理地址= 段值*16 + 偏移

    段寄存器的引用

    访问存储器的方式 正常使用的寄存器 可选寄存器 偏移
    取指令 CS IP
    堆栈操作 SS SP
    一般数据存取 DS CS、ES、SS 有效地址
    源数据串 DS CS、ES、SS SI
    目的数据串 ES DI
    BP作为指针寄存器使用 SS CS、DS、ES 有效地址

    8086/8088的寻址方式

    立即寻址方式

    操作数包含在指令中
    MOV AX, 1234h

    寄存器寻址方式

    操作数在cpu内部寄存器中
    MOV SI,AX

    直接寻址方式

    操作数存放在存储器中,指令直接包含操作数的有效地址
    MOV ES:[5678H], BL

    寄存器间接寻址

    操作数在存储器中,操作数有效地址时SI、DI、BX、BP四个存储器之一
    MOV AX,[SI]

    寄存器相对寻址

    操作数在存储器中,操作数的有效地址时一个基址寄存器(BX、BP)或变址寄存器(SI,DI)加上一个偏移
    MOV AX, [DI+1234h]

    基址加变址寻址

    操作数在存储器中,操作数的有效地址是基址寄存器之一加上变址寄存器之一
    MOV AX, [BX+DI]

    相对基址加变址寻址

    操作数在寄存器,操作数有效地址是基址寄存器加上变址寄存器再加上偏移
    MOV AX, [BX+DI-2]

    8086/8088指令系统

    指令集说明

    • 分组

      • 数据传送
      • 算数运算
      • 逻辑运算
      • 串操作
      • 程序控制
      • 处理器控制
    • 指令格式
      [标号:] 指令助记符 [操作数1 [,操作数2]] [:注释]

    数据传送指令

    • 传送指令
    MOV DST,SRC
    
    规则:
    1、源和目的不能同时是段寄存器
    2、代码段寄存器不能作为目的
    3、指令指针IP不能作为源也不能作为目的
    
    
    • 交换指令
    XCHG OPRD1, OPRD2
    
    规则:
    1、不能同时是存储单元
    2、不能有立即数
    3、不能有段寄存器
    
    • 地址传送指令
    1、LEA (Load Effective Address)
    LEA REG, OPRD
    
    说明:将OPRD的有效地址存放到REG
    
    2、 LDS (Load pointer into DS)
    LDS REG, OPRD
    
    说明: 将OPRD的段值存放到DS,将偏移存放到REG
    
    3、 LES (Load pointer into ES)
    LES REG, OPRD
    
    说明:将OPRD的段值存放到ES,将偏移存放到REG
    

    堆栈操作指令

    1、进栈指令
    PUSH SRC
    
    2、出栈指令
    POP DST
    
    

    标志操作指令

    1、LAHF (Load AH with Flags)
    
    说明: 将标志寄存器的低8位存入AH
    
    2、SAHF (Store AH into Flags)
    
    说明: 将AH存入标志寄存器的低8位
    
    3、PUSHF
    
    说明: 将标志寄存器入栈
    
    4、 POPF
    
    说明: 将栈顶元素写入标志寄存器
    
    5、CLC (CLear Carry flag)
    
    说明: 清空进位标志
    
    6、STC (SeT Carry flag)
    
    说明: 设置进位标志
    
    7、CMC (CoMplement Carry flag)
    
    说明: 对进位标志取反
    
    8、CLD 
    
    说明:清空方向标志
    
    9、STD 
    
    说明: 设置方向标志
    
    10、CLI
    
    说明:情况中断标志
    
    11、STI
    设置中断标识
    
    

    加减法运算指令

    1、ADD
    ADD OPRD1, OPRD2
    
    说明:加法
    
    2、ADC
    ADC OPRD1, OPRD2
    
    说明: 带进位的加法
    
    3、SUB
    SUB OPRD1, OPRD2
    
    说明: 减法
    
    4、SBB
    SBB OPRD1, OPRD2
    
    说明: 带借位的减法
    
    5、DEC
    DEC OPRD
    
    说明:减一
    
    6、NEG
    NEG OPRD
    
    说明:对OPRD取补
    
    7、CMP
    CMP OPRD1, OPRD2
    
    说明:OPRD1-OPRD2 将影响标志存入标志寄存器
    
    

    乘除法运算指令

    1、MUL
    MUL OPRD
    
    2、IMUL
    IMUL OPRD
    
    3、DIV
    DIV OPRD
    
    4、IDIV
    IDIV OPRD
    
    5、CBW
    CBW 
    
    说明: 将AL寄存器的符号位扩展到AH
    
    6、CWD
    CWD
    
    说明:将AX寄存器的符号位扩展到DX
    
    

    逻辑运算和移位指令

    1、NOT
    NOT OPRD
    
    说明:对OPRD取反并将结果存放到OPRD,不影响标志寄存器
    
    2、AND 
    AND OPRD1, OPRD2
    
    说明:对OPRD1,OPRD2进行逻辑与运算,并将结果存入OPRD1,并影响标志寄存器
    
    3、OR
    OR OPRD1, OPRD2
    
    说明:对OPRD1,OPRD2进行逻辑或运算,并将结果存入OPRD1,影响标志寄存器
    
    4、 XOR
    XOR OPRD1,OPRD2
    
    说明:对OPRD1,OPRD2进行逻辑异或运算,并将结果存入OPRD1, 影响标志位
    
    5、TEST
    TEST OPRD1, OPRD2
    
    说明:类似AND,只影响标志位
    
    6、SAL
    SAL OPRD, m
    
    说明:对OPRD左移m位
    
    7、SHL
    SHL OPRD, m
    
    说明:对OPRD左移m位
    
    8、SAR
    SAR OPRD, m
    
    说明:对OPRD右移m位符号位保持bub
    
    9、SHR
    SHR OPRD, m
    
    说明:对OPRD右移m位,左边补0
    
    10、ROL
    ROL OPRD,m
    
    说明:循环左移
    
    11、ROR
    ROR OPRD,m
    
    说明:循环右移
    
    12、RCL
    RCL OPRD,m
    
    说明:带进位循环左移
    
    13、RCR
    RCR OPRD,m
    
    说明:带进位循环右移
    

    转移指令

    1、JMP 
    JMP 标号
    
    2、LOOP
    LOOP 标号
    
    3、LOOPE
    LOOPE 标号
    
    4、LOOPNE
    LOOPNE 标号
    
    5、JCXZ
    JCXZ 标号
    
    
    展开全文
  • arm 寻址方式

    2015-03-05 18:53:40
    目前ARM处理器支持9种寻址方式,分别是立即数寻址、寄存器寻址、寄存器偏移寻址、寄存器间接寻址、基址变址寻址、多寄存器寻址、相对寻址、堆栈寻址和块拷贝寻址。 1. 立即数寻址 也叫立即寻址,是一种特殊...
  • 汇编-ARM寻址方式

    2013-06-27 21:44:57
    目前ARM处理器支持9种寻址方式,分别是立即数寻址、寄存器寻址、寄存器偏移寻址、寄存器间接寻址、基址变址寻址、多寄存器寻址、相对寻址、堆栈寻址和块拷贝寻址。 1. 立即数寻址 也叫立即寻址,是一种特殊...
  • 微机原理 寻址方式

    2020-11-08 10:23:32
    文章目录1、立即寻址2、直接寻址3、寄存器寻址4、寄存器间接寻址5、寄存器相对寻址6、基址-变址寻址7、相对基址-变址寻址 有效地址:EA=基址+(变址×比例因子)+位移量EA=基址+(变址×比例因子)+位移量EA=基址+...
  • ARM中常用寻址方式

    千次阅读 2012-12-14 14:06:41
    目前ARM处理器支持9种寻址方式,分别是立即数寻址、寄存器寻址、寄存器偏移寻址、寄存器间接寻址、基址变址寻址、多寄存器寻址、相对寻址、堆栈寻址和块拷贝寻址。 1. 立即数寻址 也叫立即寻址,是一种特殊...
  • 汇编语言七种寻址方式 ...有效地址存放在代码段的指令操作码之后,但操作数本身在存储器中,所以必须先求出操作数的物理地址。这种寻址方式常用于存取简单变量。 MOV AL, [78H] 4.相对寻址 目标地址=PC
  • 在下列指令中,源操作数使用DS段寄存器进行寄存器相对寻址的有( )。 A.MOV AX,[DI+4] B.MOV AX,ES:[SI+8] C.MOV AX,[BP+4] D.MOV AX,[BX+4] 4.在下列指令中,源操作数的寻址方式是错误的有( )...
  • 段基址由段寄存器值左移4位表示,段内偏移则记录了相对于某个段起始位置的偏移量,将这两个值相加就得到了所需的物理地址。 在保护模式下,相对来说其寻址方式就比较复杂了。嗯,本次先不讨论分页的问题,我们主要把...
  • 80x86寻址方式概括总结

    千次阅读 2013-01-10 19:19:32
    书上总共讲了十种寻址方式,这十种寻址方式,从第一种到第十种,其有效地址的计算复杂度逐渐增加。...段地址是分配给段的物理地址,是某一段地址的开始地址,存储在DS等段寄存器中,而基址和变址都是相对
  • 书上总共讲了十种寻址方式,这十种寻址方式,从第一种到第十种,其有效地址的计算复杂度逐渐增加。...段地址是分配给段的物理地址,是某一段地址的开始地址,存储在DS等段寄存器中,而基址和变址都是相对
  • 杨1-2

    2014-04-28 21:00:16
    寄存器相对寻址方式中,基址或变址寄存器名一定要放到方括号中,而位移可不写在方括号中。 下面两条指令源操作数寻址方式是相同,表示形式等价: mov ax, [si + 3] mov ax, 3[si] 对于基址加变址寻址...
  • 保护模式之段式存储机制综述: 谈到保护模式,其实都是与实模式相对而言的。总的来说,32位的cpu有两种工作模式:实模式与保护模式。当我们开机后,开始cpu是工作在实模式下的,经过...它的物理地址由段地址和偏移量
  • 3. 在8086中,逻辑地址、偏移地址、物理地址分别指是什么?具体说明。 4. 什么是硬件中断和软件中断?在PC机中两者处理过程有什么不同? 六、综合应用题(每题10分,共20 分) 现有16K×1位动态...
  • 8086/8088汇编语言程序设计教程

    热门讨论 2008-10-22 22:52:54
    2.3.5 寄存器相对寻址方式 2.3.6 基址加变址寻址方式 2.3.7 相对基址加变址寻址方式 2.4 8086/8088指令系统 2.4.1 指令集说明 2.4.2 数据传送指令 2.4.3 堆栈操作指令 2.4.4 标志操作指令 2.4.5 加减运算指令 2.4.6 ...
  • 寄存器存放段地址,与偏移地址共同形成存储器的物理地址。IP的内容为下一条将要执行指令的偏移地址,与CS共同形成下一条指令的物理地址。 5. 8086对存储器的管理为什么采用分段的办法? 答:8086是一个16位的结构...
  • (3) 用寄存器BX和偏移量0BF2H的寄存器相对寻址方式把存储器中一个字和 (CX) 相加并把结果送回存储器中。 (4) 用偏移量为0524H直接寻址方式把存储器中一个字与数2A59H相加,并把结果送回该存储单元中。 (5) 把...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

寄存器相对寻址的物理地址