2014-11-25 1 views
1
# Programming Project 2 
# Noah Heath 
# @02685972 

.data # Data declaration 
     # A+B -(C-D x E) 

string1: .asciiz "Please enter an integer from range 0 to 32768: " 
string2: .asciiz "Next integer: " 
string3: .asciiz "Invalid input. Start over. " 
userinput: .space 100 
var6: .asciiz "The result of A+B -(C-D x E) is: " 
.text 

main: 
    la $a0, string1 #load string one and print 
    li $v0, 4 
    syscall 

    la $a1, userinput 
    li $t1, 5 #set temporary variable to 5 
    li $t0, 0 #start of counter 

input: 
    beq $t0, $t1, exit 
    li $v0, 5 # read integer 
    syscall 
    blt $v0, $zero, input # if input is less than zero 
    bgt $v0, 32768, input # if input is greater than 32768 
    sw $v0, 0($a1) 
    addiu $a1, $a1, 4 

exit: 
    la $t3, userinput # stores base address of user input array into $t3 
    lw $t4, ($t3) # load first number 
    lw $t5, 4($t3) # load second number 
    lw $t6, 8($t3) # load third number 
    lw $t7, 12($t3) # load fourth number 
    lw $t8, 16($t3) # load fifth number 
    add $s1, $t4, $t5 # adds 1 and 2 into $t0 
    mult $t7, $t8 # multiplies 2 and 3 
    mflo $s2 # retrieves from register 
    sub $s3, $t6, $s2 # subtracts 7 from 6 
    sub $s4, $s1, $s3 # subtracts 1 from 3 
    move $a0, $s4 # moves result into a0 

    li $v0, 1 # instruction to print result 
    syscall # call operating system to perform operation 

    li $v0, 10 # exit instruction 
    syscall 

나는 내 코드가 사용자 정수를 읽고 저장하지 못하는 이유를 알아 내려고 노력하고 있습니다. 나는 모든 것이 구문 적으로 정확하다고 확신한다. 누군가 내가 잘못 등록을 사용하고 있는지 이해할 수 있습니까?MIPS- 정수 읽기 오류

QTSpim에서 예외 발생 PC = 0x00400060입니다.

그런 다음 가게에서 정렬되지 않은 주소 = 0x1001005b라고 말합니다.

그것은 (I 때문에 배열 인덱싱 방식 있으리라 믿고있어. 네 단위로 계속

예외 5 저장소에 주소 오류]가 발생하고

Exception 4 [Address error in inst/data fetch] occurred and ignored(repeats 4 times) 
을 무시

최종 오류 메시지 사용자 입력을 요청 코드 아무 문제가 없다

+0

내가 처음 저장 한 후 다른 번호를 읽을 input''로 다시 이동 코드에 아무것도 표시되지 않습니다 . 그리고'$ t0'를 증가시키지 않는 것처럼 무한 루프를 가졌을 것입니다. – Michael

+0

그 것들은 내가 프로그램에서 가지고 있었던 것들 이었지만 돌아가서 편집했다. 나는 다시 넣지 않았다. 나의 문제는 첫 번째 숫자를 입력하려고 할 때 오류가 발생한다는 것이다. –

+0

도구/OS에서 발생하는 오류에 관해 질문 할 때마다 질문에 정확한 오류 메시지를 포함시켜야합니다. – Michael

답변

2

.

나는 당신의 문제는 사용자가 정렬되지 않은 주소 (sw $v0, 0($a1)를 발행 라인)에 입력 한 내용을 저장하려고하는 것입니다 같아요.

당신은 당신의 userinput 라벨 전에 지시 .align 2을 추가해야합니다 예 :

string3: .asciiz "Invalid input. Start over. " 
.align 2 
userinput: .space 100 
+0

감사합니다. 나는 아직도 MIPS에 익숙하지 않고 시간 제약 때문에 지시가 급하게 돌진했다. 그게 내 문제를 해결하는 이유를 설명해 주시겠습니까? –

+0

@NoahHeath : MIPS의 ** word ** 메모리 액세스가 단어 정렬되어야하므로 문제가 해결됩니다. 어셈블러 지시문'.align 2'는 예제 ('userinput')의 다음 데이터가 워드 경계에서 정렬되도록합니다. – gusbro

+0

Ahhh는 사실 지금 이해가 가쁘다. 무리 감사. –