gpt4 book ai didi

assembly - 需要帮助来理解这些 ARM 指令

转载 作者:行者123 更新时间:2023-12-04 22:25:26 24 4
gpt4 key购买 nike

我正在查看代码的汇编输出,需要以下说明的帮助。

--//--

    0x00000fe8:    e28fc000    ....    ADR      r12,{pc}+8 ; 0xff0

0x00000fec: e28cca08 .... ADD r12,r12,#8, 20 ; #0x8000

--//--

根据我的理解,第一条指令导致 r12 被加载

“{pc 值} + 8”即

“{执行中的当前指令地址 (0xfe8) 加上前面的 2 条指令 (8)} + 8”

在加载 0xff8 (0xfe8+8+8) 的第一条指令执行后,r12 也是如此

同样关于第二条指令 -

如何计算添加并存储到 r12 的值? (评论说它是 0x8000,虽然我不明白它是如何得到这个的)

最佳答案

第一条指令(实际上是伪指令)将 PC 相对地址加载到 R12 中。由于指令位于地址 0xFE8,因此表达式 {pc}+8 的计算结果为 0xFF0。所以第一条指令的结果是将值 0xFF0 加载到 R12 中。评论实际上表明了这一点。

(注意 ADR 不是真正的 ARM 指令,汇编器用 ADD 等指令代替它。还要注意,这个表达式的值是在汇编时计算的。在程序执行过程中,PC 指向当前指令的前面,由于处理器的管道。提前多少取决于体系结构(例如 ARM7 等)和操作模式(Thumb/ARM)。)我冒着在此处提供有关 ADR 和 PC 相关表达式/寻址的“太多信息”的风险,但如果你不了解幕后发生的事情,很容易被咬。)

第二条指令(实际上是从右到左读取)有效地表示“取常数 0x8,将其向右旋转 20 位(这与左移 12 位相同,32-20 = 12),将其添加到 R12(当前保存为 0xFF0),并将其存储在 R12 中。” 0x8 << 12 = 0x8000,因此第二条指令导致 R12 持有 0x8000 + 0xFF0 = 0x8FF0。

注意:在你的解释中,当你说“2条指令”时,不要陷入那个习惯,把它想象成8个字节,而不是2条指令。该指令说添加 8 个字节,它没有说明任何关于指令的内容。指令不一定是 4 个字节长(例如,在 Thumb 中,它们是 2 个字节;在 Thumb2 中,它们是 2 个字节或 4 个字节,具体取决于指令)。

关于assembly - 需要帮助来理解这些 ARM 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3583606/

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