Assembly 访问寄存器who';s号存储在另一个寄存器中
我正在为我的一个类做一个项目,这个项目涉及将C代码翻译成MIPS汇编。翻译此代码时遇到问题:Assembly 访问寄存器who';s号存储在另一个寄存器中,assembly,mips,cpu-registers,Assembly,Mips,Cpu Registers,我正在为我的一个类做一个项目,这个项目涉及将C代码翻译成MIPS汇编。翻译此代码时遇到问题: r[extract(ir,15,11)] = aluout; 基本上,r[]是一个数组,表示C中的寄存器。如您所见,它根据extract函数的结果确定要访问哪个寄存器。MIPS中有类似的东西吗?我能想到的唯一方法是从提取子例程返回的值,并对照所有寄存器号进行检查。这个的C表示形式如下所示: regNum = extract(ir, 15, 11); if (regNum == 1) { r[1
r[extract(ir,15,11)] = aluout;
基本上,r[]是一个数组,表示C中的寄存器。如您所见,它根据extract
函数的结果确定要访问哪个寄存器。MIPS中有类似的东西吗?我能想到的唯一方法是从提取子例程返回的值,并对照所有寄存器号进行检查。这个的C表示形式如下所示:
regNum = extract(ir, 15, 11);
if (regNum == 1) {
r[1] = aluout;
} else if (regNum == 2) {
r[2] = aluout;
} else if (regNum == 3) {
r[3] = aluout;
} ...
有什么想法吗?这是唯一的方法吗?您应该使用自修改代码吗?e、 g.将寄存器号放入即将运行的指令中 问题更类似于在C中有多个命名变量(
var1
,var2
,等等),并且必须在vari
中返回值。如果i
是编译时常量,则可以使用预处理器执行此操作:
#define expandvar(x) var ## x // two step process to macro-expand x before concat
#define var(x) expandvar(x)
#define wantvar 4
int foo(void) { return var(wantvar); }
// int foo(constexpr int i) { ... } // nope
否则,您需要一个开关()
,可以根据需要实现它(跳转表、分支树或其他任何东西)
寄存器没有间接寻址级别,除非您将它们全部存储到内存中,然后在该数组中使用变量偏移量
实现这一点的一种方法是使用计算的跳转,而不是跳转地址表。你会有一系列的
# calculate $t0 = set_r0 + reg_num * 8. (probably using PC as the starting point, rather than actually referencing the address of set_r0)
j $t0 # jump to one of the pairs.
set_r0:
move $r0, src
j end
move $r1, src
j end
...
如果要检索一个寄存器的值,但却要删除所有其他寄存器
move $r30, $r31
move $r29, $r30
move $r28, $r29
...
move $r0, $r1
在读取所需注册表的位置跳转到这个位置。嗯,您可以为数组编制索引。你不能索引原始寄存器。是的,我知道。C代码是我们教授给我们的,我们应该翻译成MIPS。r[index]仅表示寄存器$[index],如果要将其转换为MIPSO,则您正在编写一个MIPS汇编程序,该程序应模拟(MIPS?)CPU。我只是将模拟寄存器保存在一个数组中,就像使用C一样。您可能无法将所有模拟寄存器保存在实寄存器中,因为您的程序中的其他内容需要一些实寄存器;把所有32条可能的指令放在某个地方,然后跳到正确的指令。我想,你也可以通过自我修改代码来实现。