THUMB推入/弹出指令

3
我正在尝试使用THUMB指令创建一个阶乘方法,基本上已经完成了。 我只有一个关于PUSH/POP操作码的问题:如果我使用push将r0的值存储在堆栈中(如 push {r0} ),我是否可以稍后使用 pop {r1} 来取出它,还是需要指定与一开始相同的寄存器?感谢您的帮助。

所有指令都是独立的。如果您想使用push/pop将r0的先前内容复制到r1中,可以这样做。 - Aki Suihkonen
不特定于任何供应商的任何架构(x86、arm、mips等),都允许您指定被推送的寄存器/内存和弹出的目标寄存器/内存。作为汇编程序员,您可以自由地从任何位置推送和弹出。如果硬件有限制,则您将无法选择寄存器,并且会告知使用哪个寄存器。 - old_timer
1个回答

4

是的,你可以这样做,因为push/pop实际上会扩展为存储/加载多个操作,这些操作是通用的指令,可以操作寄存器和内存。

push {r0}

等同于

stmdb sp!, {r0}  @ or stmfd sp!, {r0} in alt notation

并且

pop {r1}

等同于

ldmia sp!, {r1}  @ or ldmfd sp!, {r1}

2
有一个注意事项,push/pop/ldm/stm的参数是按照寄存器升序排列的,而不是按照指定顺序排列的。因此,如果您执行push{r0,r1},然后执行pop{r1,r0}以交换它们,这将失败,因为pop{r1,r0}与pop{r0,r1}相同。 - Variable Length Coder
是的,你必须注意一些寄存器的列表。感谢@VariableLengthCoder。 - Nikolai Fetissov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接