MIPS 中括号的作用是什么?

2023-12-09

我一直在阅读一本介绍 MIPS 的项目书,但遇到了一个问题。书中的一行代码是lb $t3, ($t2)。我不知道括号的作用,因为在此之前,我还没有看到它们被使用过,而且本书一开始就没有提到它们。为什么代码不只是lb $t3, $t2?


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 语法的设计者决定不这样做。


在此之前,我还没有看到它们被使用过,而且本书一开始就没有提到它们。

继续阅读;希望这本书在首次介绍新语法后的某个时间继续解释它。对于教程或书籍来说,向您展示一些代码作为示例而不停下来解释所有内容是完全正常的,特别是当解释基于尚未涉及的概念时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MIPS 中括号的作用是什么? 的相关文章

随机推荐