assembly - 有没有办法在 32 位寄存器指令中保留字大小的立即数

标签 assembly x86 reverse-engineering nasm

假设以下 x86-32 指令:

add ebx,1

(至少)有两种方法来组装此操作码:

81 c3 01 00 00 00

83 c3 01

第一个将 1 保留为 4 字节双字 第二个保留 1 作为一个字节

是否有一条指令将1保留为2个字节? 如果没有为什么?

最佳答案

您偶然发现了 x86 指令集的一个怪癖。 Intel 在词干 83 下包含了一组指令,其第一个操作数的类型为 Ev,第二个操作数是立即数字节,其大小被解释为与Ev 操作数。因此,对于 83 c3 0101 被解释为 32 位值;对于 66 83 c3 01,01 被解释为 16 位值(目标是 16 位 ax 寄存器)。在词干 6A 下编码的 push 助记符在其单个操作数的大小方面具有相同的行为方式。

您的问题的更广泛的答案是否定的,不存在将 16 位常量解释为 32 位常量的编码。

来源:我写了一个反汇编程序。

关于assembly - 有没有办法在 32 位寄存器指令中保留字大小的立即数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17379499/

相关文章:

exception - 操作系统开发 : How to avoid an infinite loop after an exception routine

c - 如何在 C 或 ASM 中获取调用函数的传入参数

assembly - 读取 GDTR 的值

java - 将java代码反转为UML符号?

windows - 为什么PE需要Original First Thunk(OFT)?

python - 将 python 逆向工程为字符串

assembly - PIC 是否处理不可屏蔽中断?

gcc - llvm-gcc 汇编器 : LDR syntax

assembly - 如何在摩托罗拉 M6800 中对数字进行取模

assembly - 重定位被截断以适应 r_386_8 针对 .bss'