컴퓨터.반도체

컴퓨터 구조 1 - C to MIPS code

JROK 2023. 5. 31. 16:25

C to MIPS assembly - pointer

 

c언어와 지금까지 사용한 mips 명령어에 대해서는 이미 안다고 가정하고 코드에 대한 설명을 진행하겠습니다.

# int *a, *b, *c;
lui $s0, 0x1001 # 1 << 28
addi $s1, $s0, 4 # a = 1 << 28
addi $s2, $s0, 8 # b = a + 1
addi $s3, $s0, 12 # c = a + 2

# *b = 3;
li $t0, 3
sw $t0, ($s2)

# *c = -5;
li $t1, -5
sw $t1, ($s3)

# *a = *b + *c
lw $t2, ($s2)
lw $t3, ($s3)
add $t4, $t2, $t3
sw $t4, ($s1)

 

해당 코드는 3개의 포인터 변수 a, b, c를 사용하여 값을 할당하고 연산하는 코드입니다.

먼저 a, b, c 변수를 선언하고, a에는 1을 28번 왼쪽으로 시프트한 값을 할당합니다. 그런 다음 b와 c에 각각 a + 1, a + 2의 값을 할당합니다.

이후 b와 c가 가리키는 값에 각각 3과 -5를 할당하고, 마지막으로 a가 가리키는 값에는 b와 c가 가리키는 값을 더한 값을 할당합니다.

C to MIPS assembly - i++ ( 증감)

# int s = 0, i = 1;
li $t0, 0 # s = 0
sw $t0, s
lw $t1, i # i = 1

# s += i;
add $t0, $t0, $t1
sw $t0, s

# i++;
addi $t1, $t1, 1
sw $t1, i

# s += i;
add $t0, $t0, $t1
sw $t0, s


...


 

이렇게 진행됩니다 아래 내용은 위와 같은 내용이어서 코드는 생략할게요. 이 내용은 딱히 어려울 것 없는 내용이네요

 

 

Representing Instructions

 

MIPS 명령어는 32비트의 이진수로 인코딩되며, 이는 연산 코드(opcode)와 레지스터 번호를 작은 수의 형식으로 인코딩하여 규칙성을 가지게 됩니다. 레지스터 번호는 $t0-$t7이 8-15번 레지스터를, $t8-$t9이 24-25번 레지스터를, 그리고 $s0-$s7이 16-23번 레지스터를 나타내는 등 명확한 패턴으로 할당됩니다.

 

R - format instrution

 

 

MIPS의 R-format 명령어 형식은 6비트의 op, 5비트의 rs, rt, rd, shamt, 그리고 6비트의 funct 필드로 구성되어 있습니다. opcode를 확장한 function code와 함께 operation code(op), source register number(rs), destination register number(rd), shift amount(shamt) 등의 인자를 나타내게 됩니다.

 

예시를 한번 볼까요?

 

위 그림처럼

special은 0, $s1은 17, $s2는 18 ( 해당 레지스터에 넣는 번호로 그냥 1+1이 2인것처럼 당연한것입니다 ), $t0는 8입니다. add는 32네요

 

해당 내용을 2진수화해서 나열한 후, 5개씩 끊어서 16진수로 변경하면 02324020(16)이 나오고 해당 수를 MIPS simulator에 입력시킬 수 있습니다

 

 

16진수에 대한 간단한 추가 설명

16진법은 0~9까지의 10개의 수와, a~f까지의 6개의 알파벳으로 이루어진 기수 체계입니다.

이진수를 4비트씩 끊어서 16진수로 표현할 수 있으며, 각 16진수 자릿수는 0~15 사이의 값을 나타냅니다. 예를 들어, eca8 6420은 이진수 1110 1100 1010 1000 0110 0100 0010 0000을 16진수로 나타낸 것입니다.

 

앞으로 2진수와 16진수가 많이 사용됩니다.

 

16진수가 10진수에 익숙한 우리가 보기에는 어색할 수는 있어도

16진수는 0~9와 a~f까지의 16개의 숫자로 이루어져 있어서 숫자가 짧고 간단하게 표현할 수 있습니다. 또한, 컴퓨터에서는 2진수가 기본적인 데이터 단위이기 때문에, 16진수는 2진수와 1:1로 대응되어 변환 작업이 용이합니다. 따라서, 16진수는 컴퓨터 언어에서 자주 사용되는 숫자 체계 중 하나입니다. ( 10진수는 2의 배수가 아니어서 변환 작업이 어렵겠죠? )

 

결론

이거 하다보면 내가 컴퓨터인지 사람인지 살살 헷갈립니다. 정신 똑바로 차리고 따라오세요