gpt4 book ai didi

assembly - ARM 汇编器中的寄存器操作数是如何编码的?

转载 作者:行者123 更新时间:2023-12-02 19:16:40 25 4
gpt4 key购买 nike

我反编译了一些ARM ELF文件并读取了汇编代码。但是,我不明白一些代码是如何翻译成助记符的。例如我得到这样的代码:

#hex code | #mnemonic             | #binary
0xb480 | push {r7} | 1011 0100 1000 0000
0xb580 | push {r7, lr} | 1011 0101 1000 0000
0xb5f0 | push {r4,r5,r6,r7,lr} | 1011 0101 1111 0000

因此,如果推送多个值,您可以清楚地看到 push 的操作码是 0xb40xb5。但是寄存器列表是如何创建的呢?

第一个例子很清楚,r7是由第8位编码的,这是设置的。但是,为什么第二个操作码也推送 lr 呢?没有位标志吗?

最佳答案

Thumb模式下PUSH指令有三种编码。第一个长度为 16 位,自 ARMv4T(原始 Thumb 实现)以来就存在:

15141312|11|109|8|      7..0    |
1 0 1 1| 0| 10|M| register_list|

由于 register_list 是 8 位,因此它只能将寄存器 R0 推送到 R7(以及 LR,如果M 位已设置)。

在 Thumb-2(ARMv6T2、ARMv7 及更高版本)中,添加了另外两种编码。它们都是 32 位长:

1514131211|109|876|5|4|3210||151413|    12 .. 0    |
1 1 1 0 1| 00|100|1|0|1101|| 0 M 0| register_list |

在这个例子中,register_list是13位,因此它可以将R0推送到R12LR

我不会列出第三种编码,但它可以推送任何单个寄存器。

顺便说一句,POP 编码非常相似。

16 位 POP:

15141312|11|109|8|      7..0    |
1 0 1 1| 1| 10|P| register_list|

可以将R0弹出到R7PC(位P)。

32 位 POP 多个:

1514131211|109|876|5|4|3210||151413|    12 .. 0    |
1 1 1 0 1| 00|010|1|0|1101|| P M 0| register_list |

可以将R0弹出到R12PC(位P)和LR(位M)。

关于assembly - ARM 汇编器中的寄存器操作数是如何编码的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17827805/

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