在ARM汇编中,我有跨越寄存器r3 - r9
的数据。我想用stm
指令从我在r0
存储指令中的数据对齐
指令stm r0,{r3-r9}
会把数据从寄存器旁边对方的地址开始将它们存储回内存。 但我要的是有存储的值之间的16个字节的空白,e.g做这样的事情:
str r3,[r0]
str r4,[r0,#16]
str r5,[r0,#32]
str r6,[r0,#48]
...
这可能与stm
指令或者是有一些捷径把戏?
在ARM汇编中,我有跨越寄存器r3 - r9
的数据。我想用stm
指令从我在r0
存储指令中的数据对齐
指令stm r0,{r3-r9}
会把数据从寄存器旁边对方的地址开始将它们存储回内存。 但我要的是有存储的值之间的16个字节的空白,e.g做这样的事情:
str r3,[r0]
str r4,[r0,#16]
str r5,[r0,#32]
str r6,[r0,#48]
...
这可能与stm
指令或者是有一些捷径把戏?
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
....
第一个*形式*限于** 4k **或256个条目,用于16个字节的步幅。 – 2013-04-25 22:35:36
的'STM'指令让你指定目标地址是否应该向下或向上增长,但没有步幅应该是什么(它会是一个寄存器的大小,即一个字)。所以你可能需要使用一些你自己建议的解决方案。 – Michael 2013-04-25 12:30:54
Thaks的评论..然后也许有一些技巧,而不是8 STRs? – NumberFour 2013-04-25 12:40:49
这对NEON和交错加载和回写是可行的。 (好吧,7个寄存器虽然是一个坏数字。) – 2013-04-25 12:43:20