본문 바로가기
CS/컴퓨터 구조

Arithmetic instructions

by Mintta 2023. 9. 5.

Arithmetic instructions

  • 위로 갈수록 사람에게 친화적, 아래로 갈 수록 기계에게 친화적.
  • 한줄당 instruction 하나.
  • 메모리에 저장되어있음.

컴퓨터구조의 큰그림

컴퓨터의 4가지 핵심 부품

  • CPU (Central Processing Unit)
  • Main Memory (주기억장치, 이하 메모리)
  • Secondary Storage (HDD, SSD 등)
  • Input/Output IO Device (입출력장치)

시스템 버스

  • 아직 추가되어야할 게 더 있지만 대략적으로 그린다면 왼쪽과 같은 느낌. (혼공컴운 책 참조)
  • 시스템 버스는 컴퓨터의 4가지 핵심 부품이 서로 정보를 주고받는 통로입니다.
    • 주소 버스
    • 데이터 버스
    • 제어 버스

 

processor는 CPU의 다른말. 운체에서의 프로세스와 혼용X !

  • 프로세서(CPU)에서 메모리에서 저장되어있는 기계어를 가지고 작업을 수행합니다.
  • Datapath.즉, 위에서 말한 데이터 버스에 해당된다. 여기에는 데이터들이 오고가고
  • Control은 위의 제어 버스에 해당. 컨트롤 타워에서 지금 지시하고 있습니다.

ISA (Instruction Set Architecture)

컴퓨터(CPU)에서 사용되는 명령어들의 집합 및 그 정의.

어떤 Instruction 아키텍쳐던 간에 Instruction은 아래와 같이 3종류로 나뉘어집니다.

 

Registers

CPU내부에 있는 작고 빠른 임시의 메모리. (자주 엑세스되는 데이터를 위함)

  • MIPS 아키텍처에서는 32개의 레지스터들을 가지는데, 각 레지스터는 32bit이다.
  • 32 x 32-bit register file (레지스터의 모음)
  • 32-bit 데이터를 1 word라고 부른다.
  • 1 byte = 8 bit
📌 Word란?
CPU가 한 번에 처리할 수 있는 데이터 크기를 의미합니다. 만약 CPU가 한 번에 16bit를 처리할 수 있다면 1word는 16bit가 되고, 한 번에 32bit를 처리할 수 있다고 한다면 1word는 32bit가 됩니다.

정의된 워드의 절반 크기를 half word. 1배 크기를 full word, 2배 크기를 double word라고 부릅니다. 워드 크기가 큰 CPU는 한번에 처리할 수 있는 데이터가 많습니다. 워드 크기는 CPU마다 다르지만, 현대 컴퓨터의 워드 크기는 대부분 32bit 또는 64bit입니다.

2진수와 16진수

2진수 4자리가 16진수 1자리.

실제 컴퓨터가 인식하는 모든 데이터들은 2진수로 되어있지만, 사람이 보기 편하게 우리는 16진수를 활용한다.

예) 십진수 26을 2진수로 바꿔보면?

→ 0b11010

위의 2진수를 다시 16진수로 바꿔보면?

→ 0x1A

Q: sub명령어는 있는데 subi명령어는 왜 없나요?

add와 addi는 존재하는데 sub는 sub만 존재하고 subi는 없는 이유?

→ 상수값을 빼는데에는 2의 보수 개념을 활용해서 더해주면 되기 때문에.

Signed and Unsigned Numbers

Unsigned Numbers

2진수로 양수와 음수를 표현하는 법을 알아보자.

 

0번 비트를 가장 아래 자리부터 쓴다면 가장 높은 비트는 31비트.

이 때 31번 비트를 MSB라 하고 0번 비트를 LSB라고 합니다.

Unsigned의 경우에는 31bit가 의미하는 바는 x31(31비트의 값) X 2^31이 된다.

 

따라서 unsigned의 경우 위와 같이 0~약 42억까지의 수를 표현할 수 있다.

위에서 sub는 있는데 subi는 없다고 앞서 언급했었다. 그렇다면 $t0 = $t1 - 1 과 같은 빼는 연산은 어떻게 해야할까?

addi $t0, $t1, -1 이렇게 -1 을 더해주면 된다 !

이 때 음수는 어떻게 표현해야할까??

Signed Numbers

 

Signed Number인 경우(음수, 양수 모두 표현) MSB를 flag값으로 활용한다.

MSB가 0이라면? 양수. 1이라면? 음수를 나타낸다.

따라서 수 자체를 표현할 수 있는 비트는 32bit에서 한 bit가 줄어든 31bit만큼의 수를 표현할 수 있다.

그래서 Signed number의 경우 약 42억까지 표현할 수 있었던데 반해, 그의 절반인 약 21억까지의 수를 표현할 수 있게 된다.

이렇게 표현하는 것을 2의 보수 표현이라고 한다.

2의 보수

2의 보수의 사전적 의미는 ‘어떤 수를 그보다 큰 2^n에서 뺀 값’을 의미한다.

예를 들어, 0b11(십진수로 3)의 2의 보수는 0b100(십진수 4)에서 0b11을 뺀 0b01 (십진수 1)이 된다.

사전적 의미를 떠나서 쉽게 표현하면, 0과 1을 모두 뒤집고 1을 더하면 그것이 곧 2의 보수가 된다.

MSB를 살펴보면 MSB의 값은 이제 x31 * -2^31이 된다.

그래서 이제 실제 뺄셈 효과를 내고 싶다면 어떻게 할까?

만약 -2를 더해주고 싶다하면 +2의 2의 보수를 만들면 된다 !

이제 거꾸로도 해보자

위에서 적었듯이, 중요한 점은 2의 보수 표현을 진행하면서 수에 대한 절대값을 얻고, 기존의 MSB로 양수. 음수를 판단해서 부호를 붙여주면 된다 !

💡 이렇게 2의 보수 표현을 진행하는 것은 언제나 음수 일 때 ! 양수일때는 그냥 계산해서 읽으면 된다 !
  • PDF


2의 보수를 활용해서 a-b를 하고싶을 때 a + (-b)처럼 만들어서 연산한다.

Overflow

Signed number기준 양수의 가장 높은 수 2,147,483,647에 -(-2)연산을 해보자

 

위와 같이 계산결과가 -2,147,483,647이 나온 것을 확인할 수 있다.

(계산결과에 2의 보수를 적용하면 수의 절대값을 알 수 있고 해당 절대값에 기존 Signed bit가 1이기 때문에 -를 붙이면 됨.)

분명 2,147,483,647에 -2를 뺐는데, 즉 +2를 한 셈인데, 2,147,483,649가 아닌 전혀 다른 -2,147,483,647이 나왔다.

왜 이런일이 일어날까??

Signed bit로 MSB를 쓰기 때문에

0111 1111 1111 1111 1111 1111 1111 1111는 signed number가 표현할 수 있는 가장 큰 양수이다. 그렇기 때문에 이보다 큰 수는 표현할 수 없기 때문에 전혀 다른 이상한 연산결과가 나타나게 되는 것이다. 이런 현상을 overflow라고 한다.

즉, 연산의 결과가 word(여기선 32bit)로 표현될 수 없을 때 overflow가 나타난다.

아래 표와 어떤 경우들이 있는지 함께 살펴보자.

  Operand A  Operand B Result: indicating overflow
1. A+B ≥ 0 ≥ 0 < 0
2. A+B < 0 < 0 ≥ 0
3. A-B ≥ 0 < 0 < 0
4. A-B < 0 ≥ 0 ≥ 0

1. 양수 + 양수 = 양수 인데 음수(-)가 나오면 overflow.

2. 음수 + 음수 = 음수 인데 양수(+)가 나오면 overflow.

3. 양수 - (-음수) = 양수 인데 음수(-)가 나오면 overflow.

4. 음수 - 양수 = 음수 인데 양수(+)가 나오면 overflow.

 

Overflow가 발생하면 kernel code로 넘어가게 되고 kernel의 exception handler가 이를 처리한다.

Unsigned Add/Sub

  • addu
  • subu
  • addiu

unsigned으로 처리해서 overflow를 detect하지 않는다. (overflow 발생X)

Multi

곱셈은 값이 크기 때문에 2개의 32bit 레지스터를 사용한다.

  • HI
  • LO

해당 레지스터들은 특수한 레지스터들이기 때문에 해당 레지스터들에 저장된 결과값들을 사용하기 위해서는 일반 레지스터로 값을 옮기는 명령어가 따로 존재하고 해당 명령어들을 사용해서 값을 읽어와야한다.

  • mfhi (move from HI)
  • mflo (move from LO)

Div

overflow나 divide by zero는 소프트웨어가 체크함.

  • HI: 나머지
  • LO: 몫

댓글