2011-09-14 4 views
1

이것은 내 지식이 부족해서 죄송합니다. 이것은 복제하려고하는 코드입니다.배열 요소를 비교합니다. switch 문/다른 경우 - 어셈블리 - MIPS

int A[3] = {0, 1, 2}; 
    int x; 
    for (int i = 0; i < 3; i++) 
    { 
     if (A[i] > 1) 
     x = 1; 
     else 
     { 
       switch (A[i]) 
       { case 0: 
         x = 2; 
        case 1: 
         x = 3; 
       } 
     } 
     printf(“%d”, x); 
} 

이것은 조립품에있는 코드입니다.

main: li $s0, 0 
      sw $s0, ($s7) #int A[0] = {0}; 
      li $s0, 1 
      sw $s0, 4($s7) #int A[1] = {1}; 
      li $s0, 2 
      sw $s0, 8($s7) #int A[2] = {2}; 
      li $s1, 1 #initialize x = 1 
      li $s0, 0 #initialize i = 0 
      li $s2, 3 # constant 3 
      li $s3, 1 # constant 1 


    start: blt $s0, $s2, for 
      j finish 

    for: add $t1,$s0,$s0 #reg $t1 = 2*i 
      add $t1,$t1,$t1 #reg $t1 = 4*i 
      add $t0,$t1,$s7 

    bgt $t0, $s3, exone #a[i] is greater than 1 how to increment the array up? 
    #switch statement 
    lw $t0, 0($t1) 
    jr $t0 
    j start 

     L0: add $s0, $s0, 1 
      li $s1, 2 
      j print 

     L1: add $s0, $s0, 1 
      li $s1, 3 
      j print 


     exone: add $s0, $s0, 1 
      li $s1, 1 
      j print 


     print: li $v0, 1 # print integer 
      move $a0, $s1 # what to print is stored at $s1 
      syscall 
      j start 



     finish: li $v0, 10 # exit system call 
       syscall 

어디서 잘못 컴파일 될지 모르겠지만 원하는 결과물을 출력하지 않습니다.

일부 정보를 기반으로 내 코드를 업데이트했습니다.

main: add $s0,$zero, $zero 
     li $s7, 200 
     sw $s0, 0($s7) #int A[0] = {0}; 
     addi $s0, $s0, 1 
     sw $s0, 4($s7) #int A[1] = {1}; 
     addi $s0, $s0, 1 
     sw $s0, 8($s7) #int A[2] = {2}; 
     li $s1, 0 #initialize x = 0 
     li $s0, 0 #initialize i = 0 
     li $s2, 3 # constant 3 
     li $s3, 1 # constant 1 

    #check to enter the for loop 
    for: blt $s0, $s2, enter 
       j finish 
    #enter the for loop 
    enter: add $t1,$s0,$s0 #reg $t1 = 2*i 
      add $t1,$t1,$t1 #reg $t1 = 4*i 
      add $t0,$t1,$s7 #reg A[i] 
      lw $t2, 0($t0) 
      bgt $t2, $s3, exone #a[i] is greater than 1 check 
      #switch statement 
      jr $t2 
      #just in case jump back to for loop 
      j for 

      #address for the switch statements 
     L0:  add $s0, $s0, 1 
       li $s1, 2 
      j print 

     L1:  add $s0, $s0, 1 
      li $s1, 3 
      j print 
     #address for the if else statement 
     exone: add $s0, $s0, 1 
      li $s1, 1 
      j print 


    print: li $v0, 1 # print integer 
     move $a0, $s1 # what to print is stored at $s1 
     syscall 
     j for 



    finish: li $v0, 10 # exit system call 
      syscall 

출력은 "231"이어야합니다.

+0

1) '휴식'없이 'swtich'를 원하십니까? 2)'$ t0, $ s3, exone'은 주소 *'& a [i]'를 '1'과 비교합니다. 3)'jr $ t0'은 잘못되었습니다 (점프 테이블을 코딩하려는 경우 이것이 방법이 아닙니다). – user786653

+0

괜찮습니까? 더 읽기 쉽고 제안을 기반으로 코드를 업데이트했습니다. – Pumphouse

답변

1
 # [snip] 
     add $t0,$t1,$s7 #reg A[i] 
     lw $t2, 0($t0) 
     bgt $t2, $s3, exone #a[i] is greater than 1 check 
     #switch statement 
     jr $t2 

jr가 점프 등록을 의미 잘못이며 여기에 0, 1 또는 2이고이 시점에서 a[i]을 포함 ($t2에 포함 된 주소로 점프 - 점프하지 않는 큰 주소).

당신은이 문제를 해결하기 위해 많은 일을 할 수있는 (난 당신이 C 코드에서 break 문을 의미 가정합니다), 그러나 여기 세트 스위치를 모방 몇 가지 빠른 테스트되지 않은 코드는 경우 - 문의 :

li $t3, 0 
beq $t2, $t3, L0 # if (a[i] == 0) goto L0 
li $t3, 1 
beq $t2, $t3, L1 # if (a[i] == 1) goto L1 
j print # else fall through 
0

Pumphouse : 먼저 프로그램에 적절한 목표가 없습니다.
당신이 좋아하는 몇 가지 사항을주의해야한다 모든하지만 ,

  • 스위치의 경우, 그렇지 않으면 큰 문제를 만들 수 있습니다 "기본"을 가지고 있어야한다.
  • 변수는 루프에서

  • 하지 프로그램

    의 상단에 항상 선언해야합니다. 같은 타입의 변수는 함께 선언해야합니다.

+0

그래서 입력 내용을 기반으로 코드를 수정하려고했습니다. switch 문에 기본 case를 어떻게 추가할까요? 나는 학교에서 슬라이드 예제를 가지고 있지만 그들은 기본 경우가 없습니다. – Pumphouse

0
.data 
array: .word 0 : 3 
.text 
.globl main 


main: la $s7, array 
     add $s0, $zero, $zero 
     sw $s0, 0($s7) #int A[0] = {0}; 
     addi $s0, $s0, 1 
     sw $s0, 4($s7) #int A[1] = {1}; 
     addi $s0, $s0, 1 
     sw $s0, 8($s7) #int A[2] = {2}; 
     add $s1, $zero, $zero #initialize x = 0 
     add $s0, $zero, $zero #initialize i = 0 
     li $s2, 3 # constant 3 
     li $s3, 1 # constant 1 

#check to enter the for loop 
for: blt $s0, $s2, enter 
     j finish 
#enter the for loop 
enter: add $t1,$s0,$s0 #reg $t1 = 2*i 
     add $t1,$t1,$t1 #reg $t1 = 4*i 
     add $t0,$t1,$s7 #reg A[i] 
     lw $t2, 0($t0) 
     bgt $t2, $s3, exone #a[i] is greater than 1 check 
#switch statement I would like to know how to properly do this with a jr 
     beq $t2, $zero, L0 
     beq $t2, $s3, L1 
#just in case jump back to for loop 
     j for 

#address for the switch statements 
    L0: add $s0, $s0, 1 
     li $s1, 2 
     j print 

    L1: add $s0, $s0, 1 
     li $s1, 3 
     j print 

    #address for the if else statement 
    exone: add $s0, $s0, 1 
     li $s1, 1 
     j print 


print:  li $v0, 1 # print integer 
     move $a0, $s1 # what to print is stored at $s1 
     syscall 
     j for 



finish: li $v0, 10 # exit system call 
     syscall 

그래서 이것은 내가 그것을 할 싶어 방법을 정확히하지 않았다 작동하지만 그것은 내가 스위치 문에서 주니어를 사용하고 싶었 작동하지만 난 아직 준비가 덜하지 않다.