본문 바로가기

컴퓨터 구조론( MIPS )

명령어 : 컴퓨터 언어 4

728x90
반응형

안녕하세요. WH 입니다

컴퓨터 구조 명령어 관련 벌써 4번 째 글이네요.

어디까지 쓸지 얼마나 쓸지는 아직 잘모르겠습니다만,

자세히 알려드리려고 노력해보겠습니다

 

판단을 위한 명령어

프로그래밍 언어에 if 문장으로 판단 기능을 표현하는데요. MIPS 에서는 어떻게 구현되어있는지 볼까요?

 

조건문

 

beq register1, register2, L1

bnq register1, register2, L2

 

beq는 branch if equal을 뜻하고 bne는 branch if not equal을 뜻한답니다. 이 두가지가 조건부 분기라 하는데요. ( conditional branch ) 예시를 보면서 이해해 볼게요

 

예시> i 와 j는 $s3 $s4 에 a, b, c 는 $s0, $s1, $s2에 해당한다고 가정해봅시다.

if ( i == j ) a = b + c; else a = b - c; 라는 문장을 컴파일한 코드는 어떻게 될까요? 

 

bne $s3, $s4, Else

add $s0, $s1, $s2

j Exit ( jump는 추후 다루도록 하겠습니다. )

 

Else: sub $s0, $s1, $s2

Exit:

 

이렇게 된답니다. 생각보다 쉽죠? 어렵나요? 간단한 문장이 조금은 복잡해 졌다와 어디로 jump 하라는 게 들어있는 정도랄까요? 여러분은 매우 똑똑하신 분들이니 쉽게 이해할거라 생각합니다.

 

순환문

 

  판단 기능은 둘 중 하나를 선택하는 ( if 문장 사용 ) 데도 중요하지만 계산의 반복( 순환문 사용 )에서도 중요합니다.  예시를 보면서 이해해 볼게요

 

예시 > i와 k가 레지스터 $s1,$s2에 할당되었고, A의 시작 주소가 $s3 저장되어 있다고 가정할 때

while ( A[i] == k )

        i += 1;

어셈블리 코드는 어떻게 되야할까요?

 

우선은 한글로 먼저 표현해 보겠습니다.

 

 

1. A[i]를 임시 레지스터에 적재하려면 주소를 알아야하는데 주소는 바이트로 표현 됨으로 *4를 해주자

( sll $t1, $s1, 2 )

 

2. 순환의 끝이 처음으로 돌아갈 수 있도록 루프를 구성하자

( LOOP: sll $t1, $s1, 2)

 

3. A[i]의 주소를 계산해야함으로, $t1에 $s3를 더하자

( add $t1, $t1, $s3 )

 

4. $t1에 저장된 주소를 이용해서 임시 레지스터에 적재하자

( lw $t0, 0($t1) )

 

5. A[i] != k 이면 빠져나가자

( beq $t0, $s2, Exit )

 

6. 같다면 i += 1을 하자

( addi $s1, $s1, 1 )

 

7. 루프로 돌아갈수 있도록 하고 조건을 만족하면 끝내도록 하자

( j LOOP

Exit: )

 

이를 정리하면, 아래와 같이 되겠네요

 

LOOP : sll $t1, $s1, 2

add $t1, $t1, $s3

lw $t0, 0($t1)

bne $t0, $s2, Exit

addi $s1, $s1, 1

j Loop

Exit:

 

뭔가 쉬운 것 같은데 어렵나요?? 아니면 쉽나요?? 와 여러분은 대단하신것 같아요. 쉽지 않은 내용이거든요! 여기까지 해셨다면 잘하고 계신겁니다.

 

참고 slt ( set on less than) 명령어

조건문에서는 보통 == or != 도 많이 사용하지만 대소 비교 역시 많이 사용하지요? 해당 명령어는 대소 비교에 많이 사용되는 명령어랍니다. 의미는 아래와 같아요

 

slt $t0, $s1, $s2 # $t0 =1 if $s1 < $s2

 

$s1 < $s2 라면 1을 아니면 0을 $t0에 저장하라는 명령어랍니다. 상수와 비교하는 경우도 많겠죠? 이 때는 stli라는 명령어를 사용한답니다. 그리고 MSB ( 최상위 비트 ) 0이냐 1이냐에 따라 음수냐 양수냐를 구분하는 경우가 있는데요, 부호가 있는 정수의 경우 slt를 부호가 없는 정수 MSB에 상관없이 모두 양수 인경우 sltu( set on less than unsigned )와 sltiu( set on less than immediate unsigned )를 사용한답니다.

 

Case/Switch 문

많은 언어는 case/switch 문을 가지고 있죠. python은 없었던 걸로 기억하는데 여튼, 여러 코드의 시작 주소를 표로 만들면 효율적으로 구현할 수 있답니다. 그렇게 구현된 프로그램은 점프 주소 테이블 또는 점프 테이블의 인덱스만 계상해서 해당 루틴으로 점프할 수 있죠. 프로그램은 점프 테이블의 주소를 레지스터에 적재한 후 레지스터의 주소를 사용해서 점프하게 되요. MIPS에서는 jr( jump register )라는 명령어를  갖고 있는데 이 명령어는 명시된 주소로 무조건 점프한답니다. 예시는 차차 설명하도록 할게요.

 

이번 글의 내용은 여기까지 입니다. 다루고자 하는 내용이 많아서 일까요.

조금은 천천히 다루고 있지만, 도움이 되길 바라겠습니다. 이상 WH였습니다

댓글은 큰 힘이 된답니다.

 

728x90
반응형