MIPS 寻址模式语法是constant($reg)
.
($t2)
允许作为特殊情况的简写0($t2)
。相同的指令可以做
lb $t3, 13($t2)
从内存地址处加载(并符号扩展)一个字节13 + $t2
进入寄存器$t3
.
MIPS唯一的寻址模式是reg + sign_extended_imm16
;加载/存储指令(包括lb
and lbu
)是I型。省略0
in 0($t2)
只是源代码级别的语法细节;机器代码仍然有 16 个零位来编码常量零。
顺便说一句,我忽略了 MIPS 索引 FP 加载/存储指令的存在,例如lwxc1
使用 2 个整数寄存器。他们仅限 FP也许是因为整数存储版本需要 3 个 GP 寄存器作为输入,但该寄存器文件仅需要 2 个读取端口(对于标量管道)。 (架构师显然认为加载和存储之间的对称性比仅为加载提供 2 寄存器寻址模式更重要;这对于大量代码来说是很好且有用的)。
还有lwpc
用于某些较新的 MIPS 修订版中的 PC 相对寻址。但lw
/ lb
/ lbu
等等有没有位来编码什么类型的寻址模式;它始终是 reg + imm16。其他任何事情都需要不同的指令,而经典的 MIPS 没有其他任何东西。
语义(对于 asm 文本语法的人类读者来说)是取消引用操作,就像在 C 中一样int t3 = *t2;
or t2[0]
加载指向的值(lb
) 代替int tmp = (int)p
将指针复制为整数 (move
).
()
始终是内存操作数,只能与加载或存储指令一起使用。裸寄存器不是内存寻址模式,不能用作加载或存储指令的第二操作数。
加载/存储指令在寻址模式上需要括号,这是一件好事,这样您就不会混淆哪个操作数是地址,哪个是值. e.g. sw $t3, 12($t2)
将单词存储在$t3
到地址处的内存字中12+$t2
. If sw $t3, $t2
是有效的语法,您可能会忘记,对于 MIPS(像大多数 RISC 一样)上的内存指令,地址始终位于右侧,即使每个其他指令都将目标作为第一个操作数。
这使得它在视觉上与move $t3, $t2
。能够直观地发现代码块中的加载和存储是很好的。
如果您正在为 MIPS 汇编语言设计自己的语法,或者编写汇编程序,则可以使编写合法lb $t3, $t2
作为简写lb $t3, 0($t2)
。但 asm 语法是由汇编器(作者)定义的,MIPS 语法的设计者决定不这样做。
在此之前,我还没有看到它们被使用过,而且本书一开始就没有提到它们。
继续阅读;希望这本书在首次介绍新语法后的某个时间继续解释它。对于教程或书籍来说,向您展示一些代码作为示例而不停下来解释所有内容是完全正常的,特别是当解释基于尚未涉及的概念时。