计算输出的 MIPS 程序
MIPS program that computes an output
我想知道如何编写一个 MIPS 程序来执行用户提供的 a
、b
、c
的数学表达式整数输入,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
。 (这里我们观察到 t1
和 t2
的值同时需要:也就是说,它们的生命周期 重叠 。因此,它们每个都需要自己的装配位置,即他们自己的 CPU 寄存器。)
我们还需要知道 a
、b
和 c
的位置。假设它们分别是 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 寄存器可以重新用于其他用途。
我想知道如何编写一个 MIPS 程序来执行用户提供的 a
、b
、c
的数学表达式整数输入,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
。 (这里我们观察到 t1
和 t2
的值同时需要:也就是说,它们的生命周期 重叠 。因此,它们每个都需要自己的装配位置,即他们自己的 CPU 寄存器。)
我们还需要知道 a
、b
和 c
的位置。假设它们分别是 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 寄存器可以重新用于其他用途。