对于一个副项目,我正在尝试编写一个半可编程的 x86 虚拟机。
我理解格式,所以大部分设计都相对简单,但是在执行带有操作数的指令后,标志经常会改变。检查每个潜在位的效率非常低,所以我想将标志寄存器弹出到 VM 中,对它进行 AND 运算,然后设置 VM 的标志寄存器。但是,这仍然是很多开销。
这是边缘性的自以为是,但是我缺少什么吗?
最佳答案
如果您希望您的模拟器按原样模拟处理器,那么是的,您需要准确地模拟标志。
这意味着清除需要清除的位(用AND),设置需要设置的位(用OR),并在需要时复制/计算位(即Z标志需要测试结果是否为零,进位需要知道你是否有溢出等)
没有其他办法了。
这就像解码R/M mod
字节。您无法绕过必须加载该字节,检查模式以确定这是寄存器还是内存访问,并相应地应用这些......
实际上,这意味着您的模拟器将“慢得多”(除非您使用 3Ghz 现代处理器模拟旧的 10Mhz 处理器,否则您有时间执行 300 个指令周期……所以您应该没问题。 )
如果你有兴趣,我写了一个 6502 emulator并使用 Apple 2 ROM 对其进行了测试。我不得不添加 sleep 以使其不以 100Mhz 或更高的速度运行......(该处理器最初运行的是 1Mhz......)
关于assembly - (x86) 虚拟机通常如何处理标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40292480/