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.
매우 도움이됩니다. "doh!" 이 언어의 순간 # 1. 주소가 범위를 벗어남에 따라 새로운 오류가 발생합니다. readout이 제안한 바와 같이 70 줄은 아니지만 [la $ a0, ($ t1) #p-> li $ v0,4 -> syscall] p는 큰 숫자가 아닙니다. (나는 23, 3, 기본적으로 30 이하.) 어떤 생각? 고맙습니다. :) – Ethan
'print_string' syscall (4)를 사용하여 정수를 출력 할 수 없습니다 (이것은'$ t1'에 들어 있습니다). 그리고 만약 당신이 그 '라'로 무엇을하고 있었는지 생각한다면, 당신은 레지스터의 주소를 얻을 수 없습니다. 당신이해야 할 일은'move $ a0, $ t1' /'li $ v0,1' /'syscall'과 같은 것입니다. – Michael