我在ARMv5程序集中找到了这样的说明:
pop {r2} ; (str r2, [sp, #-4]!)
push {r0} ; (str r0, [sp, #-4]!)
push {r4, r5, r6, r7, r8, r9, sl, lr}
我知道push和pop是STR
和LDR
的首字母缩略词,并且这些指令存储并加载到多个寄存器,因此我相信在这种情况下花括号意味着&# 34;设置存储或加载的寄存器"
我的假设是否正确?
答案 0 :(得分: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 {r2,r3,r4}
与
不同push {r4,r2,r3}
例如
另外请注意,最初没有推/弹指令,它们带有真正的推/弹拇指指令,而不是ldm / stm(因为它们没有足够的位来刻录r13被指定为16位中的4位,他们拥有的ldm / stm仅限于r0-r7)。同样,你必须为三个寄存器操作指定所有三个寄存器,然后稍后让你懒惰的汇编器让你使用拇指语法来进行arm指令,然后最终使用统一语法,这会使事情变得更复杂而不是更少。 / p>
最重要的是要记住,汇编语言通常不是标准化的。它们仅由您使用读取文本的程序的特定汇编程序定义,有人可以轻松地允许此
push (r1,r2)
pop [r3,r4]
push r2,r3,r4,r5
str r3,r2
作为汇编程序中的合法语法。只需看看相同指令集的arm工具和gnu工具之间的差异。与传统的pdp-11语法相比,查看pdp-11 gnu汇编语法会更有趣。 (是的,有一个维护的pdp-11后端)。
所以你的问题应该更具体地说明你使用的汇编程序,即使我们非常清楚你在问什么。