2014-02-27 2 views
0

이것은 내 두 번째 MIPS 어셈블리 프로그램입니다. 나는 자바 코드를 가장 많이 번역했기 때문에 조금 어색해 보일지 모른다. 나는 사과해야한다. 나는 단지 어셈블리에 대한 직감을 얻으려고 노력하고있다. 그리고 결과가 왜 잘못 되었는가에 대한 도움을 주시면 감사하겠습니다.어셈블리 - 런타임에 잘못된 행 인쇄

.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. :)" 

출력 : : : 코드는 다음, 첫 번째 출력

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. 

답변

3
la $v0,print4 # Is a... 
li $v0,4 

문자열 포인터가 $a0에 가야하지 $v0은 (코드에서 여러 이러한 오류가 있습니다).

+0

매우 도움이됩니다. "doh!" 이 언어의 순간 # 1. 주소가 범위를 벗어남에 따라 새로운 오류가 발생합니다. readout이 제안한 바와 같이 70 줄은 아니지만 [la $ a0, ($ t1) #p-> li $ v0,4 -> syscall] p는 큰 숫자가 아닙니다. (나는 23, 3, 기본적으로 30 이하.) 어떤 생각? 고맙습니다. :) – Ethan

+1

'print_string' syscall (4)를 사용하여 정수를 출력 할 수 없습니다 (이것은'$ t1'에 들어 있습니다). 그리고 만약 당신이 그 '라'로 무엇을하고 있었는지 생각한다면, 당신은 레지스터의 주소를 얻을 수 없습니다. 당신이해야 할 일은'move $ a0, $ t1' /'li $ v0,1' /'syscall'과 같은 것입니다. – Michael