이번에는 조건부 분기문을 한번 보도록 하겠습니다.
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이 더 낳을 것 같습니다.
'Embedded' 카테고리의 다른 글
XCode에서 SCM 15505 ERROR가 발생하면.. (0) | 2010.01.13 |
---|---|
[MIPS] Assembler 코드 살펴보기 - 4 (0) | 2010.01.03 |
[MIPS] Assembler 코드 살펴보기 - 2 (0) | 2009.12.29 |
[MIPS] Assembler 코드 살펴보기 (0) | 2009.12.26 |
Fedora 메일서버 세팅 (2) | 2009.12.21 |