如何在MIPS中显示字符串数组

时间:2012-10-06 16:05:00

标签: string assembly mips mips32 pcspim

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

.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

此致

2 个答案:

答案 0 :(得分:1)

两个问题:

1)在你的循环中,你正在使用syscall进行$v0 == 4,它会在地址$a0打印字符串。 $a0中的内容是什么?它是实际的字符串数据,它不是有效的地址。你可能想要$v0 == 11代替,它打印一个单独的角色;但这导致了下一个问题:

2)你一次加载四个字符。一个字是4个字节,你正在使用lw,这意味着'加载字'。您只能使用syscall 11一次打印一个字符,并且只有在加载了一个全部为零的4个字符的块时,您的循环才会退出。您应该一次加载一个字符。使用lb(加载字节)代替lw(加载),并使用$t1 == 1代替$t1 == 4

答案 1 :(得分:0)

正如杰夫指出的那样,你似乎已经在$ 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