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 寄存器和内存 - 中间数据保存在哪里?的主要内容,如果未能解决你的问题,请参考以下文章