개발/컴퓨터구조

[컴퓨터구조] Instruction과 MIPS를 알아보자 2편

IT의 타이탄 2023. 9. 6. 14:41
SMALL

지난 시간에는 컴퓨터구조를 왜 배워야하는지와 Instruction과 MIPS에 대한 간략한 의미에 대해 알아보았습니다.

 

 

만약 1편을 안보신 분들이라면 1편을 보고 오시는 것을 추천드립니다.

👉 Instruction과 MIPS에 대한 기초개념 정리

 

 

1편이 끝나가는 시점에서 저는 여러분들에게 다음과 같은 질문을 드렸었는데요.

 

 

" Source Operands(소스목적어)에 변수를 담으면 에러가 나는데 왜 에러가날까?"

"명령어로 addi, mulu, divu가 존재하는데 이건 무엇이고 sub는 왜 subi가 없을까?"

 

이거에 대한 대답할 수 있다면, 이번 글은 굳이 안 보셔도 좋을 것 같습니다. 하지만 대답이 어느 정도 나오거나 긴가민가 , 혹은 아예 답조차 생각이 나지 않는다면 이 글을 끝까지 읽어주시길 바랍니다.

 

 

3분의 시간만 투자하면 이번 글에서 말씀드릴 arithmetic instruction에 대해서 전부 알아가실 수 있을 것입니다.

 

Mips Arithmetic에 대해 자세히 알아보자

첫 번째 질문이었던 소스목적어에 변수를 담으면 에러가 나는 이유는 바로 변수 그 자체이기 때문입니다.

 

 

변수라고 함은 아직 값이 정해지지 않은 것이기에 어떠한 값들이 변수 안에 담길 수 있습니다.

 

 

지금 우리가 배우고 있는 Mips Arithmetic의 경우 산수이기 때문에 변수는 아마 정수 및 실수가 들어갈 것입니다.

 

 

변할 수 있는 값이라는 의미에 변수는 그럼 어디에 저장되는가 하면 바로 레지스터에 저장됩니다.

 

 

왜 레지스터에 저장돼요? 라고 의문을 가질 순 있겠지만, 저도 그것을 완벽하게 이해하지 못했습니다.

 

Mips Arithmetic 예제 사진

 

제가 이해한 바로는 위의 사진처럼 우리가 산수를 요청을 하게 되면 그값들은 메모리에 저장되고 그 연산들은 프로세서에서 처리가 됩니다.

 

 

이때, 프로세서안에 저장되어있는 간단한 메모리가 바로 레지스터입니다. 변수라고 하면 아직 정해지지 않는 값이기 때문에 레지스터에 저장되고 연산을 통해 값을 할당하는 과정을 거치게 될 것입니다.

 

 

그런 이유로 메인 메모리에 저장되지 않고 레지스터에 저장되기 때문에 단순하게 a,b,c라고 쓰면 안되고 레지스터라는 문자를 같이 붙여주어야합니다.

 

 

레지스터의 문자는 미국의 달러표기인 $과 동일합니다.

 

 

이렇게 이해를 했지만 완벽하게 이해를 하진 못해 일단은 1+1 = 2이다라는 세상이 정한 규칙에 따라 변수는 레지스터에 저장된다고 외워버렸습니다. (만약 답을 알고있다면 댓글로 적어주세요!)

 

 

레지스터 문자의 사용법을 위해 1편에서 작성한 예시를 가져와보겠습니다

 

f = g + h ;

 

이것을 Mips Arithmetic 식으로 표현하면 다음과 같습니다.

 

add $f $g $h (g에 저장되어있는 값과 h에 저장되어있는 값을 더해서 f에 해당하는 위치에 할당해라)

 

그렇다면 아래의 문장은 무슨뜻일까요?

 

f = ( g + h ) - ( i + j );

( g = $3 , h = $4 , i = $5 , j = $6)

 

여기서 중요한 것은 $가 붙여진 것은 우리가 생각하는 상수가 아닙니다. $가 붙여진 것은 레지스터에 위치해있는 값이라는 의미입니다.

 

 

즉 g = $3은 g가 3이라는 자연수라는 것이 아니라 레지스터 3번째에 있는 값이라는 의미인 것입니다.

 

 

그렇다면 상수를 담을 때는 언제일까요? 바로 레지스터 기호가 없이 숫자가 달려있을 때입니다.

 

 

우리는 이때, add라는 명령어가 아닌 addi라는 명령어를 사용하게 됩니다.

 

addi $3 $4 10 #4번째에 있는값과 10을 더해서 3번째에 있는값을 할당해라 (#은 코멘트기호로 주석입니다)

 

addi를 사용할 때에는 반드시 3번째 목적어만 상수여야 합니다. 2번째에는 레지스터기호를 붙여야하며 3번째는 상수를 사용해야합니다.

 

 

상수는 음수도 들어가기 때문에 정수의 집합이며, 특이케이스로 0이 들어갈경우 $0 혹은 $zero로 표현하기도 합니다.

 

 

그 이유는 레지스터 0번의 값은 항상 0이기 때문입니다. 절대로 바뀌지 않기 때문에 저런식으로 표현하곤 합니다.

 

 

그렇다면 이에 대한 질문 답변도 할 수 있을것입니다 subi는 왜없을까요?

 

 

사람들은 규칙이 많은 것을 싫어합니다. addi에서도 음수를 사용할 수 있는데 굳이 subi를 만들어야할까요? 필요가 없기때문에 없는 것입니다.

 

 

그러면 마지막으로 예제문제를 하나 풀어보고 글을 마무리하도록 하겠습니다.

 

예제문제1
 addi $8, $0, 10

 addi $9, $0, 16

 addi $10, $8, $9 일때의 $10의 값을 구하고 2진수와 16진수로 표현해보세요.

 

2진수와 16진수로 표현하는 이유는 1편에서 말씀드린 것처럼 어셈블러를 통해 컴퓨터는 2진수로 연산이 가능하기 때문입니다.

 

 

또한 instruction의 경우 32bit로 표현되기 때문에 작은 숫자의 경우 0이 굉장히 많을 것입니다.

 

 

10을 2진수로 표현하면 다음과 같습니다.

 

 

0000 0000 0000 0000 0000 0000 0000 1010 

 

 

굉장히 깁니다. 이를 16진수로 표현하면 다음과 같습니다.

 

 

0x0000 000A

 

 

0x를 붙이는 이유는 2진수와 16진수를 얼핏보면 오해하고 헷갈릴 수 있기 때문입니다.

 

 

예제에 대한 답은 댓글로 남겨주시면 제가 확인해드리도록 하겠습니다.

 


 

지금까지 Mips Arithmetic에 대해 알아보았습니다.

 

 

더 나은 정보를 남길 수 있도록 최대한 열심히 깊게 공부하도록 하겠습니다. 궁금한 점 있으시면 언제든 댓글 남겨주시길 바랍니다.

 

 

긴 글 읽어주셔서 감사드립니다 :)

LIST