cyphen156
2장 논리 연산 본문
1장에서 논리 게이트를 만들었으니
2장에서는 만들어진 논리게이트들을 조합해 산술논리연산장치(Arithmetic Logical Unit)를 만들 것이다.
ALU는 CPU에서 연산을 담당하는 핵심 부품이다.
먼저 컴퓨터는 항상 모든 연산을 2진수의 덧셈을 통해 처리한다.때문에 우리는 맨 처음 덧셈 연산을 수행해주는 가산기(Adder)를 만들어야 한다.
2진수의 덧셈 연산
예를 들어 10진법 수 2개 15, 6을 덧셈연산한다고 생각해보자
10진수 체계에서의 두 자리 수 덧셈은
한 자리 수 5+6은 1의 올림수가 발생하고, 결과가 1이고,
두 자리 수 1+0은 한 자리 수 덧셈연산에서 발생한 올림 수 1을 추가로 더해 2라는 결과를 출력하고,
최종적으로 21이라는 결과를 출력한다.
코드로 표시하면 이렇게 된다.
그럼 이걸 이진수로 표현하면 어떻게 될까?
우선 두 자리 수 정수이니 8비트 이진 표현법으로 변환해야 한다.
그 후 각 비트의 자릿수들에 대한 덧셈 연산을 수행한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print_bit(int bit) {
printf("%d", bit);
}
void print_bits(int bit1, int bit2, int carry, int step) {
printf("Step %d, bits: ", step);
for (int i = 0; i < 8; i++) {
if (i == 8 - step) {
print_bit(bit1);
}
else {
printf("0");
}
}
printf(" + ");
for (int i = 0; i < 8; i++) {
if (i == 8 - step) {
print_bit(bit2);
}
else {
printf("0");
}
}
if (carry) {
printf(" + ");
for (int i = 0; i < 8; i++) {
if (i == 7 - step) {
printf("1");
}
else {
printf("0");
}
}
}
printf("\n");
}
void print_result(int bit, int carry, int step) {
printf("Step %d, result: ", step);
for (int i = 0; i < 8; i++) {
if (i == 8 - step) {
print_bit(bit);
}
else {
printf("0");
}
}
if (carry) {
printf(" / ");
for (int i = 0; i < 8; i++) {
if (i == 7 - step) {
printf("1");
}
else {
printf("0");
}
}
}
printf("\n");
}
int main() {
// a = 15, b = 6, result = 연산 결과, carry = 올림 수
int a = 15, b = 6, carry = 0;
int a2[8] = { 0 }, b2[8] = { 0 }, result[8] = { 0 };
// 2진수로 변환
for (int i = 7; i >= 0; i--) {
a2[i] = a % 2;
a /= 2;
b2[i] = b % 2;
b /= 2;
}
printf("a2: ");
for (int i = 0; i < 8; i++) {
print_bit(a2[i]);
}
printf("\nb2: ");
for (int i = 0; i < 8; i++) {
print_bit(b2[i]);
}
printf("\n");
// 덧셈 연산하기
for (int i = 7; i >= 0; i--) {
print_bits(a2[i], b2[i], carry, 8 - i);
int temp = a2[i] + b2[i] + carry;
result[i] = temp % 2;
carry = temp / 2;
print_result(result[i], carry, 8 - i);
}
printf("\nFinal result: ");
for (int i = 0; i < 8; i++) {
print_bit(result[i]);
}
return 0;
}
생각보다 그리 간단하지 않다.
이제 덧셈 연산을 해봤으니 뺄셈은 어떻게 하는지 알아보자
생각보다 뺄셈연산은 간단하다
뺄셈 연산을 하는 수(b)를 2의 보수 형태로 2진 비트들을 모두 뒤집은 뒤(0은 1로, 1은 0으로)+1연산을 수행한 뒤 덧셈연산을 하면 된다.
가산기에는 반가산기와 전가산기가 있는데
전가산기는 2개의 반가산기로 구성되어있다.
자세한 내용은 이산수학과 디지털 논리 회로에서 다루겠습니다.
'수학/이산수학' 카테고리의 글 목록 (tistory.com)
'수학/디지털 논리 회로' 카테고리의 글 목록 (tistory.com)
//모든 자료들은 Nand2Tetris홈페이지에서 찾을 수 있습니다.
또는 cyphen156/Work-space: Studying (github.com)에서 찾으실 수 있습니다.
'프로젝트 > Nand2Tetris' 카테고리의 다른 글
3장 메모리 : 모든것은 결국 기억장치 관리다 (0) | 2023.07.10 |
---|---|
2장 프로젝트 : 가산기 (0) | 2023.07.07 |
1장 프로젝트 (0) | 2023.07.07 |
1장 논리 : Boolean (0) | 2023.07.06 |
컴퓨팅 시스템 구현하기 : Bottom Up (0) | 2023.06.27 |