2014-11-16 4 views
0

내 목표는 다음 Java 코드 (asm 파일의 맨 위에있는 주석 블록)를 mips 어셈블리 코드로 변환하는 것입니다. QTSpim에서 컴파일하려고하면 "0x0040007c에서 비 명령어 실행 시도"라는 오류 메시지가 표시됩니다. 또한 36 번째 줄에 두 번째 주 레이블이 사용되었다고 말하는 오류가 계속 발생하지만 이것이 가능한지는 알 수 없습니다. 어떤 도움을 주시면 감사하겠습니다. 그렇지 않으면 CPU가 바로 프로그램 후 메모리에 위치 할 일이 무엇이든 계속 실행됩니다, 당신은 그것을이 완료되면 명시 적으로 프로그램을 종료 할 필요가Java to mips assembly exercise

######################################################################## 
# program description: 
#Translate this into assembly: 
# 
#int w1 = 40; // use a register for this variable 
#int w2 = 20; // use a register for this variable 
#int total; // use a register for this variable 
#int result[4]; // note: int = 1 word = 4 bytes 
# 
#total = w1; 
#for (int i = 0; i < 4; i++) { 
# total = total + w2; 
# if (total > 100) { 
#  total = total - 100; 
# } 
# result[i] = total; 
# System.out.println(total); // C++: cout << total << '\n'; 
#} 
#return; 
# 
# 
# Arguments: w1, w2, total. 
# 
# 
# 
# 
######################################################################## 

    .data 
result:  .word 4 

    .text 
main: 
    li  $s0, 40  #w1 
    li  $s1, 20  #w2 
    li  $s2, 0  #total 
    li  $s3, 0  #loop counter 
    li  $s4, 4  #loop conditional 
    li  $s5, 100 #if conditional 

    add  $s2, $s2, $s0 

    loop: 
    beq  $s3, $s4, end #if the counter is greater than 4, exit loop 
    add  $s2, $s2, $s1 #total = total + w2 
    bgt  $s2, $s5, then #if total is greater than 100 branch to then 

    then: 
    sub  $s2, $s2, $s5 #total = total - 100 
    sw  $s2, result  #store total into result 
    li  $v0, 1   #print out total    
    move $a0, $s2   
    syscall 

    else: 
    sw  $s2, result  
    li  $v0, 1   #print out total 
    move $a0, $s2 
    syscall 

    end: 

답변

0

:

여기 내 코드입니다. SPIM (또는 SPIM에서 파생 된 다른 시뮬레이터 중 하나)을 사용하면 다음과 같이 syscall 10을 사용할 수 있습니다.

# syscall 10 == exit 
li $v0,10 
syscall