这些说明的结果是什么? (有关如何通过运行我的代码自行回答这些建议的任何建议吗?)
STR.W R8, [R3], #4
STR.W R8, [R3], #4
STR.W R8, [R3], #4
STR.W R8, [R3], #4
STR.W R8, [R3], #4
STR.W R8, [R3], #4
STR.W R8, [R3]
我知道每条指令都会将R3的值加载到R8中,然后将值增加4到R3,但我感到困惑的是,在这些指令结束时,R8中包含的值是什么?
是[R3 + 16]吗?或者是[R3 + 4],[R3 + 8],......,[R3 + 16]?
答案 0 :(得分:6)
STR.W R8, [R3], #4
该指令将r8
中保存的32位值存储到r3
中保存的地址。然后,它会立即将值4
添加到r3
。
A8.6.195 STR (register)
Store Register (register) calculates an address from a base register value
and an offset register value, stores a word from a register to memory. The
offset register value can optionally be shifted. For information about memory
accesses see Memory accesses on page A8-13.
Encoding T2 ARMv6T2, ARMv7
STR<c>.W <Rt>,[<Rn>,<Rm>{,LSL #<imm2>}]
STR<c><q> <Rt>, [<Rn>], <Rm>{, <shift>} Post-indexed: index==FALSE, wback==TRUE
答案 1 :(得分:0)
R8中包含的值是什么?
总是相同的值,你没有改变它。您始终要更改R3指向的内存值。
查看代码:
STR.W R8, [R3], #4 /* *r3 ← r8 then r3 ← r3 + 4 */
正如ARM文档所说:
STR {type} {cond} Rt,[Rn],#offset;后索引
另一件事是:
STR.W R8, [R3, +#4] /* *r3 ← r8 + 4 */
STR {type} {cond} Rt,[Rn {,#offset}];立即抵消
最后:
STR.W R8, [R3, #4]! /* r3 ← r3 + 4 then *R3 ← R8 */
STR {type} {cond} Rt,[Rn,#offset]! ;预索引
我希望你对此抱有疑问。
问候。