컴퓨터 구조 1 - MIPS loop
AND Operations, OR Operations, NOT Operations
위 operation들은 c언어의 bitwise와 같이 작동합니다.
예를 들어 OR op에서는 위 그림과 같이 두 레지스터 중 1이 있는 레지스터는 모두 1이 됩니다.
MIPS는 NOR 3-operand 명령어를 가지고 있으며, a NOR b는 NOT(a OR b)와 같습니다.
그래서 not op을 하기위해서는 not $1 $2 $3이 아닌 아래와 같은 과정을 통해 답을 구합니다.
0을 넣음으로써 0과 다른 즉, 해당 값의 보수를 추출하게 됩니다.
Conditional Operations (조건 연산자)
분기하다라는 말의 뜻에대해 설명하고 갈게요
MIPS에서는 조건부 연산에 대한 내용이 있습니다.
레이블 지정된 명령어로 분기가 발생하는 조건을 충족하는 경우에만 분기합니다.
beq op은 rs와 rt가 같으면 분기하고,
bne 명령은 rs와 rt가 같지 않으면 분기하며,
j 명령은 지정된 명령어로 무조건 분기합니다. 조건이 충족되지 않으면 순차적으로 계속 실행됩니다. (j는 다른 프로그래밍 언어의 jump라고 생각하면 쉽죠??)
Compiling If Statements
C 코드를 MIPS로 변환하는 예시를 풀어봅시다
C code:
if (i==j) f = g+h;
else f = g-h;
MIPS code:
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit:
C언어의 if문을 MIPS 어셈블리 코드로 컴파일하는 과정을 보여주며, i와 j가 같으면 f에 g+h 값을 할당하고, 그렇지 않으면 f에 g-h 값을 할당합니다. MIPS 코드는 i와 j를 비교하고, 같으면 g+h를 f에 할당하며, 다르면 Else로 분기하여 g-h를 f에 할당합니다. 이후에는 Exit로 분기하여 프로그램을 종료합니다.
자세한 설명은 아래와 같습니다
=j: i와 j를 비교합니다.
f=g+h: i와 j가 같으면 실행되어 f에 g+h 값을 할당합니다.
bne $s3, $s4, Else: i와 j가 다르면 Else로 분기합니다. 여기서 $s3는 i의 레지스터, $s4는 j의 레지스터입니다.
$s0, $s1, $s2.: f, g, h의 레지스터 번호입니다.
Exit: 프로그램을 종료합니다.
Else: i와 j가 다를 경우 실행되는 레이블입니다.
sub $s0, $s1, $s2: i와 j가 다르면 실행되어 f에 g-h 값을 할당합니다.
Exit: 프로그램을 종료합니다.
Convert Loop to beq/bne
while문을 mips로 변환시키는 예제를 풀어보겠습니다.
를 아래와 같은 mips로 바꿔봅시다
$1이 5보다 작을 때까지 $2를 1씩 증가시킵니다. MIPS 코드는 L 레이블에 진입하여 $1이 5보다 작지 않을 때 EXIT 레이블로 분기합니다. 그렇지 않으면 $2를 1씩 증가시키고 다시 L 레이블로 분기합니다. 이후에는 EXIT 레이블로 분기하여 프로그램을 종료합니다.
MIPS 코드의 각 줄에 대한 추가 설명은 다음과 같습니다.
L: 무한루프를 위한 레이블입니다.
slti $3, $1,5: $1이 5보다 작으면 $3에 1을, 그렇지 않으면 0을 할당합니다.
beq $3,$0,EXIT: $3이 0이면(EXIT 조건이 false이면) L 레이블로 분기합니다.
nop: 다음 명령어를 실행하지 않습니다.
addi $2,$2,1: $2에 1을 더합니다.
jL: L 레이블로 분기합니다.
nop: 다음 명령어를 실행하지 않습니다.
EXIT: 프로그램을 종료하는 레이블입니다.
과제
위 이미지의 3가지 c코드를 mips코드로 바꾸어 보세요 어렵진 않습니다.
다음시간 처음에 답을 알려드릴게요
결론
MIPS에 대한 제가 설명하려는 내용이 슬슬 끝을 향해갑니다. 이제 지금까지 배운내용을 적용해볼텐데요. 생각보다 재미있습니다. 파이팅