개발/컴퓨터구조

[컴퓨터구조] MIPS Arithmetic 곱셈, 나눗셈에 대해 알아보자 3편

IT의 타이탄 2023. 9. 12. 14:26
SMALL

지난 시간에는 MIPS Arithmetic이 무엇인지 Instruction이 무엇인지, add / addi에 대해 알아보았는데요

 

 

만약 아직 MIPS Arithmetic가 무슨 뜻인지도 모르겠고 헷갈린다면 아래의 글을 반드시 보고 오시길 바랍니다.

 

👉 MIPS Arithmetic에 대해 알아보자 1편

👉 MIPS Arithmetic에 대해 알아보자 2편

 

 

이번 글에서는 MIPS Arithmetic의 곱셈과 나눗셈은 어떻게 하는지에 대해 알아보고자 합니다.

 

 

만약 MIPS Arithmetic 곱셈 및 나눗셈에 대한 이해가 부족하거나 헷갈린다면 끝까지 읽어주시면 감사하겠습니다.

 

 

그럼 시작하겠습니다.

 

MIPS Arithmetic 곱셈 및 나눗셈

1. MIPS Integer Multiplication ( MIPS 정수 곱셈) 

정수의 곱셈의 경우 add와 sub와 다르게 Operand(목적어)를 2개만 사용합니다.

 

add O1 O2 O3 #add는 Operand가 3개 (Destination, Source1, Source2)

mult rs, rt #mult는 Oprerand가 2개

 

곱셈과 나눗셈의 Destination Operand는 프로그래머가 지정하는 것이 아니라, 레지스터가 임의로 설정하게 됩니다.

 

 

그렇기에 곱셈과 나눗셈은 2개의 목적어만 사용한다고 생각하시면 됩니다.

 

 

예전에 제가 레지스터는 32bit의 값을 저장한다고 말씀드렸었는데요. 만약 32bit의 값과 32bit의 값이 곱해지면 어떻게 될까요?

 

 

64bit의 값이 될 것입니다. 그렇게 되면 하나의 레지스터값에 저장할 수 없게 됩니다.

 

 

이런 이유로 곱셈과 나눗셈은 새로운 레지스터값에 저장되게 되는데요 이를 HI, LO라고 부릅니다.

 

HI : 64개의 bit 중 가장 큰 bit값부터 2^32까지 저장 
LO : 64개의 bit 중 가장 작은 bit값부터 2^31까지 저장

 

곱셈을 할경우 바로 레지스터값에 저장되지 않고 HI와 LO에 먼저 저장이 되는데요

 

 

HI와 LO를 레지스터값에 저장할 때에는 다음과 같은 코드를 입력해야 합니다.

 

mfhi rd  #HI를 저장하는 명령어와 레지스터값
mflo rd  #LO를 저장하는 명령어와 레지스터값

 

또한 addu 처럼 mult 또한 multu 라는 명령어가 존재합니다.

 

 

addu는 add undetected라는 뜻으로 오버플로우가 나더라도 연산을 실행하는 명령어인데요 multu도 같은 뜻으로 쓰일까요?

 

 

정답은 아닙니다.

 

 

multu의 경우 오버플로우가 나도 체크하지 않기 때문입니다. 왜냐하면 오버플로우가 생기는 값들을 버려버리기에 따로 예외가 발생하지 않습니다.

 

 

그러면 multu는 어떤 뜻으로 쓰일까요? 바로 unsigned라는 뜻으로 쓰입니다. unsigned는 부호가 없는 레지스터값을 곱할 때, 쓰는 명령어라는 뜻입니다.

 

 

mult와 multu의 가장 큰 차이는 부호비트를 고려하는가 아닌가 / 오버플로우 예외를 생성하는가 안하는가 입니다.

 

 

multu는 부호비트를 고려하지 않고 그대로 곱셈을 진행하며, 오버플로우 예외를 생성하지 않습니다.

 

 

반면에 mult는 부호비트를 고려하고 곱셈을 진행하며, 오버플로우 예외를 부호비트를 통해 체크합니다.

 

 

6과 7을 곱했는데 부호비트가 1이라면? (부호비트가 1이라는것은 2진수에서 음수를 표현함) 즉, 곱한 이후의 연산값에 대한 오버플로우를 체크합니다.

 

 

이에 대한 예시는 qtSpim이라는 응용프로그램으로 확인할 수 있습니다.

 

 

먼저 HI와 LO의 예시를 확인해보겠습니다.

 

MIPS Arithmetic Multplication 예시

곱셈을 진행한 후 HI = 0 / LO = 6이라는 값이 할당된것을 확인할 수 있습니다.

 

 

이를 레지스터값에 저장하기 위해 mflo $10 / mfhi $11을 통해 10번째 와 11번째의 레지스터값에 저장하려는 코드를 확인할 수 있습니다.

 

 

다음은 나눗셈에 대해 정리해보겠습니다.

 

 

2. MIPS Integer Division ( MIPS 정수 나눗셈) 

나눗셈도 곱셈과 마찬가지로 2개의 source Operands가 필요합니다.

 

 

곱셈과 달리 HI와 LO에는 몫과 나머지가 저장이 되는데요. 다음과 같이 저장됩니다.

 

HI : 32bit의 나머지가 저장된다.
LO : 32bit의 몫이 저장된다.

 

이에 대한 값을 레지스터에 저장하기 위해서는 곱셈과 마찬가지로 mfhi, mflo라는 명령어를 통해 저장할 수 있습니다.

 

 

나눗셈에 대한 qtSpim 예시를 보면 다음과 같습니다.

 

MIPS Arithmetic division 예시

 

왼쪽 빨간색 박스를 보면 몫과 나머지가 HI, LO에 저장되는 것을 확인할 수 있고 이를 10,11번의 레지스터값에 저장하기 위해서 mflo, mfhi라는 명령어를 입력하는 것을 확인할 수 있습니다.

 

 

해당 내용들은 기억이 나지 않을 때마다 보는 것을 추천드립니다.

 

 


 

지금까지 MIPS Arithmetic의 곱셈과 나눗셈에 대해 정리해보았습니다.

 

 

궁금하신 내용 있음 댓글 달아주시면 최대한 빠르고 친절하게 답변드리도록 하겠습니다.

 

 

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

LIST