在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