ARM程序集,POP堆栈和存储在寄存器中

时间:2013-11-23 11:11:32

标签: assembly arm

我想知道如何从堆栈中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}");

但寄存器不会根据我的调试器而改变。

3 个答案:

答案 0 :(得分:2)

您遇到的问题是,当在PUSHPOP中指定多个寄存器时,它们始终按数字顺序推送或弹出。它们在指令中指定的顺序无关紧要。强制以这种方式交换寄存器内容的唯一方法是分别在两个单独的指令中对两个寄存器执行一个操作(push或pop)。您需要查看PUSHPOP指令的文档,以确定处理多个寄存器时使用的默认顺序,然后使用两个单独的指令有意颠倒该顺序。

答案 1 :(得分:2)

push和pop都是伪指令。

它们在汇编时分别转换为stm和ldm,后缀取决于堆栈类型(完全降序是de-factor标准):

  • 完全降序:stmdb,ldmia
  • 完全升序:stmib,ldmda
  • 空降序:stmda,ldmib
  • 空升序:stmia,ldmdb

一个非常简单的规则适用:编号较低的寄存器从/向较低地址加载/存储值。

改变它的运作方式是不可能的。如果您想以不同于上述规则的顺序推送值,请在推送之前进行排序,或者按照您认为合适的顺序单独推送它们:

push {r6}
push {r5}

老实说,我认为没有任何理由这样做。如果你绝对需要这种“排序”,首先问问自己是否做错了。

答案 2 :(得分:0)

  asm("MOVS R5, #10");
  asm("MOVS R6, #20");

  asm("PUSH {R5,R6}");
  asm("POP {R6}");
  asm("POP {R5}");

我现在已经解决了这个问题,我对此完全陌生,答案结果非常直截了当。 谢谢大家的时间。