2017-01-09 632 views
0

我发现在我的ARMv5装配这样的指令:ARM汇编 - 使用大括号

pop  {r2} ; (str r2, [sp, #-4]!) 
push {r0} ; (str r0, [sp, #-4]!) 
push {r4, r5, r6, r7, r8, r9, sl, lr} 

我的理解是push和pop是首字母缩略词为STRLDR,这些指令存储和加载多个寄存器因此,我认为,在这种情况下,大括号表示“设置寄存器存储或装载”

是我的假设是正确的?

+0

听起来像它。 – fuz

+0

不要假设,阅读参考手册。 – Jester

+0

一个不使用S.O.要么? –

回答

2

好的,只需阅读指令集文档。汇编程序可以选择使用str/ldr或stm/ldm作为单个寄存器推送和弹出。现在,您希望将堆栈保持在64位边界上,所以通常会推送或弹出偶数个寄存器,但是如果必须的话,您可以一次执行一个。对于拇指推/弹出是他们自己的指令,而不是加载或存储的编码。

00000000 <.text>: 
    0: e49d2004 pop {r2}  ; (ldr r2, [sp], #4) 
    4: e52d0004 push {r0}  ; (str r0, [sp, #-4]!) 
    8: e92d40f0 push {r4, r5, r6, r7, lr} 

00000000 <.text>: 
    0: bc04  pop {r2} 
    2: b401  push {r0} 
    4: b5f0  push {r4, r5, r6, r7, lr} 

在这种情况下,ARM编码似乎的确是加载/存储不仅仅是反汇编注释(x4xxxxxx)LDM/STM是x8xxxxxx编码像最后一个。

所有这些当然都在这些ARM文档中,这些文档可以回答您的问题以及其他您可能遇到的问题。如果可以找出每个答案,那么确保stackoverflow可以是无用的。但在这种情况下,您正在检查显示语法的一些参考,即相同的参考应该有一些附加文本显示寄存器列表是一个集合。编码中分别有15位或9位,并且有几个简单的例子,您可以看到编码与您在语法中指定的列表相匹配。

是的花括号意味着推动他们所有人或弹出他们所有的视情况而定。该文档还包括设置以及哪些寄存器被放在内存中什么样的顺序,是从

push {r4,r2,r3} 

push {r2,r3,r4} 

不同例如

还要注意原来还有后增量前减量没有推/拉指令,它们与非ldm/stm的真正的推/拉拇指指令一起出现(因为它们没有足够的位来刻录r13被指定为16位中的4位,它们具有的ldm/stm是限于r0-r7)。同样,你必须为三个寄存器操作指定所有三个寄存器,稍后汇编器让你懒惰,让你使用拇指语法来进行arm指令,然后最终得到统一的语法,这使得事情变得更加复杂。

最重要的是要记住,汇编语言通常不是标准化的。他们只能通过特定的汇编程序定义您正在使用的阅读文本的程序,有人可以轻易让这

push (r1,r2) 
pop [r3,r4] 
push r2,r3,r4,r5 
str r3,r2 

在他们的汇编合法的语法。只要看看相同指令集的arm工具和gnu工具之间的区别。与传统的pdp-11语法相比,查看pdp-11 gnu汇编语法更有趣。 (是的,有一个维护的pdp-11后端)。

所以你的问题本来应该更具体,你用什么汇编,尽管我们非常知道你在问什么。

+0

当我问这个问题时,我期待着一个简单的“是或否”的答案。但是你超越了这个,今天我学到了很多东西,我不知道汇编语言不是标准的。非常感谢。 –