【问题标题】:Simple MIPS question, about load byte简单的 MIPS 问题,关于加载字节
【发布时间】:2010-10-31 01:53:31
【问题描述】:

我有以下问题

.data
a: .asciiz "2021"
x: .byte 7,2,12
.text
main: addi $t2, $0, 1
lb $t3, a($t2)

谁能给我解释一下,$t3 的值怎么是 48?

谢谢 编辑这是另一个类似的问题,而且令人困惑。

.data
a: .word 12,-5,4,0
x: .byte 5
.text
main: addi $t1, $0, 8
lw $t2, a($0)
lw $t3, a($t1)

当 'a' 的长度为 4 时,你将如何从索引 8 加载单词?

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    是的,当你添加$0和1时,你得到1,它被放入$t2中。

    然后,当您评估 a($t2) 时,这是 a 的第二个字节(偏移量 1,因为它基于偏移量 0),即“0”,ASCII 码 0x30 或 48。


    来自各种信息:

    ADDI -- Add immediate (with overflow)
    Description:
        Adds a register and a sign-extended immediate value
        and stores the result in a register
    Operation:
        $t = $s + imm; advance_pc (4);
    Syntax:
        addi $t, $s, imm
    
    LB -- Load byte
    Description:
        A byte is loaded into a register from the specified address.
    Operation:
        $t = MEM[$s + offset]; advance_pc (4);
    Syntax:
        lb $t, offset($s)
    

    Register $0 始终包含硬连线值 0。MIPS 已经建立了一组关于如何使用寄存器的约定。这些建议是指导方针,硬件不强制执行。但是,违反它们的程序将无法与其他软件一起正常工作。

    那些小sn-ps应该足以解释它在做什么。


    而且,关于您的编辑,您错误地认为 .word 12,-5,4,0 的长度为 4 个字节。事实上,它的长度为 16 字节,因为 MIPS 中的字是 32 位(四个字节)宽。

    所以当你从 byte 偏移量 8 加载时,你会得到 word 4.

    【讨论】:

    • 谢谢,但你怎么知道是 0x30?这是常识还是有计算十六进制的公式?
    • 这是非常普遍的知识,您只需要从某个地方(书籍、互联网等)为自己获取一个 ASCII 表。数字0..9 是ASCII 码0x30..0x39。
    • 哦,好吧,我想我们的教授会给我们一个 ASCII 表。如果你能再回答 1 个类似的问题,我在上面添加了。
    【解决方案2】:

    仅供参考,在讲义 4 的第 11 页上有一个 ASCII 图表;) 但我不明白: “当您评估 a($t2) 时,这是 a 的第二个字节(偏移量 1,因为它基于偏移量 0),即“0”” 我相信“2021”的二进制表示是: 00110010001100000011001000110001 那么,当您说“哪个是“0””时,您是指右边的第二位吗?是你说的0吗? 我不知道零是从哪里来的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-17
      • 2011-02-05
      相关资源
      最近更新 更多