assembly - 一个32位寄存器和一个常量的指令怎么可能只占用三个字节呢?

标签 assembly x86 disassembly

我正在审查 Visual Studio 2012 中某些程序的反汇编,并看到以下内容:

65F920F3  or          eax, 0FFFFFFFFh  
65F920F6  jmp         65F92157  

注意。它占用地址 F3-F5,这意味着它只占用三个字节。 eax 寄存器是四个字节,所以我假设常量 0FFFFFFFFh 也是四个字节。

这条指令如何放入三个字节?

最佳答案

因为常量 0xFFFFFFFF aka -1 适合带符号字节,所以它可以使用带符号字节的编码作为立即操作数。

原来如此

83 C8 FF

83aluop rm32, imm8 的通用操作码,ModRM 字节 C8 具有组件 11_001_000其中 11 表示 rm 部分是寄存器,001 是/r 字段并将指令转换为 000 表示 rm 操作数是 eaxFF 是 imm8。

关于assembly - 一个32位寄存器和一个常量的指令怎么可能只占用三个字节呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28429655/

相关文章:

c++ - 组装性能调整

assembly - Int 10H 在 QEMU 中不起作用

c++ - 在汇编文件中调用 C++ 函数

c - 静态链接不在库 api strlen() 和 puts() 的 gdb 中提供代码

assembly - 您可以在反汇编程序(例如 dbg)中删除和添加指令吗?

assembly - 为什么堆栈充满了0xCCCCCCCC

assembly - FASM - 压缩 "buffer db 0, 0, 0, 0, 0, 0, ..."

python - 如何在汇编器中使用 IF 伪操作处理前向引用

带堆栈操作的 GCC 内联汇编

c - C 中的类型转换是如何实现的?