gpt4 book ai didi

assembly - ARM 程序集 - 使用花括号

转载 作者:行者123 更新时间:2023-12-04 03:15:21 31 4
gpt4 key购买 nike

我在我的 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并且这些指令存储和加载到多个寄存器,因此我相信在这种情况下大括号意味着“用于存储或加载寄存器的集合”

我的假设正确吗?

最佳答案

嗯,是的,只需阅读指令集文档。汇编器可以选择使用 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}

例如

另请注意,最初没有 push/pop 指令,它们与不是 ldm/stm 的真正 push/pop 拇指指令一起出现(因为它们没有足够的位来刻录 r13 被指定为 16 位中的四位,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 后端)。

所以你的问题应该更具体地说明你使用的是什么汇编程序,即使我们几乎知道你在问什么。

关于assembly - ARM 程序集 - 使用花括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41556855/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com