这些ARM汇编指令的含义是什么?

时间:2014-03-25 17:12:42

标签: assembly arm

这些说明的结果是什么? (有关如何通过运行我的代码自行回答这些建议的任何建议吗?)

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]?

2 个答案:

答案 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]! ;预索引

我希望你对此抱有疑问。

问候。