【发布时间】:2018-09-20 19:31:05
【问题描述】:
我正在尝试制作一个简单的 x86 反汇编程序(目前为 32 位)用于学习目的。
所以英特尔文档是这样的:
但我觉得这很令人困惑。
首先,m8-32 操作数似乎表示ES:(E)DI 或DS:(E)SI。
但尚不清楚在哪种情况下会出现这种情况。
在某些操作码中您有OPCODE m8, m8,在其他操作码中您只有一个操作数m8,在检查了多个操作码后,我得出的结论是没有一般规则。
还有其他这些,简称为memory operand in memory,这让我更加困惑。是否应该有位移,可能是绝对地址或相对偏移量?如果是这样,那还有什么意义,因为我们有moffs 和rel?
后面的有点意思,但是冒号后面的数字是不是位移?
不过,& 符号让我完全一无所知。
除此之外,还有这些m[number][descriptor],据我所知是用于FPU的吗? (我还没有处理 0Fh 转义的操作码)。
很抱歉,我可能错过了一些非常明显的东西,就像我经常做的那样。
提前致谢。
【问题讨论】:
-
FPU 向一个非常不同的鼓手进军。这与它开始的方式有很大关系,它曾经是一个不同的芯片(8087),与处理器分开销售。非常不同的数据类型,没有寄存器而是堆栈。很久以后它被集成到同一个芯片中,奔腾是第一个保证它可用的芯片。请记住,它在现代软件开发中变得非常无关紧要,它有 too many quirks 并且现代编译器生成 SSE 代码。
-
@HansPassant:x87 在内存中使用两种与 SSE/SSE2 相同的数据类型:IEEE754 单精度和双精度浮点数。 (m32fp 和 m64fp)。只有当您使用 fld / fstp 的 m80fp 形式时,您才能获得 10 字节的内部格式,即an IEEE754 extended precision format。它比单/双具有更多的位,但除了不使用显着的隐藏/隐式最高位之外,它的工作方式相同。但是 x87 整体来说很糟糕,而且它的寄存器堆栈绝对不是一个好的编译器目标!
标签: assembly x86 disassembly 32-bit machine-code