计算输出的 MIPS 程序

MIPS program that computes an output

我想知道如何编写一个 MIPS 程序来执行用户提供的 abc 的数学表达式整数输入,s 被计算并打印为输出。

s = (a + b) - (c + 101)

我刚开始学习 MIPS。

您必须像编译器一样工作:将给定的表达式分解为硬件可以执行的更小部分。

我们可以在 C 中开始这个分解,以更好地了解我们需要做什么。就像在汇编语言中一样,当我们分解时,我们制作更简单的语句,通过临时变量互连。

s = (a + b) - (c + 101)

那我们就用C来做这个改造,引入临时变量来连接简化的部分。

t1 = a + b
t2 = c + 101
s = t1 - t2

此表单有一个名称,Three Address Code

MIPS 对此的翻译非常简单:作为汇编语言程序员,我们为临时变量选择一个 CPU 寄存器,所以 t1 从上面的 C 代码中,可能会 $t1 MIPS 寄存器,t2$t2。 (这里我们观察到 t1t2 的值同时需要:也就是说,它们的生命周期 重叠 。因此,它们每个都需要自己的装配位置,即他们自己的 CPU 寄存器。)

我们还需要知道 abc 的位置。假设它们分别是 MIPS 指定参数 CPU 寄存器 $a0$a1$a2 中的参数。

这意味着第一行t1 = a + b,可以翻译成一条MIPS指令:

add $t1, $a0, $a1

等等:

addi $t2, $a2, 101    # here we use an "add immediate" since one operand is a constant

最后,假设我们想要 s 在 MIPS CPU 寄存器中 $s1:

sub $s1, $t1, $t2

一般的想法是,在汇编语言/机器代码中,我们不能在一条指令中完成我们想要的所有事情,所以我们必须将代码分解成更小的部分并使用多条指令。

我们必须了解有关变量位置和临时值管理的更多细节,因为 CPU 寄存器的数量有限(而在 C 语言中,我们可以根据需要拥有几乎无限的变量(即用于三地址编码),当然,C 也可以放弃 TAC:使用括号和运算符优先级来保存中间值,甚至无需命名临时变量。)。 (如果我们在汇编中 CPU 个寄存器中 运行 个,我们必须编写代码在内存和寄存器之间洗牌,使用内存来保存任何超过 运行 个。)

寄存器管理——用于长寿命变量和短寿命变量——是编写汇编语言工作的重要组成部分。具有重叠生命周期的两个变量不能共享相同的 CPU 寄存器,但是由于 CPU 寄存器是有限的,我们可以 运行 输出更大的表达式。在 MIPS 上,有 10 个寄存器专门用作临时寄存器(尽管也有一些其他寄存器)。我们需要知道什么时候我们完成了一个临时值,因为那时它的 CPU 寄存器可以重新用于其他用途。