MIPS lw语义:“lw $ t2,$ t0”和“lw $ t2,($ t0)”之间的差异?

时间:2015-03-21 05:33:39

标签: assembly mips

我在这个quick tutorial中获取了一些MIPS,作者区分了这两个lw指令:

lw $t2, $t0 # copy word (4 bytes) at source RAM location to destination register.

lw $t2, ($t0) # load word at RAM address contained in $t0 into $t2

我觉得作者的两条评论意思相同......
当我认为这些寄存器在C ++中是松散的指针时(当然它们不是因为寄存器包含内存地址和实际数据),两个语句似乎都做同样的事情:将$ t0的“指针”复制到$ t2中,这样$ t2的实际值是$ t0的“指针”,基本上是:

Word * $t0, $t2; //some hypothetical pointers
Word someData=1111000011110000.... //some hypothetical type (32 bits in total)
someData = *$t0; //de-reference $t0 and copy its value into someData
$t2 = someData; //impossible in real C++ but you know what I mean

这两条指令之间有什么区别吗?那么lw $t2, 0($t0)lw $t2, (0)$t0怎么样?我很困惑......

1 个答案:

答案 0 :(得分:1)

lw $t2, $t0不是MIPS指令---我怀疑您可能误读了该页面。

通常,在汇编程序中,(thing)[thing]是地址thing值的通用约定。因此lw $t2, ($t0)表示$t0 的地址加载单词。是的,这正是指针的工作原理。它相当于C:

t2 = *(uint32_t*)t0;

它也是与lw $t2, 0($t0)相同的指令。汇编程序只允许你发出数字,如果它是0;该数字是应用于$t0的偏移量,因此访问的地址为$t0+1234lw $t2, 1234($t0)是:

t2 = *(uint32_t*)(t0 + 1234);

MIPS非常规则,与x86不同,触摸内存的唯一指令是加载和存储指令。你不会在其他地方看到这种结构。