gpt4 book ai didi

assembly - 如何在arm中编码立即值?

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

假设有一个这样的实例:

add  ip, ip, #0x5000

机器码是

05 CA 8C E2

E2 8C CA 05 = 11100010100011001100 1010 00000101
imm = rotate_right(101B, 1010B*2) = 0x5000

但是如果我们知道0x5000,我们怎样才能得到101000000101呢?这个反向转换是一一对应的吗?谢谢。

最佳答案

来自 ARM ARM:

ADD adds two values. The first value comes from a register. The second value can be either an immediate value or a value from a register, and can be shifted before the addition.

您所看到的直接值(value)正在发生变化。指令的位 11:0 是移位器操作数 - 在您的情况下:0xA05 .

文档后面描述了该寻址模式:

The <shifter_operand> value is formed by rotating (to the right) an 8-bit immediate value to any even bit position in a 32-bit word.

所以你的特定移位操作数意味着 0x05向右旋转 (2 * 10)位。

如果您正在进行指令编码,您有几种选择。例如:

0xA05 // rotate 0x05 right by 20
0xB14 // rotate 0x14 right by 22
0xC50 // rotate 0x50 right by 24

我手工编码它们以进行反汇编:

$ xxd -r > example
00 05 CA 8C E2 14 CB 8C E2 50 CC 8C E2
$ arm-none-eabi-objdump -m arm -b binary -D example

example: file format binary


Disassembly of section .data:

00000000 <.data>:
0: e28cca05 add ip, ip, #20480 ; 0x5000
4: e28ccb14 add ip, ip, #20480 ; 0x5000
8: e28ccc50 add ip, ip, #20480 ; 0x5000

这是一个可以找到编码的简单程序:

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

int main(int argc, char **argv)
{
uint32_t encode = strtoul(argv[1], NULL, 0);
int rotate;

for (rotate = 0; rotate < 32; rotate += 2)
{
// print an encoding if the only significant bits
// fit into an 8-bit immediate
if (!(encode & ~0xffU))
{
printf("0x%X%02X\n", rotate/2, encode);
}

// rotate left by two
encode = (encode << 2) | (encode >> 30);
}
return 0;
}

以及针对您的案例运行的示例:

$ ./example 0x5000
0xA05
0xB14
0xC50

关于assembly - 如何在arm中编码立即值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17763582/

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