如何知道在执行时读取了哪个寄存器?

How to know which register(s) is read from as it executed?

我对这类测验有疑问。这背后的理论是什么?

给定以下指令,执行时从哪个寄存器读取? (Select 所有适用项) 和 $sp, $gp, $s4

一个。 $gp(答案) B. $s4(答案) C、$sp D. None 其中

lb $sp, 7472($v1)

一个。 $v1(答案) B. 程序计数器 C、$sp D. None 其中

下面这个manual对于MIPS汇编语言来说还是不错的。它将指令汇编形式与描述处理器对该汇编指令执行的操作的寄存器传输符号相关联,例如,第一条指令是 sll $rd, $rt, shamt,其操作是:R[$rd] ← R[$rt] << shamt.

如果指令的执行为寄存器分配了一个值(这很可能会更改寄存器保存的值,但不是必须的;寄存器保存的旧值丢失),则寄存器是目标.当有目标时,寄存器传输符号将显示寄存器如何更新,即如何计算新值。

您可以通过查看它们相对于代表赋值的 的位置来确定哪些寄存器是源与目标。当在 R[$rd] ← 的左边时,它是一个赋值的目标,因此寄存器 $rd 是一个目标,而当它们出现在赋值的右边时,它是一个源寄存器,如 ← R[$rt] << shamt.

(如您所知,$ 通常用于使用 MIPS 汇编程序/汇编语言为寄存器名称添加前缀。)

MIPS green sheet 也很不错,但是面向机器码而不是汇编语言,所以你必须知道机器码操作数的顺序与相同指令的汇编形式(你从第一个可以看出link)。在 MIPS 汇编语言中,目标寄存器(如果存在)始终是第一个操作数,尽管在机器代码中目标寄存器(如果存在)始终是最后一个寄存器字段。

在绿色 sheet 中,同一条 MIPS 指令具有以下定义:

Description Mnemonic Format Operation
Shift Left Logical sll R R[rd] = R[rt] << shamt

并不是所有的指令都有目标寄存器,例如,加载指令有目标寄存器,但存储指令没有——存储指令的真正目标是某个内存位置,所以没有目标注册.

每条指令还通知处理器下一条 运行 的指令。大多数指令告诉处理器将程序计数器增加 4(一条 MIPS 指令的字节大小),这意味着下一条指令是内存中紧跟在当前执行指令之后的指令;这实现了一条指令接一条指令的正常顺序执行。 (这种行为是如此基本,以至于大多数课程作业和说明手册都假设并掩盖了指令执行的这一方面,例如,仅当 PC 以顺序更新以外的方式更新时才注意到。)

分支指令以正常方式与程序计数器交互(顺序执行时前进 4)或向后移动(例如完成循环)或向前移动(例如退出循环或跳过 then或部分)。分支指令也没有目标寄存器——它们的作用仅与程序计数器有关。