Embedded2009. 12. 30. 17:09
이번에는 조건부 분기문을 한번 보도록 하겠습니다.
C 코드는 아래와 같습니다.

typedef long TYPE;

TYPE foo( TYPE i , TYPE j )
{
  if ( i > j ) return i ;
  else  return j;
}


나중에 타입을 바꿀 경우를 생각해서 typedef로 선언했습니다.
비교해서 큰 값을 반환하는 것이 요지입니다.

        .file   1 "test.c"
        .section .mdebug.abi32
        .previous
        .gnu_attribute 4, 1
        .text
        .align  2
        .globl  foo
        .set    nomips16
        .ent    foo
        .type   foo, @function
foo:
        .frame  $sp,0,$31               # vars= 0, regs= 0/0, args= 0, gp= 0
        .mask   0x00000000,0
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        slt     $2,$5,$4
        movz    $4,$5,$2
        j       $31
        move    $2,$4

        .set    macro
        .set    reorder
        .end    foo
        .size   foo, .-foo
        .ident  "GCC: (GNU) 4.4.2"


$4와 $5를 비교해서 그 결과를 $2에 저장합니다.
여기서 새롭게 등장하는 명령어가 movz입니다. 이 명령어는

if (GPR(rt) == 0 then rd <- rs

인 명령어입니다. 즉 주어진 값이 0 이면 이동 동작을 수행하라는 명령이죠.

위의 코드를 다시보면
slt 명령으로 set less then으로 세팅하고, 그 결과가 0 이면 $5를 $4로 아니면 그대로 진행합니다.
최종적으로 $4를 반환 레지스터인 $2로 이동함으로서 그 반환 값을 설정하도록 되어 있습니다.

ARM은 Instruction에 Condition Code를 넣어서 동작할 수 있도록 한 반면
MIPS는 Condition Code를 만들지 않고, 명령어를 운용하여서 분기문 내지 판단문을 처리할 수 있도록 하였는데, 위의 코드에서는 비교문을 SLT라는 명령어로 해결해서 다음 명령어에서 분기문의 효과를 내도록 되어 있습니다.

이럴때는 ARM Style이 더 낳을 것 같습니다.




Posted by GUNDAM_IM