String 如何在MIPS中显示字符串数组
这是一个非常初级的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
.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