2013-11-02 47 views
0

我刚开始学习MIPS和我有一个关于it.Here问题是我的示例代码: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.Now可以在foo过程中使用var1吗?或者为了能够使用在主程序之外的.data段中定义的变量,我应该将它们分配给参数寄存器吗?在此先感谢

编辑

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

回答

0

当你说“现在我可以在foo过程中使用var1”时,它表明你仍然像一个高级语言程序员一样思考。当然这不是一件坏事......只是这个集会是一个完整的其他球类游戏。

你真的没有“变数”。你有内存,并且大家都有有权限访问它。 var1不是一个变量,它只是内存中某个位置的地址。您可以在汇编代码中将任意位置的内存地址中的数据存储并加载到任意位置

现在,记住这一点,我不认为你的“变量声明”做了你所期望的。以下是您所做的:

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

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

  • 您称为syscall需要一个ASCIIZ字符串。但是你没有在任何地方放置'\ 0'(0x00)终止符,所以系统调用理论上可以继续打印字符直到内存结束。 (可能的是这并没有因为MARS模拟器趋于内存设置为0x00。)

你的另一个问题是,“我应该将它们分配到参数寄存器”。我认为这仍然是HLL的想法。如果你想使用一个存储在内存中的值,你将加载到它到一个寄存器:lw $t0 var1得到你的第一个的内容开始于地址var1。如果你想把这个值存入寄存器,进入内存位置,从var1开始,你存放它来自一个寄存器:sw $t0 var1

这有助于澄清事情吗?

+0

感谢您的澄清。现在我有一个完全不同的问题,但我会通过编辑这个问题来问它,你能帮助吗? – caesar

+0

@Eday不知道你编辑的问题是否有意义。如果var2没有被初始化,你怎么能“将它与存储在var2中的一些字符进行比较”? – RobertB