1

这是 MIPS 编程中的一个非常初级的程序,我试图从用户那里获取输入并在屏幕上显示输入数据。但是当我运行这个程序时,我得到“ Memory out of bound error ”,然后程序在尝试显示数据时崩溃。这段代码有什么问题:

.data 

Array: .space 20

Promt: .asciiz "Enter a String:\n"
Line: .asciiz "\n"

.text

main:

la $a0,Promt
li $v0,4
syscall

la $a0,Array
li $a1,20
li $v0,8
syscall

la $t0,Array  # BASE ADDRESS OF ARRAY
li $t1,4

Loop:

lw $a0,0($t0)

add $t0,$t0,$t1

beq $a0,0, Exit

li $v0,4

syscall


j Loop

Exit:

li $v0,10
syscall

问候

4

2 回答 2

1

两个问题:

1)在你的循环中,你正在做一个syscallwith $v0 == 4,它在 address 打印字符串$a0。里面有什么$a0?它是实际的字符串数据,不是有效的地址。您可能想要$v0 == 11打印一个单独的字符;但这会导致下一个问题:

2)您一次加载四个字符。一个字是 4 个字节,您使用lw的意思是“加载字”。您一次只能使用 打印一个字符syscall 11,并且您的循环仅在它恰好加载了全部为零的 4 个字符块时才会退出。您应该一次加载一个字符。使用lb(load byte ) 代替lw(load word ),并使用$t1 == 1代替$t1 == 4.

于 2012-10-08T19:17:14.773 回答
0

正如 Jeff 指出的那样,您似乎在 $a0 中加载了不合适的值。以下是对您的程序的修改。我对您的程序做了两个简单的更改。

 .data 

        Array: .space 20 
            Promt: .asciiz "Enter a String:\n"  
            Line: .asciiz "\n"

.text

main:

    la $a0,Promt    
    li $v0,4    
    syscall

    la $a0,Array    
    li $a1,20   
    li $v0,8    
    syscall

    la $t0,Array  # BASE ADDRESS OF ARRAY   
    li $t1,4    
    lw $a0,0($t0) #***MOVED THIS OUT***     
    Loop:
        add $t0,$t0,$t1         
            beq $a0,0, Exit         
            la $a0, Array       
            li $v0,4        
            syscall         

            li $a0, 0  #****ADDED THIS LINE****         
            j Loop

    Exit:
        li $v0,10   
            syscall
于 2013-03-30T05:32:25.430 回答