【发布时间】: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