assembly - arm movw指令如何映射到机器代码?

标签 assembly arm disassembly

我目前正在尝试了解 movw 指令如何在 ARM 上工作,以便能够对库进行十六进制编辑并更改使用所述指令设置的值。

库提供的代码如下(objdump 的输出):

[...]
29c4:   f44f 71f0   mov.w   r1, #480    ; 0x1e0
[...]

换句话说,我想做的是弄清楚“f44f 71f0”中的 0x1e0/480 是如何表示的。我一直在网上阅读资料,包括 http://blogs.arm.com/software-enablement/251-how-to-load-constants-in-assembly-for-arm-architecture/我想我了解 movw 是如何工作的以及它的局限性;但我仍然不明白指令中显示的值如何映射到实际的二进制代码。非常感谢您就此事提供的任何文件或标志:)

最佳答案

对于 arm,指令在 ARM ARM、ARM 体系结构引用手册中进行了描述。转到 http://infocenter.arm.com然后沿着左边找到架构,然后找到您感兴趣的架构。这是一个 thumb2 指令,所以您需要 armv7-m。

这看起来是编码 T2

11110i00010S11110... 

i 和 S 在您的指令中为零。 imm3 是位 12 到 14,imm8 是位 7 - 0。

0 111 0001 11110000

所以你的 imm3 是 0b111,imm8 是 0b11110000

然后你看thumb指令部分修改后的立即数

i ... imm3 ... abcdefgh 其中 abcdefgh 是 imm8 位你的 i:imm3:a 位,5 位是 0b11111

所以你在表中查找它,你会得到右侧的 imm8 向左移动 1

00000000 00000000 00000001 bcdefgh0
00000000 00000000 00000001 11100000

这是 0x000001E0

Arm 在记录他们的指令方面做得很好,比大多数都好。

关于assembly - arm movw指令如何映射到机器代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9053178/

相关文章:

assembly - 在 NASM 汇编中对数字进行平方而不进行乘法

c - Arm 4 微 Controller 上的硬故障错误

c++ - 内联函数调用推理

c - 在这种情况下使用 JL 和 JLE 吗?

c++ - C++中的函数地址文字在哪里?

debugging - 在 x32dbg/x64dbg 中,我如何自动跟踪 'dump window' 中的堆栈(ESP)?

assembly - 将 C 数组操作转换为汇编

linux - ncurses 程序无法在 debian armv7 上运行

JNI C++ 环境中的 Java 线程仅使用一个内核。 Arm 处理器和 Ubuntu

linux - 将外部函数与共享库相匹配