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

String 如何在MIPS中显示字符串数组,string,assembly,mips,mips32,pcspim,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

这是一个非常初级的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
关于两个问题:

1) 在循环中,您正在使用
$v0==4
执行
系统调用
,它在地址
$a0
处打印字符串。
$a0中有什么?它是实际的字符串数据,不是有效的地址。您可能需要打印单个字符的
$v0==11
;但这导致了下一个问题:

2) 一次加载四个字符。一个单词有4个字节,您使用的是
lw
,意思是“加载单词”。使用
syscall 11
,一次只能打印一个字符,只有在加载了一个4个字符的块且全部为零时,循环才会退出。您应该一次加载一个字符。使用
lb
(加载字节)代替
lw
(加载字),并使用
$t1==1
代替
$t1==4
两个问题:

1) 在循环中,您正在使用
$v0==4
执行
系统调用
,它在地址
$a0
处打印字符串。
$a0中有什么?它是实际的字符串数据,不是有效的地址。您可能需要打印单个字符的
$v0==11
;但这导致了下一个问题:


2) 一次加载四个字符。一个单词有4个字节,您使用的是
lw
,意思是“加载单词”。使用
syscall 11
,一次只能打印一个字符,只有在加载了一个4个字符的块且全部为零时,循环才会退出。您应该一次加载一个字符。使用
lb
(加载字节)而不是
lw
(加载字),并使用
$t1==1
而不是
$t1==4

正如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

正如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