这是一个非常初学的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
此致
答案 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