我想知道如何从堆栈中POP
变量并将其存储在寄存器中。
例如:
asm(" MOV R5, #10");
asm ("MOV R6, #20");
asm("PUSH {R5,R6}");
我现在希望POP
离开堆栈的变量并将R6
的值存储在R5
中,反之亦然。
我搜索了ARM网站(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Babefbce.html)但我无法找到有价值的答案。
我希望有人可以帮助我。
编辑:
我认为这可以胜任:
asm("MOV R5, #10");
asm("MOV R6, #20");
asm("PUSH {R5,R6}");
asm("POP {R5,R6}");
但寄存器不会根据我的调试器而改变。
答案 0 :(得分:2)
您遇到的问题是,当在PUSH
或POP
中指定多个寄存器时,它们始终按数字顺序推送或弹出。它们在指令中指定的顺序无关紧要。强制以这种方式交换寄存器内容的唯一方法是分别在两个单独的指令中对两个寄存器执行一个操作(push或pop)。您需要查看PUSH
和POP
指令的文档,以确定处理多个寄存器时使用的默认顺序,然后使用两个单独的指令有意颠倒该顺序。
答案 1 :(得分:2)
push和pop都是伪指令。
它们在汇编时分别转换为stm和ldm,后缀取决于堆栈类型(完全降序是de-factor标准):
一个非常简单的规则适用:编号较低的寄存器从/向较低地址加载/存储值。
改变它的运作方式是不可能的。如果您想以不同于上述规则的顺序推送值,请在推送之前进行排序,或者按照您认为合适的顺序单独推送它们:
push {r6}
push {r5}
老实说,我认为没有任何理由这样做。如果你绝对需要这种“排序”,首先问问自己是否做错了。
答案 2 :(得分:0)
asm("MOVS R5, #10");
asm("MOVS R6, #20");
asm("PUSH {R5,R6}");
asm("POP {R6}");
asm("POP {R5}");
我现在已经解决了这个问题,我对此完全陌生,答案结果非常直截了当。 谢谢大家的时间。