【问题标题】:MARS MIPS Simulator ASCII string not storing in memory in little-endian properly?MARS MIPS Simulator ASCII 字符串未正确以小端序存储在内存中?
【发布时间】:2021-06-11 01:27:01
【问题描述】:

我听说 MARS MIPS 模拟器是 little-endian,所以我希望如果我在内存中使用 .asciiz "HELLO" 保留字符串“HELLO”,我会发现字符 O 位于最低内存地址中和H在给定字符串的最高内存地址中。

但是当我组装代码时,MARS 的调试器显示内存是这样的:

H 存储在 0x10010000 地址(数据段基地址)中,O 存储在 0x10010004 中——显然存储在更高的内存地址中。这不是大端序吗?

但是,我注意到,当我使用 .word 0xABCD 保留字长数据(如 0x0000ABCD)时,D 将被放置在最低内存中,这是小端系统必须执行的操作。为什么它们存储数据的方式不同?

【问题讨论】:

    标签: assembly mips endianness mars-simulator


    【解决方案1】:

    字符串是一个字节序列,而不是一个巨大的整数。无论机器字节序如何,字符串的第一个字节始终是最低地址。

    机器字节序仅决定了如果您执行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 计数前导/尾随零指令,但如果有,你可以这样使用它们。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-17
      • 2011-07-13
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 2010-12-06
      • 2017-07-13
      • 2013-08-19
      相关资源
      最近更新 更多