为啥在执行 pushl 指令时 rA:rB 是 2:8 而不是 2:f?

Posted

技术标签:

【中文标题】为啥在执行 pushl 指令时 rA:rB 是 2:8 而不是 2:f?【英文标题】:Why the rA:rB is 2:8 instead of 2:f in the execution of a pushl instruction?为什么在执行 pushl 指令时 rA:rB 是 2:8 而不是 2:f? 【发布时间】:2019-12-18 13:30:09 【问题描述】:

我正在阅读计算机系统的第 4 章:程序员的视角并了解顺序 Y86 实现。所以这里是汇编代码:

并且我们跟踪pushl指令的执行来分析push操作的每一步。这里是流程,左边是通用的,右边是具体的:

除了rA:rB之外的所有步骤我都能理解。看第一张图,指令是a02f,所以在这种情况下,icode:ifun应该是a:0,rA:rB应该是2:f .然而,根据书上的说法,rA:rB 实际上是 2:8 而不是 2:f。但是为什么?而且我真的不知道“8”是从哪里来的。

【问题讨论】:

汇编列表显示pushlA02F,但旁边说pushlA028,一些文本表明F 用于编码无注册,而其他使用 8 那里。我认为任何一种编码都是允许的。你可以看到,对于pushl,无论是通用的还是特定的,rB 都没有被使用,所以显然没有太大关系。 "旁边说pushl是A028",在哪里? "我们还可以看到该指令位于地址 0x01a,由 2 个字节组成,值分别为 0xa0 和 0x28。" 但我不知道他从哪里得出这个结论。他只是直接说出了那个结论。 【参考方案1】:

这是一个勘误表,列在errata page for the 2nd edition of the book:

第 4 章:处理器架构

页。 370, 除了跟踪 pushl 指令: 第二个指令字节应该是 0x2f,而不是 0x28。 Fetch阶段rB的值应该是0xf而不是0x8。

【讨论】:

以上是关于为啥在执行 pushl 指令时 rA:rB 是 2:8 而不是 2:f?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 pushl %ebp 和 movl %esp, %ebp 在每个 ASM 函数的开头?

函数调用栈维护过程

函数调用栈维护过程

控制硬件在完成指令解码之前如何知道要读取哪些寄存器?

动手配置静态路由

20145225 《信息安全系统设计基础》第6周学习总结