我有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}
相同。
答案 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),而不管它们在代码中写入的顺序如何。