컴퓨터.반도체

컴퓨터 구조 1 - 보수를 이용한 계산과 MIPS basic

JROK 2023. 5. 21. 16:33

Unsigned Binary Integers

 

아래 내용을 총 정리한 표입니다. 사실 이것만봐도...


X = X₁-12-1+Xn-22-2 + [?]+x₁2¹ + x 2⁰

여기서 X₁~Xn은 이진수의 1번째부터 n번째 자리까지를 나타내며, 2⁰~2¹은 각 자리수의 값을 2의 거듭제곱 형태로 표현하고 있습니다.

이진수 계산 예시를 들어봅시다. 32비트 이진수인 "0000 0000 0000 0000 0000 0000 0000 1011"를 2진수의 각 자리수에 해당하는 값으로 변환하여 계산할 때, 32비트 이진수의 범위가 "0 to +4,294,967,295"임을 알 수 있습니다.

 

2의보수 : 2s-Complement Signed Integers


X = −Xn-12−¹ + Xn-22¹-² + [?]+ x₁2¹ + x 2⁰

여기서 Xn은 부호 비트를 나타내며, 2의 보수법에서는 부호 비트가 0이면 양수, 1이면 음수를 나타냅니다. 

또 다시 이진수 계산을 해봅시다. 32비트 이진수인 "1111 1111 1111 1111 1111 1111 1111 1100"을 2진수의 각 자리수에 해당하는 값으로 변환하여 계산할때, 32비트 이진수의 범위가 "-2,147,483,648 to +2,147,483,647"임을 알 수 있습니다.

이진수에서 31번 비트는 부호 비트로 사용되며, 0이면 양수, 1이면 음수를 나타냅니다. 이로부터, n비트에서 가장 작은 음수는 -2^(n-1)이고 가장 큰 양수는 2^(n-1)-1이 됩니다.

그러나, -(-2^(n-1))은 표현이 불가능합니다.

부호가 없는 양수와 부호 있는 정수의 표현방법은 동일합니다. 이진수로 나타낸 부호 없는 양수와 부호 있는 정수는 같은 값을 나타내며, 이를 '2의 보수법'이라고 합니다.

이미지에서는 몇 가지 특정한 예시를 들어 이해를 돕고 있습니다. 예를 들어, 0은 모든 비트가 0으로 채워진 상태이며, -1은 모든 비트가 1로 채워진 상태입니다. 가장 음수인 경우는 1번째 비트가 1이고 나머지 비트가 모두 0인 상태이며, 가장 양수인 경우는 모든 비트가 0인 상태입니다.

 

위 그림처럼 가장 큰 음수는 100...이고, 가장 큰 양수는 011...111인것이죠

 

Signed Negation


부호 있는 수의 반전이란, 부호가 있는 수에서 수가 더해지거나 빼지는 것입니다.

1을 더해줄 경우, Complement and add 1으로 수행됩니다. 이 방법에서는 우선 수의 보수를 취한 후, 1을 더해줍니다. 'Complement'란 1을 0으로, 0을 1로 바꿔주는 것을 의미합니다.


예를 들어, x+x=1111...11 1₂ = −1에서 x의 반전 값은 -x가 됩니다. 이를 식으로 나타내면 x + (-x) = 0이 됩니다.

+2의 반전 값을 예시로 들어봅시다. +2는 이진수로 "0000 0000 ... 0010₂"로 나타내지며, 이를 반전하면 "1111 1111 ... 1101₂"가 됩니다. 여기에 1을 더해주면 -2가 되므로, +2의 반전 값은 -2가 됩니다.

이러한 방식으로, 부호 있는 수의 반전 값을 쉽게 계산할 수 있습니다.

 

sign extension

 

부호 확장은 숫자의 값을 보존하면서 비트 수를 늘리는 방법입니다. 이를 위해서는 먼저 숫자의 부호 비트를 확인해야 합니다. 부호 비트는 해당 숫자가 양수인지 음수인지를 나타내므로, 이를 확장하는 과정에서 반드시 고려해야 합니다.

MIPS 명령어 집합에서는 부호 확장을 다양한 목적으로 사용합니다. 예를 들어, addi 명령어에서는 즉시 값(immediate value)을 확장하고, load byte/halfword 명령어에서는 로드한 바이트/하프워드(byte/halfword)를 확장합니다. 또한, beq와 bne 명령어에서는 분기 거리(displacement)를 확장합니다.

8비트를 16비트로 확장할 때의 예시를 들어봅시다. 이를 위해서는 먼저 8비트 숫자의 부호 비트를 확인한 후, 이를 왼쪽으로 복제해야 합니다. 예를 들어, +2를 8비트 이진수로 "0000 0010"로 나타내면, 16비트로 확장하면 "0000 0000 0000 0010"가 됩니다. 이와 반대로 -2를 8비트 이진수로 "1111 1110"로 나타내면, 16비트로 확장하면 "1111 1111 1111 1110"가 됩니다.

이러한 방식으로, 부호 확장을 이해하고 적절히 활용함으로써 MIPS 명령어의 동작 원리를 이해할 수 있습니다.

 

간단한 예시

간단한 예시를 풀어보며 이번 공부를 마치겠습니다

MIPS assembly에서의 기본적인 연산입니다.

 

먼저 사용하는 명령어에 대해 정리해 드리겠습니다.

 

- li: 레지스터에 즉시 값을 로드합니다.
- add: 두 개의 레지스터 값을 더한 후, 그 결과를 다른 레지스터에 저장합니다.
- addi: 레지스터에 상수 값을 더한 후, 그 결과를 다시 레지스터에 저장합니다. add와의 차이는 변수, 레지스터값이 아닌 상수 값을 더한다고 생각하면 편하겠네요.
- sll: 레지스터 값을 지정한 비트 수만큼 왼쪽으로 시프트합니다. 시프트는 여기서 보다는 뒤에 제대로 설명하겠습니다. 현재는 이진수에서 001 을 sll 1을 한다면 010이 된다는 정도로 이해하는게 좋겠네요

 

이러한 명령어를 바탕으로 문제를 해결해보세요

 

 

멈추고 풀어보세요

 

 

 

 

 


# E1
li $1, 4
li $2, 5
add $3, $1, $2

 

E1: $1에 4를 저장하고, $2에 5를 저장한 후, $1과 $2의 값을 더한 결과를 $3에 저장합니다.


# E2
li $1, 7
addi $1, $1, 1

 

$1에 7을 저장하고, $1의 값을 1 증가시킵니다.


# E3
li $1, 1
sll $2, $1, 28

 

$1에 1을 저장하고, $1의 값을 28비트 왼쪽으로 시프트한 후, 그 결과를 $2에 저장합니다.

 

결론

1또는 2의 보수를 활용한 2진수 계산법과, MIPS 코드의 기본에 대해 배워봤습니다.

다음 시간부터는 본격적으로 MIPS코드에 대한 풀이가 들어가겠네요. 아직은 많이 어렵지 않으니 천천히 따라오시면 됩니다.