Assembly 汇编-在运行时打印出错误的行

Assembly 汇编-在运行时打印出错误的行,assembly,runtime-error,mips,Assembly,Runtime Error,Mips,这是我的第二个MIPS汇编程序。我翻译了大部分Java代码,所以我意识到这可能看起来有点混乱,对此我深表歉意,我只是想获得汇编的直觉。并感谢您提供有关输出错误原因的帮助。:)首先是代码,然后是输出: .text # Load variables s=$t2, m=$t3, i=$t4, j=$t5 (second loop i), $t7=for mult 2 in first loop li $t2,4 li $t3,1 li $t4,1 li $t5,1 li $t7,2 # Us

这是我的第二个MIPS汇编程序。我翻译了大部分Java代码,所以我意识到这可能看起来有点混乱,对此我深表歉意,我只是想获得汇编的直觉。并感谢您提供有关输出错误原因的帮助。:)首先是代码,然后是输出:

    .text
# Load variables s=$t2, m=$t3, i=$t4, j=$t5 (second loop i), $t7=for mult 2 in first loop
li $t2,4
li $t3,1
li $t4,1
li $t5,1
li $t7,2

# User enters positive int > 1
la $a0,prompt
li $v0,4
syscall

# Put input into $t1 (p)
li $v0,5
syscall
move $t1,$v0

# $t6 is (q) or p-2 for second loop
la $t6,($t1)
subi $t6,$t6,2

firstloop:
# (i=1; i<=p; i++) m *= 2
mult $t3,$t7
mflo $t3
addi $t4,$t4,1
bgt $t4,$t1,subm
b firstloop

subm:
# Subtract 1 from m, move on to second loop
subi $t3,$t3,1
b secondloop

secondloop:
# (i=1; i<=p-2; i++)...
mult $t2,$t2
mflo $t2
subi $t2,$t2,2
div $t2,$t3
mfhi $t2
addi $t5,$t5,1
bgt $t5,$t6,printline
b secondloop

isPrime:
la $a0,print4 # Is a...
li $v0,4
syscall
b end

isNotPrime:
la $a0,print3 # Is not a...
li $v0,4
syscall
b end

printline:
la $a0,print1 # 2^
li $v0,4
syscall
la $a0,($t1) # p
li $v0,4
syscall
la $a0,print2 # -1=
li $v0,4
syscall
la $a0,($t3) # m
li $v0,4
syscall
beqz $t2,isPrime
b isNotPrime

end:
# End program
li $v0,10
syscall

.data
prompt:
.asciiz "Enter an odd postive integer greater than 1: "
print1:
.asciiz "2^"
print2:
.asciiz "-1="
print3:
.asciiz " is not a Mersenne prime. :("
print4:
.asciiz " is a Mersenne prime. :)"
字符串指针应该进入
$a0
,而不是
$v0
(代码中有多个这样的错误)

字符串指针应该进入
$a0
,而不是
$v0
(代码中有多个这样的错误)

字符串指针应该进入
$a0
,而不是
$v0
(代码中有多个这样的错误)


字符串指针应该进入
$a0
,而不是
$v0
(代码中有多个这样的错误)。

非常有用,这就是这种语言的“doh!”时刻。我收到一个地址超出范围的新错误。这不是读数显示的第70行,但在[la$a0,($t1)#p->li$v0,4->syscall]p不是一个大数字(我测试的是23,3,基本上是30及以下)。有什么想法吗?谢谢。:)您不能使用
print\u字符串
syscall(4)来打印整数(这是您在
$t1
中得到的)。而且你也不能得到寄存器的地址,如果这是你所想的,你在用
la
做什么。您应该做的是类似于
move$a0,$t1
/
li$v0,1
/
syscall
。非常有用,这就是这种语言的“doh!”时刻。我收到一个地址超出范围的新错误。这不是读数显示的第70行,但在[la$a0,($t1)#p->li$v0,4->syscall]p不是一个大数字(我测试的是23,3,基本上是30及以下)。有什么想法吗?谢谢。:)您不能使用
print\u字符串
syscall(4)来打印整数(这是您在
$t1
中得到的)。而且你也不能得到寄存器的地址,如果这是你所想的,你在用
la
做什么。您应该做的是类似于
move$a0,$t1
/
li$v0,1
/
syscall
。非常有用,这就是这种语言的“doh!”时刻。我收到一个地址超出范围的新错误。这不是读数显示的第70行,但在[la$a0,($t1)#p->li$v0,4->syscall]p不是一个大数字(我测试的是23,3,基本上是30及以下)。有什么想法吗?谢谢。:)您不能使用
print\u字符串
syscall(4)来打印整数(这是您在
$t1
中得到的)。而且你也不能得到寄存器的地址,如果这是你所想的,你在用
la
做什么。您应该做的是类似于
move$a0,$t1
/
li$v0,1
/
syscall
。非常有用,这就是这种语言的“doh!”时刻。我收到一个地址超出范围的新错误。这不是读数显示的第70行,但在[la$a0,($t1)#p->li$v0,4->syscall]p不是一个大数字(我测试的是23,3,基本上是30及以下)。有什么想法吗?谢谢。:)您不能使用
print\u字符串
syscall(4)来打印整数(这是您在
$t1
中得到的)。而且你也不能得到寄存器的地址,如果这是你所想的,你在用
la
做什么。您应该做的是类似于移动$a0,$t1的
li$v0,1
/
syscall
Go: running lltest.asm

Error in G:\School\Computer Organization\lltest.asm line 70: Runtime exception at 0x004000c8: address out of range 0x00000003

Go: execution terminated with errors.
la $v0,print4 # Is a...
li $v0,4