因此,例如,会是这样的:
lw $t1, 0($t0)
或者
lw $t2, 8($t0)
翻译成 C 或 C++?我的意思是我正在将地址中的一个单词加载到寄存器中,我明白了。数组是一个类似的概念,还是什么?
提前致谢。
这是“加载字”指令。它从内存中地址存储在寄存器 $t0 中的位置将 4 字节字加载到寄存器 $t1 中。
c/c++ 中没有等效的构造。该指令非常流行,并在大多数需要内存访问的结构中使用,例如:
int *p;
// p = ...
*p += 10;
可以翻译成类似的东西(假设 $t0 包含指针'p')
lw $t1, 0($t0)
addi $t1, $t1, 10
sw $t1, 0($t0)
这里第一条指令将变量加载到寄存器中,第二条指令修改它,第三条指令将它写回内存
对于第一行:
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];
如果我们看到地址是如何进入寄存器的,它可能会更清楚地了解原始代码。
我认为您不能编写完全相同的代码。您可以执行以下操作:
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;
假设您使用的是 MIPS32(因此具有 32 位内存寻址),那么它们的工作就很容易了。
lw $t1, 0($t0)
这样做是将内存地址 t0 的字节偏移量 0 处的值加载到 t1 寄存器中。
lw $t2, 8($t0)
这样做是将内存地址 t0 的字节偏移量 8 处的值加载到 t2 寄存器中。
假设您有一个内存地址 0x12345678。然后,MIPS 程序集本质上是在执行以下操作:
int t0 = 0x12345678;
// ...
int t1 = *(int*)(t0 + 0);
int t2 = *(int*)(t0 + 8);