程序集多次推送不考虑推送列表顺序

时间:2016-11-28 12:17:06

标签: assembly stack arm

我有3个参数,我将它们存储在三个不同的寄存器中,比如R1,R8和R9。我发现,一旦多次推送完成PUSH {r1,r8 ... etc},我在内存中找到的内容与写PUSH {r9,r8,R1}时完全相同。

值确实不同,R9保持1000,r1和r8均低于50.为什么他们没有按照我在指令中写的顺序推送?

确实,即使我接受r8,r9,r1的顺序,它也会再次将它们存储在堆栈中,如r9,r8,r1从下到上。

我认为PUSH {r1,r8,r9}不会与PUSH {r9,r8,r1}相同。

1 个答案:

答案 0 :(得分:7)

你没有说你正在使用什么处理器,但程序集看起来像某种描述的ARM。

如说明ARM - Push

中所述
  

PUSH和POP是STMDB和LDM(或LDMIA)的同义词,带有基址寄存器sp(r13),   并将调整后的地址写回基址寄存器。在这些情况下,PUSH和POP是首选的助记符。   寄存器按数字顺序存储在堆栈中,最低编号的寄存器位于最低地址

如果出于某种原因,您确实需要在堆栈中按特定顺序存储内容,则必须使用多个指令。

为什么是案件问题。正如Peter Cordes在评论中所说,这是由于寄存器列表被存储为指令中的位域。从ARM ARM(ARM体系结构参考手册)中可以看出LDM / STM指令的编码是

Bit 31 -- 28 27 26 25 24 23 22 21 20 19 -- 16 15 -------- 0
     COND     1  0  0  P  U  S  W  L    Rn      Registers

由此可以清楚地看到,存储r0,r8和r9将设置位0,8和9(指令的低16位为0x0301),而不管它们在代码中写入的顺序如何。