使用过程访问变量的mips
我刚刚开始学习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 #
.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字符串的
。但是您没有在任何地方放置'\0'(0x00)终止符,因此系统调用理论上可以继续打印字符,直到内存结束。(很可能没有,因为火星模拟器倾向于将内存设置为0x00。)syscall
lw$t0 var1
获取从地址var1
开始的第一个字的内容。如果要将值放入寄存器中,则从var1
开始,将其存储在寄存器中:sw$t0 var1
这有助于澄清问题吗?谢谢您的澄清。现在我有一个完全不同的问题,但我会通过编辑来问这个问题。你能帮我吗?@Eday不确定你编辑的问题是否有意义。如果var2尚未初始化,您如何“将其与存储在var2中的某些字符进行比较”?