Lw ip:MIPSlw语义:“lw$t2 $t0”和“lw$t2 ($t0)”之间的区别

关于Lw ip的问题,在t2 0中经常遇到, 我在这个quick tutorial中挑选了一些 MIPS,其中作者区分了这两个 lw 指令:lw $t2,$t0 # copy word (4 bytes) at source RAM location to destination register.

我在这个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 的“pointee”复制到 $t2 中,以便 $t2 的实际值是 $t0 的“pointee”,基本上:

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

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);

与 x86 不同,MIPS 非常规则,唯一接触内存的指令是加载和存储指令。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(471)
工程造价收费标准文件:Angularjs标准文件名
上一篇
win10打不开exe文件(含代码示例)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(13条)