Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 访问寄存器who';s号存储在另一个寄存器中_Assembly_Mips_Cpu Registers - Fatal编程技术网

Assembly 访问寄存器who';s号存储在另一个寄存器中

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

我正在为我的一个类做一个项目,这个项目涉及将C代码翻译成MIPS汇编。翻译此代码时遇到问题:

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
,等等),并且必须在var
i
中返回值。如果
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条可能的指令放在某个地方,然后跳到正确的指令。我想,你也可以通过自我修改代码来实现。