我有 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}
相同。
最佳答案
你没有说你使用的是什么处理器,但程序集看起来像某种描述的 ARM。
正如描述中提到的 ARM - Push
如果由于某种原因确实需要在堆栈上以特定顺序存储东西,则必须使用多个指令。
对于为什么是这样的问题。正如 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),而不管它们在代码中的编写顺序如何。
关于组装多次推送不考虑推送列表顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40844118/