x86 cmp 寄存器和内存 - 中间数据保存在哪里?

Posted

技术标签:

【中文标题】x86 cmp 寄存器和内存 - 中间数据保存在哪里?【英文标题】:x86 cmp register and memory - where intermediate data is saved? 【发布时间】: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。 【参考方案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

【讨论】:

以上是关于x86 cmp 寄存器和内存 - 中间数据保存在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

x86 AT&T 寻址模式中基址寄存器的省略

arm 中b 与bne的区别?

8086汇编 cmp 指令

x86 架构规范

从内存中的数据设置 x86 部分寄存器(EAX、AX、AH)

寄存器-2