Assembly 在ARM组件中按降序存储/加载寄存器

Assembly 在ARM组件中按降序存储/加载寄存器,assembly,arm,Assembly,Arm,假设我们有8个32位寄存器{r5-r12}包含任意值,而r0包含内存地址 我想将r12存储在[r0]中,r11存储在[r0,#4]中,…,r5存储在[r0,#28]中 在这种情况下,不可能使用指令stm,因为寄存器应按升序给出 这可以通过使用8str指令来完成,但我想知道是否可以做一些更有效的事情(在代码大小和时钟周期方面) 您可能希望至少对寄存器进行存储,存储的成本可能比移动寄存器更高,因此,一旦清除一对寄存器,例如写入r12和r11,然后写入mov r9和r10,然后写入STD或stm。如果

假设我们有8个32位寄存器
{r5-r12}
包含任意值,而
r0
包含内存地址

我想将
r12
存储在
[r0]
中,
r11
存储在
[r0,#4]
中,…,
r5
存储在
[r0,#28]

在这种情况下,不可能使用指令
stm
,因为寄存器应按升序给出


这可以通过使用8
str
指令来完成,但我想知道是否可以做一些更有效的事情(在代码大小和时钟周期方面)

您可能希望至少对寄存器进行存储,存储的成本可能比移动寄存器更高,因此,一旦清除一对寄存器,例如写入r12和r11,然后写入mov r9和r10,然后写入STD或stm。如果您的总线是32位宽,那么没有增益如果它是64位宽,那么您将节省时钟,这取决于核心。取回可能是一次4或8条指令的单个事务,因此开销最小。这是什么核心?你的内存路径是什么样子的,如果可能的话,试着改变前面的代码,使这些值以相反的顺序出现在r5到r12中。等等,stmdb呢?不,也许是strd,它能既递减又递增吗?我永远也记不起它是否交换了它们(寄存器中最大的数字出现在最低的地址中)。即使它不能执行strd r12、r0、#-8,您仍然可以单独执行减法运算,并且在上一个存储仍在进行时,它将快速执行。@old_timer
等等,stmdb呢?
:在这种情况下,它帮不上忙。编号最高的寄存器将存储在最高内存地址,编号最低的寄存器将存储在不依赖IA/DB模式的最低内存地址。是的,你可能想至少做两对寄存器,存储的成本可能比移动寄存器更高,因此,一旦清除了一对寄存器,例如写入r12和r11,然后是mov r9和r10,然后是STD或stm。如果您的总线是32位宽,那么没有增益如果它是64位宽,那么您将节省时钟,这取决于核心。取回可能是一次4或8条指令的单个事务,因此开销最小。这是什么核心?你的内存路径是什么样子的,如果可能的话,试着改变前面的代码,使这些值以相反的顺序出现在r5到r12中。等等,stmdb呢?不,也许是strd,它能既递减又递增吗?我永远也记不起它是否交换了它们(寄存器中最大的数字出现在最低的地址中)。即使它不能执行strd r12、r0、#-8,您仍然可以单独执行减法运算,并且在上一个存储仍在进行时,它将快速执行。@old_timer
等等,stmdb呢?
:在这种情况下,它帮不上忙。编号最高的寄存器将存储在最高内存地址,编号最低的寄存器将存储在最低内存地址,不依赖于IA/DB模式