【问题标题】:immediate value encoding in ARM assemblyARM 程序集中的立即值编码
【发布时间】:2021-10-14 13:58:16
【问题描述】:

我现在正在学习汇编语言,我对立即值的编码方式有些困惑。有人可以解释为什么以下值有效:0xff00ff00、0xffffffff、0x007f8000?还有为什么 0xff0000ff, 0x007f9000 的值无效?

据我了解,12 位立即数分为 4 个高位旋转和 8 个低位常量。所以我认为我上面列出的所有值都是无效的,因为它需要超过 12 位。

对此主题进行一些澄清会很有帮助,谢谢!

【问题讨论】:

  • 汇编器也可以使用mvn 与反转位模式,例如;我认为在某处已有关于该问题的问答。此外,如果这是 ARM64,则可以使用按位布尔值重复位模式(但对于像 add 这样的其他指令则不能使用立即数),因此对于将立即数放入寄存器的伪指令。 (也许还有一些 32 位 ARM 中的 Thumb 指令,我忘了?)您是否尝试过查看反汇编以查看您的汇编程序实际选择的编码?操作码可能会给你一个很大的线索。
  • 请说明这是ARM32还是ARM64。另外,这里的实际指令是什么?不同的指令允许不同的立即数集。
  • @Jake'Alquimista'LEE 在 Thumb 代码中它是有效的。 OP 没有说明他使用的是 ARM 模式还是 Thumb 模式。
  • @fuz 你说的是thumb2,这是一个稍微不同的故事。然而,缺乏条件执行无论如何都会破坏交易。而且,还有很多教授还在强迫学生用原始拇指写hello world。
  • @Jake Thumb(2) 支持条件执行。是的,当然,当我说 Thumb 时,指的是 Thumb2。

标签: assembly arm immediate-operand instruction-encoding


【解决方案1】:

(此答案适用于 ARM32 模式,而不是 Thumb2 或 AArch64。那里的情况有所不同,允许的立即数取决于指令。)

您一定是在谈论 12 位编码。它实际上是 4 + 8 位编码。位置为 4,图案为 8,因此旋转计数必须是偶数。

  1. 从 0 到 255 的任何值都是有效的。 0x00 ~ 0xff 模式在位置 0
  2. 256 且 N 的任意二次方均有效。因为它们都是 1bit 模式。
  3. 257 无效,因为 0x101 需要 9 位模式
  4. 258 无效,因为它的位置是奇数,即使模式适合 8 位。 (129
  5. 260 有效 (65

如果您的指令是 movcmp,或者另一个具有在使用它之前立即执行某些操作的版本。

PS:2^4 = 16,寄存器为32bit。这就是为什么位置必须是平的。

【讨论】:

  • 这帮助很大,非常感谢!
  • 这看起来像一个拇指问题。 0xff00ff00.
【解决方案2】:
.thumb

ldr r0,=0xFF00FF00

0:  f04f 20ff   mov.w   r0, #4278255360 ; 0xff00ff00


.thumb
.cpu cortex-m0

ldr r0,=0xFF00FF00

00000000 <.text>:
   0:   4800        ldr r0, [pc, #0]    ; (4 <.text+0x4>)
   2:   0000        .short  0x0000
   4:   ff00ff00    .word   0xff00ff00

查看 ARM 文档,它清楚地记录了立即编码的工作原理。而且基本上你不能做的事情。如上所示,各种 thumb2 扩展添加了更多功能(armv6-m 与 armv7-m(或 -a))。

正如 Jake 指出的那样,32 位 arm 指令基本上是 8 个有效位移位偶数 (0,2,4,6)。

ldr r0,=0x00000081
ldr r0,=0x00000101
ldr r0,=0x00000102
ldr r0,=0x00000204
ldr r0,=0x10000008
ldr r0,=0xEFFFFFF7
ldr r0,=0xFFFFF00F


00000000 <.text>:
   0:   e3a00081    mov r0, #129    ; 0x81
   4:   e59f0010    ldr r0, [pc, #16]   ; 1c <.text+0x1c>
   8:   e59f0010    ldr r0, [pc, #16]   ; 20 <.text+0x20>
   c:   e3a00f81    mov r0, #516    ; 0x204
  10:   e3a00281    mov r0, #268435464  ; 0x10000008
  14:   e3e00281    mvn r0, #268435464  ; 0x10000008
  18:   e3e00eff    mvn r0, #4080   ; 0xff0
  1c:   00000101    .word   0x00000101
  20:   00000102    .word   0x00000102

arm 编码比 thumb 编码更容易理解,但是 arm 文档中的示例可以使其更容易理解。

既然你提到了 0xFF00FF00,这意味着你问的是 armv7-a 还是 armv7-m 是吗?

【讨论】:

  • 您将需要 armv7-m 架构参考手册。
  • 所有拇指变体 thumb(从 armv4t 到 armv7-a 和 cortex-ms)非常无聊,几乎不支持立即数。这里和那里的一些位。
  • "移动了 2 的偶数次幂"。我认为您的意思是“乘以”,否则只需说“按偶数移位”,否则您要取幂两次。 (即移动 4、16、64,......将是 2 的偶数次幂。)
  • 对,写错了,忘记改了
  • 我需要使用有效的 cortex m4 常量
猜你喜欢
  • 2023-04-02
  • 2016-06-15
  • 2014-03-06
  • 2015-09-07
  • 2021-08-17
  • 2023-04-08
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多