assembly - (x86) 虚拟机通常如何处理标志?

标签 assembly x86 virtual-machine virtualization

对于一个副项目,我正在尝试编写一个半可编程的 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/

相关文章:

parsing - 为什么 NASM 在操作数中使用有效指令助记符作为符号名称没有问题?

python - Azure Python SDK - 列出 VM 并生成自定义 JSON 响应

assembly - 第二阶段引导加载程序已加载但未执行

assembly - `vpbroadcastd' 的操作数类型不匹配

c - 汇编中大数的算术运算

assembly - 最小的可执行程序 (x86-64)

linux - 程序集不打印空行

assembly - 第一次学习汇编,这是说一个字的大小是8个字节吗?

linux - 需要一个 Linux 内存利用工具

linux - 如何在不使用 inotifywait 的情况下监视目录中的文件更改?