2012-02-02 103 views
2

我想一个C程序翻译成MIPS汇编代码的Mips:变量保存在另一个变量

在我的C代码,我有这样一行:

int base; 
int count; 

count = base; 

在MIPS,怎么会我在计数中存储基数的值?我看到的用于加载和存储的唯一指令是lwsw,它们的原型仅来自寄存器源 - > RAM目标或RAM源 - >注册目标。

任何帮助,将不胜感激。

编辑 我希望这可以在一个单一的指令来完成,像

move base acc

但显然这是不可能的(至少我发现类似的无指令的例子),我选择了这一点:

lw $t0, base //load base into $t0 
sw $t0, count //store the value of $t0 in count 

如果有一个行指令可以做到这一点会更好,如果有人知道的。

回答

8

MIPS不支持直接从内存到内存的移动。 (实际上最常见的CPU也不是 - 甚至x86也不是。)您需要使用lw/sw来移动数据。在架构上,这是因为MIPS被设计为每个周期只执行一次内存访问 - 执行内存到内存移动需要两次访问(一次读取,一次写入),或者阻塞管道。

+0

“base”和“counter”的值不在寄存器中,它们存储在RAM中。所以当我这样做时,我只会收到一条错误消息。 – 2012-02-02 04:25:25

+0

哦,如果它们不是寄存器,那就不一样了。更新。 – duskwuff 2012-02-02 04:33:12

+0

它可以很好,它可以优化这条指令,即使它是“lw/sw”等价的一行,我花了1个小时寻找指令。 – 2012-02-02 04:36:52

4

这里是如何做到这一点的MIPS

la $t0, base  // load the address of "base" 
la $t1, count // load the address of "count" 
lw $t2, 0($t0) // load the data at location "base" 
sw $t2, 0($t1) // store that data at location "count" 

做存储器移动存储在一个单一的指令这是不可能的。

+0

实际上,你可以只用2条指令:'lw $ t0,base'然后'sw $ t0,count' – 2012-02-02 23:28:13

+0

'lw $ t0,base'就是'lui $ at,%hi(base)的MIPS汇编缩写, '接着是'lw $ t0,%lo(base)(at)'。加载然后存储序列总共仍然是4条机器指令。 – markgz 2012-02-02 23:37:27

+0

但只有两条物理指令。 – 2012-02-03 00:01:57

相关问题