【问题标题】:x86 cmp register and memory - where intermediate data is saved?x86 cmp 寄存器和内存 - 中间数据保存在哪里?
【发布时间】:2014-07-20 16:46:48
【问题描述】:

假设我有这样的汇编指令:

cmp sp 100h

我尝试重现 x86 cpu 在执行期间执行的逻辑步骤。喜欢这个schema。 cpu 在哪里存储即时值100h?在此链接上使用了名为 accumulator (AC) 的东西。在 ALU 中执行比较之前,是否有通用寄存器 (EAX?) 或额外的寄存器来保存这些数据?

【问题讨论】:

  • 它不存储在累加器中。 IIRC,CPU有一个临时寄存器存储它,同时进行比较。
  • 临时寄存器不是通用EAX、EBX等之一吗?
  • 立即值通常直接编码到指令中。
  • @jeff-mercado 好的,但我有 16 位字和 cmp sp 100h 编码为 4 个字节。 CPU 每次内存访问仅获取 2 个字节。因此,我的 cpu 模拟器应该将中间数据存储在某个地方......我想像在真实硬件上那样做。
  • 看它的方法是看到有一条线从指令寄存器或解码器直接到ALU。

标签: assembly x86 emulation


【解决方案1】:

您的问题有些令人困惑,但我会尝试回答。

在对汇编指令进行编码时,立即数通常在指令本身中进行编码。例如

cmp     esp,100h
81 fc00010000    

如果我们检查 cmp 编码,我们会看到 81 是包含对 32 位寄存器的引用和 4 字节立即数的操作码的第一个字节。

跳过您对 fetch/decode/execute/store 的比较以及您对 CPU fetching 的评论,嗯,现代 CPU 要复杂得多。

可以说(在这个范围内)x86 指令获取很复杂,因为 x86 操作码是可变长度的。这意味着 CPU 知道它需要获取 N 个字节,在本例中为 6 个字节(1 个用于操作码,1 个用于第一个操作数,4 个用于立即值)。

现在“保持”立即值是完全特定于实现的,但在这种情况下,我希望它会被编码为 CPU 执行的实际“指令”。在某些情况下,数据会保存到临时寄存器中。


一本关于所有这些东西的好书,还有更多是Inside the Machine by Jon Stokes

【讨论】:

    猜你喜欢
    • 2014-11-19
    • 2021-01-23
    • 2015-11-01
    • 2012-03-25
    • 2019-01-02
    • 1970-01-01
    • 2021-02-09
    • 2016-06-15
    相关资源
    最近更新 更多