0

我刚刚开始学习 MIPS,对此我有一个疑问。这是我的示例代码:

       .data
var2: .space 201        
var1:  .byte '.'


    .text
main:
        la $a0,var2
        li $a1,201           
        li $v0,8            
        syscall             

        jal foo         

        # code is over.
        li $v0,10 
        syscall

foo:

正如您在代码中看到的,我没有为 var1 分配任何寄存器。现在我可以在 foo 过程中使用 var1 吗?或者为了能够在主程序之外使用.data段中定义的变量,我应该将它们分配给参数寄存器吗?提前致谢

编辑

正如你所看到的,我创建了 var2 来存储一些东西。首先,我读取了一个标准输入并将其存储为 $t0 寄存器。我想要做的是我想逐字符读取标准输入并将其与存储在 var2 中的一些字符进行比较,但是在我比较的第一步,var2 将为空(或有垃圾),我想知道我该如何解决我的问题?

4

1 回答 1

0

当您说“现在我可以在 foo 过程中使用 var1”时,这表明您仍在像高级语言程序员一样思考。当然,这不是一件坏事……只是组装完全是另一场球类游戏。

你真的没有“变量”。你有记忆,每个人都可以访问它。var1不是变量,它只是内存中某个位置的地址。您可以从汇编代码中的任何位置存储和加载来自该内存地址的数据。

现在,请记住这一点,我认为您的“变量声明”没有达到您的预期。这是你所做的:

  • 您分配了一个 201 字节的块。该内存区域尚未初始化,因此其内容可以是任何内容。该块中的第一个字节可以通过引用标签来访问(任何人)var1

  • 你又分配了一个字节,并给了它内容 0x2E(ASCII 字符'.')。

  • 您调用了syscall期望 ASCIIZ 字符串的 。但是您没有在任何地方放置 '\0' (0x00) 终止符,因此理论上系统调用可以继续打印字符直到内存结束。(可能不是因为 MARS 模拟器倾向于将内存设置为 0x00。)

您的另一个问题是,“我应该将它们分配给参数寄存器”。我认为这仍然是 HLL 的想法。如果要使用存储在内存中的值,请将其加载到寄存器中:lw $t0 var1获取从 address 开始的第一个单词var1的内容。如果要将值放入寄存器中,则从 开始的内存位置中var1其从寄存器中存储:sw $t0 var1

这有助于澄清事情吗?

于 2013-11-02T16:22:06.127 回答