2012-01-26 3 views
1

이것은 숙제 문제입니다. 내 코드가 올바른 답을 제공합니다. 내가했던 것처럼 해결책을 쓰는 것은 끔찍하게 혼란 스러웠고, 나를 데려 갔다. 이 코드를 코딩하는 더 좋은 방법이 있습니까? 최적화가 꺼져과더 간단한 방법이 있나요?

# Convert to MIPS: (((5 + 1) - (1 + 3) + (5 - 3)) - 1) – 5 + 3 

main: 
    li $t0 5 
    li $t1 1 
    li $t2 3 
    #   (((5 + 1) - (1 + 3) + (5 - 3)) - 1) – 5 + 3 
    # becomes ((($t0 + $t1) - ($t1 + $t2) + ($t0 - $t2)) - $t1) - $t0 + $t2 
    #   ((( $t3 ) - ( $t4 ) + ( $t5 )) - $t1) - $t0 + $t2 

    add $t3, $t0, $t1 
    add $t4, $t1, $t2 
    sub $t5, $t0, $t2 
    sub $t6, $t3, $t4 
    add $t6, $t6, $t5 
    sub $t6, $t6, $t1 
    sub $t6, $t6, $t0 
    add $a0, $t6, $t2 

    li $v0, 1    # print $a0 
    syscall 

    li $v0, 10   # system call 10... lets us exit, load 10 in $v0 
    syscall    # call the exit. 
+0

우연히 SPIM 에뮬레이터를 사용하고 있습니까? –

+0

QtSpim을 사용하고 있습니다. 내 코드는 간단한 산술 문제를 해결하기로되어있다. – Amy

+0

위의 산술에 대해 괄호는 기호 1을 제외한 경우 아무 것도 변경하지 않습니다. RAM 테이블에 숫자 (5,1, -1, -3, 5, 3, -1, -5, 3)를로드하고 값을 읽는 루프를 반복하여 총계에 추가 한 다음 값을 반환 할 수 있습니다. done. 매우 적은 수의 레지스터를 사용하고 간단한 루프가 될 것입니다. –

답변

0

당신이 MIPS C 컴파일러가있는 경우, 당신은 항상이를 컴파일 할 수

int main() 
{ 
    int one, three, five; 
    int result; 

    one = 1; 
    three = 3; 
    five = 5; 

    result = (((five + one) - (one + three) + (five - three)) - one) - 
     five + three; 
    return result; 
} 

다음 결과 오브젝트 코드에 objdump를 실행합니다. 귀하의 교수가 당신이 그것을하기를 바라는 방식이 아닙니다. 그러나 당신은 이미 그것을했고 당신은 더 많이 배울 것입니다.

편집는 :

나는 보통 어셈블러에 전달하기 전에 내 어셈블리 언어 파일에 대한 C 프리 프로세서를 실행합니다. 특정 레지스터에 대해 특정 레지스터를 사용하면 훨씬 쉽게 읽을 수 있습니다.

#define FIVE $t0 
#define ONE $t1 
#define THREE $t2 
#define FIVE_PLUS_ONE $t3 
#define ONE_PLUS_THREE $t4 
#define FIVE_MINUS_THREE $t5 
#define ACCUM $t6 

main: 
    li FIVE 5 
    li ONE 1 
    li THREE 3 
    //   (((5 + 1) - (1 + 3) + (5 - 3)) - 1) – 5 + 3 
    // becomes ((($t0 + $t1) - ($t1 + $t2) + ($t0 - $t2)) - $t1) - $t0 + $t2 
    //   ((( $t3 ) - ( $t4 ) + ( $t5 )) - $t1) - $t0 + $t2 

    add FIVE_PLUS_ONE, FIVE, ONE 
    add ONE_PLUS_THREE, ONE, THREE 
    sub FIVE_MINUS_THREE, FIVE, THREE 
    sub ACCUM, FIVE_PLUS_ONE, ONE_PLUS_THREE 
    add ACCUM, ACCUM, FIVE_MINUS_THREE 
    sub ACCUM, ACCUM, ONE 
    sub ACCUM, ACCUM, FIVE 
    add $a0, ACCUM, THREE 

    li $v0, 1    // print $a0 
    syscall 

    li $v0, 10   // system call 10... lets us exit, load 10 in $v0 
    syscall    // call the exit. 
+0

이것은 숙제에 바람을 피우는 것과 같습니다. – Amy

+0

당신은 이미 숙제를 마쳤습니다. 컴퓨터를 사용하여 자신의 일을하는 방법에 대해 자세히 배울 수있는 방법입니다. – nmichaels

0

코드에서 주석이있는 부분을 보았습니다.

예, 좀 더 직접적인 방법으로 할 수 있습니다. 발생하는 순서대로 일어나는 각 작업마다 다른 섹션을 만들면됩니다. 하지만 그것은 코드를 더 길게 만들 것이고 더 많이 읽을 수는 없습니다.

li $t0 5 
li $t1 1 
add $t2, $t0, $t1 

li $t0 1 
li $t1 3 
add $t3, $t0, $t1 

sub $t4, t2, t3 


li $t0 5 
li $t1 3 
sub $t2, $t0, $t1 

add $t3, $t4, $t2 

li $t0 1 
sub $t2, $t3, $t0 
#etc. 
관련 문제