wordpress 多站点主题,网站 建设制作菜鸟教程,高密做网站哪家好代理,网上销售型企业网站一. Load/Store 指令
1. 前变址
前变址指令是在读取或存储数据时#xff0c;先根据基址寄存器#xff08;Rn#xff09;与偏移量#xff08;offset#xff09;计算出有效地址#xff0c;再进行数据操作。相关指令及示例如下#xff1a; LDR R0, [R1, #4]#xff1a;从…一. Load/Store 指令
1. 前变址
前变址指令是在读取或存储数据时先根据基址寄存器Rn与偏移量offset计算出有效地址再进行数据操作。相关指令及示例如下 LDR R0, [R1, #4]从地址R1 4处读取一个字32 位到R0。假设R1 0x10000000指令执行后R0 0x88776655R1的值保持为0x10000000 。 LDRB R2, [R1, #4]从地址R1 4处读取一个字节8 位到R2高位补零扩展为 32 位。执行后R2 0x00000055R1的值不变。 LDRH R3, [R1, #4]从地址R1 4处读取一个半字16 位到R3高位补零扩展为 32 位。执行后R3 0x00006655R1的值不变。 LDRSB R4, [R1, #7]从地址R1 7处读取一个字节执行符号扩展成 32 位后存入R4。执行后R4 0xFFFFFFFF88R1的值不变。
前变址指令详细说明如下 指令 功能描述 LDRB Rd, [Rn, offset] 从地址Rn offset处读取一个字节到Rd LDRH Rd, [Rn, offset] 从地址Rn offset处读取一个半字到Rd LDR Rd, [Rn, offset] 从地址Rn offset处读取一个字到Rd LDRD Rd1, Rd2, [Rn, offset] 从地址Rn offset处读取一个双字64 位整数到Rd1低 32 位和Rd2高 32 位中 STRB Rd, [Rn, offset] 把Rd中的低字节存储到地址Rn offset处 STRH Rd, [Rn, offset] 把Rd中的低半字存储到地址Rn offset处 STR Rd, [Rn, offset] 把Rd中的低字存储到地址Rn offset处 STRD Rd1, Rd2, [Rn, offset] 把Rd1低 32 位和Rd2高 32 位表达的双字存储到地址Rn offset处 LDRSB Rd, [Rn, offset] LDRSH Rd, [Rn, offset] 字节 / 半字的自动变址加载并且在加载后执行符号扩展成 32 位
2.自动变址
自动变址指令在完成数据操作后会自动对基址寄存器进行调整。
以 LDR.W R0, [R1, #20]! 为例执行步骤如下 先计算R1 R1 20 。 然后将计算后的地址R1中的数据读取到R0 。
自动变址指令详细说明如下 指令 功能描述 LDR.W Rd, [Rn, offset]! LDRB.W Rd, [Rn, offset]! LDRH.W Rd, [Rn, offset]! LDRD.W Rd1, Rd2, [Rn, offset]! 字 / 字节 / 半字 / 双字的自动变址加载不做带符号扩展没有用到的高位全部置 0 LDRSB.W Rd, [Rn, offset]! LDRSH.W Rd, [Rn, offset]! 字节 / 半字的自动变址加载并且在加载后执行符号扩展成 32 位整数 STR.W Rd, [Rn, offset]! STRB.W Rd, [Rn, offset]! STRH.W Rd, [Rn, offset]! STRD.W Rd1, Rd2, [Rn, offset]! 字 / 字节 / 半字 / 双字的自动变址存储
3.后变址
后变址指令先以基址寄存器Rn的当前值进行数据操作然后再对基址寄存器进行调整。
以STR.W R0, [R1], #-12为例执行步骤如下 先将R0的数据存储到地址R1处。 然后计算R1 R1 (-12) 。
后变址指令详细说明如下 指令 功能描述 LDR.W Rd, [Rn], offset LDRB.W Rd, [Rn], offset LDRH.W Rd, [Rn], offset LDRD.W Rd1, Rd2, [Rn], offset 字 / 字节 / 半字 / 双字的带后索引加载不做带符号扩展没有用到的高位全清 0 LDRSB.W Rd, [Rn], offset 字节 / 半字的带后索引加载并且在加载后执行符号扩展成 32 位整数 STR.W Rd, [Rn], offset STRB.W Rd, [Rn], offset STRH.W Rd, [Rn], offset STRD.W Rd1, Rd2, [Rn], offset 字 / 字节 / 半字 / 双字的带后索引存储
后变址应用举例 LDR R0, [R1], #4假设R1 0x10000000先从地址R1即0x10000000处读取一个字到R0R0 0x44332211然后R1 R1 4 0x10000004 。 LDRB R2, [R1], #4从地址R1此时R1 0x10000004处读取一个字节到R2R2 0x00000011接着R1 R1 4 0x10000004 。 LDRH R3, [R1], #4从地址R10x10000004处读取一个半字到R3R3 0x00002211之后R1 R1 4 0x10000004 。 LDRSB R4, [R1], #7从地址R10x10000004处读取一个字节并符号扩展到 32 位存入R4R4 0x00000011最后R1 R1 7 0x10000007 。
Load/Store 指令综合举例字序调整 假设内存地址0x1000处存储的值为0x12345678ABCDEF00执行以下指令 LDR R2, 0x1000将地址0x1000加载到R2 。 LDRD.W R0, R1, [R2]从地址R2即0x1000处读取一个双字R0 0xABCDEF00R1 0x12345678 。 STRD.W R1, R0, [R2]把R1低 32 位和R0高 32 位存储到地址R20x1000处此时(0x1000) 0xABCDEF0012345678 。
二. 批量数据传送指令
1. 批量数据 Load/Store 指令
这些指令用于在内存与多个寄存器之间批量传输数据Rd后面的!表示在每次访问前Before或访问后After要自增Increment或自减Decrement基址寄存器Rd的值增 / 减单位为 1 个字4 字节。具体指令如下 指令 功能描述 LDMIA Rd!, {寄存器列表} 从Rd处读取多个字每读一个字后Rd自增一次16 位宽度 STMIAR Rd, {寄存器列表} 存储多个字到Rd处每存一个字后Rd自增一次16 位宽度 LDMIA.W Rd!, {寄存器列表} 从Rd处读取多个字每读一个字后Rd自增一次32 位宽度 LDMDB.W Rd!, {寄存器列表} 从Rd处读取多个字每读一个字前Rd自减一次32 位宽度 STMIA.W Rd!, {寄存器列表} 存储多个字到Rd处每存一个字后Rd自增一次32 位宽度 STMDB.W Rd!, {寄存器列表} 存储多个字到Rd处每存一个字前Rd自减一次32 位宽度 例如当R8 0x8000时 STMIA.W R8!, {R0 - R3}每存储一次R8的值增加 4 字节先存储R0 - R3的值然后R8自增。执行后R8值变为0x8010 。 STMDB.W R8!, {R0 - R3}每存储一次R8的值减少 4 字节先自减R8然后存储R0 - R3的值。执行后R8值变为0x7FF0 。
2.堆栈传送类指令 STMDB SP!, [R0 - R3, LR]等效于PUSH {R0 - R3, LR}将寄存器R0 - R3和链接寄存器LR的值压入堆栈堆栈指针SP在存储前递减。 LDMIIA SP!, {R0 - R3, PC}等效于POP {R0 - R3, PC}从堆栈中弹出数据到寄存器R0 - R3和程序计数器PC堆栈指针SP在读取后递增。