字符串是一个字节序列,而不是一个巨大的整数。无论机器字节序如何,字符串的第一个字节始终是最低地址。
机器字节序仅决定了如果您执行lw $t0, my_string,您将在寄存器中获得什么值。
但是,如果您使用lbu $a0, ($t1) / addiu $t1, $t1, 1 遍历字符串的字节,您肯定希望按照您在源代码中编写它们的顺序获取ASCII 字节:H、E、L、L、O, 0.
如果您想向后存储字符串,请使用.asciiz "OLLEH"。
字节流没有终结性,只有 CPU 可以通过单次访问加载的内容。字节序的整个概念来自能够访问单词的各个字节,例如sw 然后lbu。
如果你可以只使用lw/sw,那么硬件字节序就不是问题了,这将取决于软件如何移位/或或与访问一个内的位如果要打包 8 位 ASCII 字符,则为 32 位整数。或者,如果您只能甚至使用lbu / sb,那么存储较长整数的单独字节的顺序将取决于软件。
对于字符串,每个人都会做出明智的选择,以打印顺序存储它们,第一个字节位于最低地址。这恰好与您希望它们在文本文件或在一行内从左到右扫描的视频 RAM 的顺序相匹配。
同样,当您使用 bithack 或其他方式实现高效的 strlen 一次检查 4 个字节的 0 时,字节序仅对字符串很重要:https://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord。
虽然 bithack 实际上并没有告诉您差异在哪里,但如果您通过一次比较 4 个字节(1 个字)来实现 strcmp,则可能是一个更好的例子。在不匹配的情况下,您可以在这些单词中一次循环 1 个字节以找到不同的确切字符,或者您可以将两个单词异或在一起,然后找到最低设置位(小端序)或最高位的位置设置位(大端)以找出哪个字节包含第一个位差。 (我不知道 MIPS 是否有 clz / ctz 计数前导/尾随零指令,但如果有,你可以这样使用它们。)