【问题标题】:Data alignment in store instruction存储指令中的数据对齐
【发布时间】:2013-04-25 12:15:21
【问题描述】:

在 ARM 汇编中,我有跨寄存器 r3 - r9 的数据。我想使用stm 指令将它们存储回内存,该指令从我在r0 中的地址开始

指令stm r0,{r3-r9} 会将寄存器中的数据彼此相邻放置。 但我想要的是在存储的值之间有 16 字节的间隙,例如执行以下操作:

str r3,[r0]
str r4,[r0,#16]
str r5,[r0,#32]
str r6,[r0,#48] 
...

stm 指令可以做到这一点还是有一些捷径?

【问题讨论】:

  • STM 指令允许您指定目标地址应该向下还是向上增长,但不能指定步幅应该是多少(它将是寄存器的大小,即一个字)。因此,您可能不得不使用一些替代解决方案,例如您自己建议的解决方案。
  • 谢谢您的评论.. 那么也许有一些技巧而不是 8 个 STR?
  • 这对于 NEON 和交错加载和回写是可行的。 (好吧,虽然 7 个寄存器是个坏数字。)

标签: assembly arm


【解决方案1】:

STM 指令lets you specify whether the destination address should grow downwards or upwards,但不是步幅应该是什么(它将是寄存器的大小,即一个字)。因此,您可能不得不使用一些替代解决方案,例如您自己建议的解决方案。

例如:

str r3,[r0]
str r4,[r0,#16]
str r5,[r0,#32]
....

; Slightly simpler since it's obvious that the stores are spaced 16 bytes apart,
; altough it doesn't preserve the original value of r0 like the above version
str r3,[r0],#16
str r4,[r0],#16
str r5,[r0],#16
....

【讨论】:

  • 第一个 form 限制为 4k 或 256 个条目(16 字节跨度)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
相关资源
最近更新 更多