lw如何用C或C ++表示?

时间:2009-10-22 00:31:43

标签: c++ c mips

所以,例如,会是这样的:

  

lw $ t1,0($ t0)

  

lw $ t2,8($ t0)

转换为C或C ++?我的意思是我正在从地址加载一个字到一个寄存器中,我明白了。数组是一个类似的概念,或者是什么?

提前致谢。

4 个答案:

答案 0 :(得分:2)

这是“加载字”指令。它将存储在寄存器$ t0中的地址的存储器中的4字节字加载到寄存器$ t1中。

c / c ++中没有等效的结构。该指令非常流行,并且在大多数需要内存访问的结构中使用,例如:

int *p;
// p = ...
*p += 10;

可能被翻译成类似的东西(给定$ t0包含指针'p')

lw $t1, 0($t0)
addi $t1, $t1, 10
sw $t1, 0($t0)

这里第一条指令将变量加载到寄存器中,第二条指令将其修改,第三条指令将其写回内存

答案 1 :(得分:0)

第一行:

int t1, *t0; ... t1 = *t0t1 = t0[0]或甚至int t0, t1; ... t1 = t0

第二个:

int t2 = t0[2],也许,或许int t2 = t0.thirdThing

struct {
   int a,b,thirdThing;
} t0;

但你无法确定。它可能是char *x, **y; x = y[2];如果我们看到地址如何进入寄存器,它可能会对原始代码有所了解。

答案 2 :(得分:0)

我认为你不能写完全相似的代码。您可以执行以下操作:

int* wordAddress = ... + 8; // 8 or any offest
// assuming int is a word on MIPS wich I never worked with personally
int  word = *wordAddress;

您还可以在检索值时应用偏移量:

int* wordAddress = ... + 0;
int  word = *(wordAddress + 8);

有一条注释:您无法在语言中指定所需的register。你可以做的是给编译器一个提示,将word放在register中:

// it is just a hint. The compiler is free to put it in memory.
register int  word = *wordAddress;

答案 3 :(得分:0)

假设您正在使用MIPS32(因此具有32位内存寻址),那么它们的功能非常简单。

lw $t1, 0($t0)

这样做是将字节偏移0处的值从存储器地址t0加载到t1寄存器中。

lw $t2, 8($t0)

这样做是将字节偏移量8处的值从存储器地址t0加载到t2寄存器中。

让我们假设您有一个内存地址0x12345678。然后,MIPS程序集基本上执行以下操作:

int t0 = 0x12345678;
// ...
int t1 = *(int*)(t0 + 0);
int t2 = *(int*)(t0 + 8);