assembly - x86 操作码编码 : sib byte

标签 assembly x86 disassembly machine-code addressing-mode

我目前正在尝试编写一个反汇编程序。我找到了以下操作码列表及其含义,因此我决定在运行时解析它: http://web.archive.org/web/20150810224114/http://mprolab.teipir.gr/vivlio80X86/pentium.txt

但我被困在操作码 0x00 处: 其后是 reg/modbyte。解析它对我来说并不是什么大问题。

但是我在使用 Scale-Index-Base 字节时遇到了问题:
如果你真的指定esp作为索引寄存器,那么实际上意味着没有索引寄存器。

这同样适用于带有 ebp 的基址寄存器。但我已经用 C++ 内联汇编器尝试过:可以编译: 添加[ebp*2+ebp],cl

那么当使用ebp作为基址寄存器实际上意味着根本不使用基址寄存器时,如何将ebp用作基址寄存器!?

最佳答案

“缺少 EBP”情况仅适用于 ModR/M.Mod 字段的二进制值为 00 的情况。如果需要 EBP 作为基础,汇编器会将 Mod 更改为 01 二进制,并添加 8 位位移,其值为零:

004C6D00 添加[ebp+ebp*2], cl

关于assembly - x86 操作码编码 : sib byte,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3476541/

相关文章:

assembly - 8086 运行时 16 位除法溢出错误

assembly - 旋转指令(x86 上的 ROL、RCL)的用途是什么?

c++ - 调试优化的 C/C++ 程序的有效方法是什么?

assembly - MIPS - 释放动态分配的空间(堆)

windows - Subsystem for Unix Application on Windows 如何在汇编中实现系统调用?

gcc - 未通过带有 __attribute__((fastcall)) 的寄存器获取从 asm 传递到 C 的函数参数

pointers - 为什么这个跳转指令在执行指针追逐时如此昂贵?

java - ARM 是更安全的指令集吗?

c - GCC和Borland在反汇编C代码方面的区别?

assembly - 如何使用 AVR 的 gnu 汇编器相对于 PC 跳转?