【问题标题】:ARM Assembly, POP Stack and store in registerARM 汇编、POP 堆栈和存储在寄存器中
【发布时间】:2013-11-23 11:11:31
【问题描述】:

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

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

【问题讨论】:

  • 你想交换它们。尝试单独推送和弹出它们。
  • 弹出时的值存储在哪里?
  • 到你放在列表中的寄存器,比如 pop {r4, r5}
  • 你的问题的答案在你提到的arm网站上,架构参考手册非常详细地描述了指令集,push是如何工作的,pop是如何工作的。

标签: assembly arm


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    push 和 pop 都是伪指令。

    它们在组装时分别被翻译成 stm 和 ldm,后缀取决于堆栈类型(完全降序是 de-factor 标准):

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

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

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

    push {r6}
    push {r5}
    

    老实说,我看不出有什么好的理由这样做。如果您绝对需要这种“排序”,请先问问自己是否做错了什么。

    【讨论】:

    • 它们是 Thumb 模式下的专用指令。
    • 是的,我理解PUSH和POP方法的概念,谢谢!我没有看到的是一旦弹出它们就保存在哪里。这对我来说有点模糊。这样做的目的是进行一些实验并熟悉我在大学中使用的 CORTEX 处理器和 STM32。
    【解决方案3】:
      asm("MOVS R5, #10");
      asm("MOVS R6, #20");
    
      asm("PUSH {R5,R6}");
      asm("POP {R6}");
      asm("POP {R5}");
    

    我现在已经解决了这个问题,我对此完全陌生,而且答案很直接。 感谢大家的宝贵时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 2016-11-11
      相关资源
      最近更新 更多