所以,例如,会是这样的:
lw $ t1,0($ t0)
或
lw $ t2,8($ t0)
转换为C或C ++?我的意思是我正在从地址加载一个字到一个寄存器中,我明白了。数组是一个类似的概念,或者是什么?
提前致谢。
答案 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 = *t0
或t1 = 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);