2016-10-20 2 views
0

나는 사용자로부터 연속적으로 정수를 취하여 최소값을 $ s2에 저장하는 코드를 작성하려고합니다. If-Else with MIPS 어셈블리

내가 기본적으로

if ($s2 == 0) 
    $s2 = $t0 
else { 
    if ($t0 < $s2) 
    $s2 = $t0 
} 

을하려고하고 무엇을 C 코드를 표현, I는 입력 루프의 제로 외부와 $ S2를로드. 이것은 $ s2가 0인지 검사하고 최소값이기 때문에 현재 (첫 번째) 사용자 입력 ($ t0)으로 설정합니다. $ s2가 더 이상 0을 포함하지 않으면 $ s2에 이미 들어있는 것과 새로운 사용자 입력을 검사하고 그것이 더 작은 경우 새로운 최소값이됩니다.

MIPS 어셈블리에서 어떻게 구현할 수 있습니까?

나는 지금까지 이것을 가지고있다. (이것은 읽기라는 루프의 끝 부분이다.)하지만 첫 번째 int를 누르면 끝까지 건너 뛰고 반복하지 않고 min을 출력한다.

read: 
    ... 

    beq   $s2, $zero, LOAD  

    slt  $s6, $t0, $s2 
    bne  $s6, $zero, LOAD 

    j  read 

LOAD: 

    li  $s2, 0 
    addu  $s2, $s2, $t0 

답변

0

가장 큰 문제는 [아마도] "세상의 가장자리에서 떨어지는"있기 때문에 당신이 코드의 맨 아래에 점프를해야한다는 것입니다 :

read: 
    ... 

    beq  $s2,$zero,LOAD 

    slt  $s6,$t0,$s2 
    bne  $s6,$zero,LOAD 

    j  read 

LOAD: 

    # NOTE: you could use $zero as you did above to eliminate the "li" here 
    li  $s2,0 
    addu $s2,$s2,$t0 

    # NOTE/BUG: need to jump back to read loop 
    j  read 

코드를 조금 줄일 수 있습니다. 우리는 값이 을 체결 것을 알고 slt (대 sltu)에서

  1. . 따라서 $s0을 0 대신 최대 양수 값 (예 : 0x7FFFFFFF)으로 미리 채우는 경우 루프에서 첫 번째 beq을 제거 할 수 있습니다.
  2. slt 다음에 분기 감각을 바꾸면 여분의 j 명령을 제거 할 수 있습니다.
  3. 우리는 addu$zero를 사용하도록 변경 및 제거 할 수있는 li

li  $s2,0x7FFFFFFF   # load maximum positive value 

read: 
    ... 

    slt  $s6,$t0,$s2    # is new value < minimum? 
    beq  $s6,$zero,read   # if no, loop 

    addu $s2,$zero,$t0   # save new minimum value 
    j  read     # restart input loop