2017-02-12 6 views
0

C 코드를 MIPS로 변환하는 방법에 대해 혼란스러워합니다. 나는 루프를 혼란스럽게하는 것처럼 보입니다. 나는 잘못된 명령을 사용하고있을 가능성이 있다고 생각합니다. 다음과 같이 내가이 일을 만든 C 코드는 다음과 같이 MIPS 번역에서MIPS에서 두 값 사이의 짝수 정수의 합을 계산하는 방법은 무엇입니까?

int main() 
{ 
    int x, y; 
    int sum = 0; 
    printf("Please enter values for X and Y:\n "); 
    scanf("%d %d",&x,&y); 


    if (x > y) 
    { 
    printf("\n** Error"); 
    exit(0); 
    } 
    while (x <= y) 
    { 
    if (x%2 == 0) 
     sum += x; 
     x++; 
    } 
    printf("\nThe sum of the even integers between X and Y is: %d\n\n",sum); 

    return 0; 
} 

내 시도는 다음과 같습니다

.data 
Prompt: .asciiz "Please enter values for X and Y:\n" 
Result: .asciiz "The sum of the even integers between X and Y is: \n" 

    .text 
li $v0,4    #load $v0 with the print_string code. 
la $a0, Prompt  #load $a0 with the message to me displayed 
syscall 

li $v0,5    #load $v0 with the read_int code for X 
syscall 
move $t0,$v0 

li $v0,5    #load $v0 with the read_int code for Y 
syscall 
move $t1, $v0 

while: 

    slt $t2, $t1,$t0 #$t1 = y $t0 = x 
    li $t3,2 
    div $t2,$t3 
    beq $t2,$0,else 
    add $s1,$s1,$t0  #s1 = s1 + x 
    addi $t0,$t0,1  #x++ 
    j while 

else: 
    li $v0,4 
    la $a0, Result 
    syscall 

    move $a0,$s1 
    li $v0,1 
    syscall 

이 내 오류 내 MIPS 코드에서 루프라고 생각합니다. 내 결과는 0을 계속 생성하고 내 코드가 루프를 확인한 다음 내 else 문으로 점프한다고 생각합니다.

추가 작업이 끝나면 나는 모든 정수의 합을 계산할 수있게되었는데 왜 그런지 정확히 알지 못합니다. 나는 1, 5,은 1 계산 입력하고 3 인 경우, 그래서 지금

while: 

    sle $t2, $t0,$t1  #$t1 = y $t0 = x 
    li $t3,2  #t3 = 2 
    div $t2,$t3  #$t2/2 
    beq $t2,$0, else #if ($t2/2 == 0), jump to the else, otherwise do else 
    add $s1,$s1,$t0  #s1 = s1 + x 
    addi $t0,$t0,1  #x++ 
    j while 

대신 짝수 합계의 단지 2

답변

1

해야하는 나에게 6을 제공합니다 : 여기 내 최신 업데이트입니다 내 자신의 질문에 대답하면, 주요 혼란은 가지와 관련이있다. 나는 이제 그것들이 서로 상반되는 일을하는 것을 이해합니다. 예를 들어, while 루프에서 "beq"를 설정하여 $ t2가! = 0 일 때 계산을 수행해야했습니다. 루프의 그래서 $ t2! = 0 일 때, 나는 "else"로 점프해서 다음 숫자를 찾는다. 그러나 나머지가 0이면 sum = sum + x의 수학을 수행합니다. 결론적으로, 주요 혼란은 가지에 대한 반대 사고에서 비롯되었습니다. 지금 내가 말하고자한다면 이해 :

동안

(A2 < A1)에 나는이 이해하기 전에

while: 
bgeu $a1,$a2, done 
    addi "whatever" 
b while 

done: 
     do done stuff 

로 작성해야, 나는 그것을 같은 상상력 $의 A1을 기록했다 , $ a2, done 그리고 그것이 타이핑되는 방식이 아닙니다. 논리적으로 말하자면, 만약 a1 < a2 ...하지만 실제로는 a1 < a2가 "done"으로 점프하고 계산을 건너 뛰는 것입니다. 그래서 나는 단지 정반대라고 생각해야했다.