使用过程访问变量的mips

使用过程访问变量的mips,mips,procedure,argument-passing,Mips,Procedure,Argument Passing,我刚刚开始学习MIPS,对此我有一个问题。以下是我的示例代码: .data var2: .space 201 var1: .byte '.' .text main: la $a0,var2 li $a1,201 li $v0,8 syscall jal foo #

我刚刚开始学习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来存储一些东西。首先,我读了一个stdin,并将其存储为$t0 register。我想做的是,我想逐字符读取stdin,并将其与存储在var2中的一些字符进行比较,但是在比较的第一步,var2将是空的(或有垃圾),我想知道如何解决我的问题?

当你说,“现在我可以在foo过程中使用var1了吗”,这表明你仍然像一个高级语言程序员一样思考。这当然不是坏事。。。只是组装是另一场球赛

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

现在,记住这一点,我认为你的“变量声明”并没有达到你期望的效果。以下是您所做的:

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

  • 您又分配了一个字节,并给它内容0x2E(ASCII字符“.”)

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

你的另一个问题是,“我应该把它们分配给参数寄存器吗?”。我想这还是我的想法。如果要使用存储在内存中的值,请将其加载到寄存器中:
lw$t0 var1
获取从地址
var1
开始的第一个字的内容。如果要将值放入寄存器中,则从
var1
开始,将其存储在寄存器中:
sw$t0 var1


这有助于澄清问题吗?

谢谢您的澄清。现在我有一个完全不同的问题,但我会通过编辑来问这个问题。你能帮我吗?@Eday不确定你编辑的问题是否有意义。如果var2尚未初始化,您如何“将其与存储在var2中的某些字符进行比较”?