ARM汇编、POP堆栈并存储在寄存器中



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

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

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

push和pop都是伪指令。

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

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

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

改变它的工作方式是不可能的。如果你想按与上述规则不同的顺序推送值,可以在推送之前进行排序,也可以按你认为合适的顺序单独推送,比如:

push {r6}
push {r5}

老实说,我看不出有什么好的理由这么做。如果你绝对需要这种"分类",首先问问自己,你是否做错了什么。

  asm("MOVS R5, #10");
  asm("MOVS R6, #20");
  asm("PUSH {R5,R6}");
  asm("POP {R6}");
  asm("POP {R5}");

我现在已经解决了这个问题,我对这个问题完全陌生,答案很直接。感谢大家抽出时间。

最新更新