MIPS lw 语义:"lw $t2, $t0" 和 "lw $t2, ($t0)" 之间的区别?
MIPS lw semantics: difference between "lw $t2, $t0" and "lw $t2, ($t0)"?
我在这个 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
呢?我很困惑...
lw $t2, $t0
不是 MIPS 指令 --- 我怀疑您可能误读了该页面。
一般来说,在汇编程序领域,(thing)
或 [thing]
是地址 thing
处的 值的通用约定。所以lw $t2, ($t0)
表示加载$t0
中地址处的字。是的,这正是指针的工作方式。它相当于 C:
t2 = *(uint32_t*)t0;
也是和lw $t2, 0($t0)
一样的指令。如果它是 0,汇编器只允许你发出数字;该数字是应用于 $t0
的偏移量,因此访问的地址是 $t0+1234
。 lw $t2, 1234($t0)
是:
t2 = *(uint32_t*)(t0 + 1234);
MIPS 非常规则,与 x86 不同,接触内存的唯一指令是加载和存储指令。您不会在其他任何地方看到这种结构。
我在这个 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
呢?我很困惑...
lw $t2, $t0
不是 MIPS 指令 --- 我怀疑您可能误读了该页面。
一般来说,在汇编程序领域,(thing)
或 [thing]
是地址 thing
处的 值的通用约定。所以lw $t2, ($t0)
表示加载$t0
中地址处的字。是的,这正是指针的工作方式。它相当于 C:
t2 = *(uint32_t*)t0;
也是和lw $t2, 0($t0)
一样的指令。如果它是 0,汇编器只允许你发出数字;该数字是应用于 $t0
的偏移量,因此访问的地址是 $t0+1234
。 lw $t2, 1234($t0)
是:
t2 = *(uint32_t*)(t0 + 1234);
MIPS 非常规则,与 x86 不同,接触内存的唯一指令是加载和存储指令。您不会在其他任何地方看到这种结构。