Computer >> 컴퓨터 >  >> 하드웨어 >> CPU

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

우리가 컴퓨터에 대해 가장 먼저 배우는 것 중 하나는 컴퓨터가 0과 1만 이해한다는 것입니다. , 또는비트 .

반면에 우리 인간은 십진법을 통해 숫자를 전달합니다. 이 시스템은 더하기 및 빼기 기호(+ 및 -)와 함께 0에서 9까지의 숫자를 사용하여 양수 또는 음수를 나타냅니다.

컴퓨터는 두 자리 숫자만 사용할 수 있으므로 – 0과 1 – 그 당시 엔지니어와 수학자들은 음수를 표현하고 산수를 수행하는 영리한 기술을 설계했습니다. 이러한 기술의 아름다움을 살펴보겠습니다.

먼저 컴퓨터 작동 방식에 대한 몇 가지 배경 지식

소프트웨어, 이미지, 텍스트, 비디오, 숫자 및 그 사이의 모든 것은 컴퓨터에서 가장 낮은 수준에서 0과 1입니다.

이미지, 텍스트, 비디오 및 숫자의 경우 이러한 항목이 0과 1이 되는 방식을 결정하는 인코딩 체계가 있습니다. 예를 들어 텍스트의 경우 ASCII 및 유니코드입니다.

우리가 코딩하는 소프트웨어 프로그램은 컴파일러와 어셈블러를 통해 0과 1이 됩니다. 기계 코드(또는 기계 명령)로 알려진 0과 1의 집합은 프로세서가 실행하기 전에 먼저 컴퓨터의 주 메모리(RAM)에 저장됩니다.

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유
패치 디코드 실행 주기는 John von Neumann 경이 설계했습니다. 모든 디지털 컴퓨터는 이 주기를 따라 기계어 코드를 실행합니다.

프로세서는 가져오기에 의해 실행 주기를 시작합니다. 주 메모리의 명령을 받은 다음 프로세서의 제어 장치가 디코딩합니다. 이러한 명령어는 연산 코드(opcode)와 피연산자의 두 부분으로 나뉩니다.

opcode는 ADD(추가), JMP(점프), INC(증가) 등과 같이 수행해야 하는 추가 작업을 결정합니다. 피연산자는 해당 연산이 수행될 값(또는 메모리 위치)입니다.

디코딩된 명령어는 실행을 위해 ALU(Arithmetic and Logic Unit)로 전송됩니다. . ALU에서 명령어는 피연산자의 opcode를 기반으로 실행되고 결과는 메모리에 다시 저장됩니다.

예를 들어, 어셈블리 코드 ADD eax, 42 어셈블러에 의해 먼저 기계어 코드(0과 1)로 바뀝니다. 그런 다음 가져오기-디코드-실행 주기가 시작되기 전에 주 메모리에 저장됩니다.

ADD eax, 42에 대한 기계어 코드를 가져올 때 메모리가 완료되면 명령어가 디코딩됩니다. 디코딩된 출력은 opcode가 ADD임을 나타냅니다. 피연산자는 eax입니다. 및 42 .

eax 레지스터는 프로세서에 의해 즉시 액세스될 수 있는 프로세서에 내장된 메모리 위치입니다. eax 레지스터는 대부분의 프로세서에서 누산기라고 합니다.

ADD eax, 42 어셈블리 코드는 eax의 현재 값에 42를 추가하도록 설계되었습니다. (누산기)를 등록하고 그 합계를 eax에 저장합니다. . eax = eax + 42입니다. .

현재 eax 는 20입니다. 이것은 eax의 값이 ADD eax, 42 실행 후 20 + 42 =62가 됩니다.

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유
EDVAC는 미 육군 탄도 연구소용으로 제작된 최초의 전자 바이너리 컴퓨터 중 하나입니다. (이미지 출처, 공개 도메인).

EDVAC와 같은 초기 컴퓨터의 설계는 지루한 수학적 계산을 더 쉽고 빠르게 만들고자 하는 열망에서 시작되었습니다.

컴퓨터를 계산하는 모든 책임은 두 개의 숫자를 더하는 회로인 가산기의 어깨에 있습니다. 뺄셈, 곱셈, 나눗셈과 같은 정교한 연산은 회로에서 가산기를 사용하기 때문입니다.

궁극적으로 컴퓨터는 논리 기능을 갖춘 빠른 ​​산술 기계일 뿐입니다. 이진 산술 설계(양수 특히 음수)의 문제점과 아름다움을 이해하는 것은 컴퓨터 프로세서의 가장 기본적인 개념 중 하나입니다. .

먼저 십진수를 이진수로 표현하는 방법과 두 개의 이진수 값을 더하는 방법을 살펴보겠습니다. 그런 다음 우리는 아름다움을 탐구하기 시작할 것입니다.

바이너리 시스템 작동 방식

872500을 읽으라고 하면 , 아마도 872.5K라고 말할 것입니다. . 우리의 마음이 이것을 어떻게 하는지 살펴봅시다.

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

우리는 오른쪽에서 첫 번째 자리에 1의 자리를 할당한 다음 오른쪽에서 두 번째 자리에 10의 자리를 할당하고 오른쪽에서 두 번째 자리에 100의 자리를 할당하고 100의 자리를 세 번째에 할당하는 식으로 매번 10의 거듭제곱으로 증가합니다.

각 자리에 있는 10의 거듭제곱은 그 자리의 가중치입니다. 백 번째 자리의 무게는 백입니다. 각 장소의 숫자에 해당 장소의 무게를 곱하고 모두 합하여 완전한 숫자를 얻습니다.

위의 다이어그램에서 각 장소의 가중치 증가가 10^0부터 시작하여 10의 거듭제곱임을 알 수 있습니다. 10^5 . 이것이 십진수를 10진법이라고 하는 이유입니다.

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

바이너리에서 각 장소의 가중치는 2의 거듭제곱으로 증가합니다. 이는 장소의 가중치가 2^0에서 시작한다는 것을 의미합니다. 2^something에서 끝남 . 그것이 유일한 차이점입니다.

00110101 십진법은 53으로 변환됩니다. 컴퓨터는 인간이 십진법을 해석하는 것과 같은 방식으로 이진법을 해석합니다. 즉, 각 자리의 자릿수에 가중치를 곱하고 합산하는 것입니다.

1과 0을 추가하는 방법

덧셈은 십진법에서 수행되는 것과 거의 같은 방식으로 이진법으로 작동합니다. 예를 통해 알아보겠습니다. 두 개의 이진수를 추가합니다. 1101 (13) 및 1100 (12).

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

십진법에서 하는 것처럼 1의 자릿수(2^0 ). 1과 0을 더하면 1이 됩니다. 그래서 거기에 1을 넣습니다. 나와 함께 있으면 전체 그림을 얻을 수 있습니다.

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

0 더하기 0은 0입니다. 계속 진행합니다.

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

1 더하기 1은 2입니다. 그리고 2진수로 2는 10로 표시됩니다. . 1을 다음 자리로 옮기고 현재 위치의 결과로 0을 유지합니다. 이것은 소수점 이하 한 자리에서 9를 초과하는 것과 같지 않습니까?

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

거기에 2개의 1과 이전 위치에서 이월된 1개의 1이 있으므로 총 3개의 1이 있습니다. 합계는 3이고 바이너리 3은 11입니다. 그래서 11을 작성합니다. . 최종 결과는 11001가 됩니다. 또는 10진수 형식의 25, 실제로는 13 + 12입니다.

위의 계산은 결과를 저장하는 데 사용할 수 있는 5비트가 있다고 가정합니다. 4비트 컴퓨터가 이 추가 작업을 수행하면 결과를 저장하는 데 4비트만 사용할 수 있습니다.

이 다섯 번째 비트를 오버플로라고 합니다. 4비트 컴퓨터에서. 정수 산술에서 오버플로 비트는 무시되거나 버려집니다. 그래서 우리는 1001을 얻었을 것입니다. (9) 4비트 컴퓨터를 사용하는 경우 결과입니다.

이진 산술 설계의 아름다움

계속 진행하기 전에 이해해야 하는 두 가지 중요한 용어는 최하위 비트입니다. 및 최상위 비트 .

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

가장 오른쪽에 있는 비트는 최하위 비트입니다. 가장 작은 자릿수(2^0 ). 그리고 가장 왼쪽에 있는 비트가 최상위 비트입니다. 가장 높은 자릿수(2^7 ).

세계에 양수만 있었다면 이것이 이 기사의 끝이었을 것입니다(우리는 이미 소수를 이진수로 표현하는 방법과 이진수로 더하는 방법을 배웠기 때문입니다).

고맙게도 음수도 있습니다.

CPU의 산술 설계의 아름다움은 부정에 있습니다.

그렇다면 컴퓨터는 어떻게 음수를 나타내고 음수에 대한 산술은 어떻게 작동합니까? 이 문제에 대한 인코딩 방식을 살펴보겠습니다.

아래 섹션에서는 개념을 이해하기 위해 4비트 컴퓨터로 작업할 것입니다. 즉, 다섯 번째 비트는 오버플로로 처리됩니다. 16비트, 32비트 또는 64비트와 같은 모든 CPU 아키텍처에 동일한 원칙이 적용되어 산술을 수행합니다.

부호 크기 인코딩 접근 방식

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

1101 이 인코딩 체계에서 10진수 형식은 -5입니다. 가장 왼쪽 또는 가장 중요한 비트는 부호 비트입니다. 프로세서에 숫자의 부호, 즉 숫자가 양수인지 음수인지 알려줍니다.

0 부호 비트에서 양수 값을 나타내고 1 음수 값을 나타냅니다. 나머지 비트는 실제 크기를 알려줍니다.

1101에서 , 부호 비트는 1입니다. , 따라서 숫자는 음수입니다. 101 십진수로 5와 같습니다. 그래서 1101 십진수로 -5로 계산됩니다.

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유
부호 비트 인코딩 방식으로 4비트로 표현할 수 있는 모든 숫자

위의 다이어그램에서 이 인코딩 방식을 사용하여 4비트로 나타낼 수 있는 모든 정수를 볼 수 있습니다. 여기까지는 모두 괜찮아 보입니다.

그러나 자세히 살펴보면 이 인코딩 방식에서 매우 심각한 디자인 문제를 볼 수 있습니다. 그 문제를 직시합시다.

양수와 음수를 더해보자. 예를 들어 +4와 -1을 추가합니다. 답은 (+4) + (-1) = (+3)여야 합니다. 0011입니다. .

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

결과는 1101입니다. (-5). 실제 답변은 0011이어야 합니다. (+3). 프로세서에서 이 접근 방식을 구현하려면 이 문제를 처리하기 위해 논리를 추가해야 하며 엔지니어는 논리가 더 복잡해지는 것을 싫어합니다.

더 많은 회로를 추가하면 전력 소비가 증가하고 성능이 저하됩니다.

이것은 현대의 트랜지스터 기반 컴퓨터에서 사소한 문제처럼 들릴 수 있습니다.

그러나 하루에 수백 명이 작동하는 킬로와트의 전력을 소비하는 수천 개의 진공관에서 실행되는 EDVAC와 같은 초기 컴퓨터를 생각해 보십시오. 그리고 정부는 그것을 건설하는 데 수백만 달러를 썼습니다.

그 당시에는 추가 회로와 진공관을 설치하는 데 수천 달러와 심각한 유지 관리 문제가 있었습니다.

따라서 엔지니어는 더 스마트한 인코딩 디자인을 생각해야 했습니다.

이제 이 문제를 해결하고 시스템을 더 단순하고 성능을 높이며 전력 소모를 줄여줄 아름다움을 밝혀야 할 때입니다.

아름다운 인코딩 시스템이 들어가고 CPU가 빛난다 ❤️

이 인코딩 방식에서는 이전 방식과 마찬가지로 맨 왼쪽 비트가 부호 비트 역할을 하지만 일부 기술에서는 음수를 표현해야 합니다.

양수는 이전 인코딩 체계와 똑같은 방식으로 표시됩니다. 선행 0 크기에 대한 나머지 비트가 뒤따릅니다. 예를 들어 이 인코딩 체계에서도 6은 0110으로 표시됩니다. .

음수를 나타내기 위해 2단계 수학 프로세스가 양수에서 실행됩니다. -6을 나타내는 의미는 +6에서 2단계 수학 프로세스를 수행하여 이진법으로 -6에 도달합니다.

-6이 어떻게 바이너리로 인코딩되는지 봅시다:

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

이전 부호 크기 접근 방식에서 +6의 음수를 계산하려면 부호 비트를 0에서 간단히 변경했을 것입니다. 1로 . 0110 (+6)은 1110이 됩니다. (-6).

이 새로운 인코딩 방식에서는 먼저 비트를 반전시킵니다. 0을 1로, 1을 0으로 변경합니다. 0110 (+6)은 1001이 됩니다. . 비트 반전을 "1의 보수"라고 하므로 여기에서 0110의 보수를 계산했습니다. 결과 1001 . 그럼...

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

0001를 추가합니다. (+1) 1단계에서 얻은 1의 보수(1001 ). 결과 1010 -6의 이진 표현이 됩니다. 이 인코딩 방식을 2의 보수라고 합니다. 따라서 양의 정수의 2의 보수를 계산하면 음수를 얻을 수 있다는 점을 명심하십시오.

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

비트 반전은 1의 보수를 제공합니다. 1의 보수에 1을 추가하면 우리가 시작한 원래 비트의 2의 보수를 얻을 수 있습니다. 간단하죠?

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유
2의 보수 인코딩 방식으로 4비트로 표현할 수 있는 모든 숫자

이제 이 인코딩 체계가 왜 그렇게 아름다운지 봅시다. 0100을 추가하겠습니다. (+4) 및 1111 (-1).

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

2의 보수 인코딩 방식으로 정확한 결과를 얻습니다. 이제 부호에 대해 걱정하지 않고 정수를 추가할 수 있습니다.

2의 보수 인코딩을 통해 음의 정수를 0과 1로 표현하는 방법을 배웠습니다. 이제 ADD eax, -3을 실행한다고 가정합니다. eax 레지스터의 현재 값은 -1입니다. 따라서 ADD eax, -3 실행 후 eax의 값 -4(1100)가 됩니다. 2의 보수 인코딩에서).

운영 체제가 1100을 검색할 때 eax에서 결과를 사용자에게 제공하기 위해 운영 체제는 1100을 어떻게 디코딩합니까? 십진수로? 또는 프로그래머로서 1100 , 어떤 숫자 1100를 알아낼 수 있습니까? 나타내는?

물론 1100에 도달했을 때를 확인하기 위해 각 양의 정수의 2의 보수를 계속 계산할 수는 없습니다. . 너무 느릴 것입니다.

프로그래머와 OS는 2의 보수라는 아름다운 속성을 사용하여 바이너리를 십진수로 디코딩합니다.

양수의 2의 보수를 계산할 때 음수를 얻습니다. 음, 반대도 사실입니다 - 즉, 음수의 2의 보수를 계산하면 양수를 얻을 수 있습니다. 잠시 후에 그 이유를 살펴보겠습니다.

먼저 OS 또는 프로그래머가 1100를 디코딩하는 방법을 이해합시다. 소수로.

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

1100 검색 시 eax 레지스터에서 OS는 1을 봅니다. 정수가 음수임을 나타내는 부호 비트로 사용됩니다. 1100의 2의 보수 1100의 양수 대응물을 제공하는 계산 0100로 나옵니다. (+4). 그런 다음 OS는 양수에 음수 기호를 추가하고 최종 답변을 -4로 반환합니다. 이 단락을 다시 한 번 읽으면 더 잘 이해하게 될 것입니다.

그러면 CPU는 미소를 지으며 오늘의 아름다움과 작별을 고합니다;)

CPU는 어머니를 만나기 위해 집으로 갔다. 이제 우리는 2의 보수 기술의 내부 작동 방식에 대해 논의할 충분한 시간이 있습니다.

2의 보수 인코딩은 왜 그리고 어떻게 작동합니까?

+42와 같이 숫자의 음수를 찾으라고 하면 +42의 음수를 찾는 가장 간단한 방법은 무엇입니까?

틀림없이 가장 간단한 방법은 0에서 숫자를 빼는 것입니다. 맞죠? 0 - (+42) = -42 . 이것을 반복하면 양수 값인 0 - (-42) = +42로 돌아갑니다. . 이것이 2의 보수를 구성하는 모든 수학입니다.

음의 정수를 사용하는 마이크로프로세서 로맨스 – CPU 산술 설계의 방법과 이유

우리는 10000을 하고 있습니다. (가장 왼쪽 1이 오버플로이므로 십진수 0) 빼기 0101 (+5). 1011을 얻습니다. 2의 보수 인코딩에서 십진수로 -5입니다. 뺄셈이 어떻게 수행되는지 무시하십시오. 그건 중요하지 않습니다. 2의 보수 뒤에 있는 직관을 이해하는 것이 중요합니다.

10000 1111 + 0001로 작성할 수 있습니다. (이 두 가지를 추가하면 10000이 됩니다. ). 실제로 우리는 다음과 같이 하고 있습니다.

        10000       -   0101
=>  (1111 + 0001)   -   0101

위의 방정식을 재정렬하면 다음과 같이 쓸 수 있습니다.

    (1111 + 0001)  -  0101
=>  (1111 - 0101)  +  0001

Step 1: subtract 0101 from 1111

        1 1 1 1
       -0 1 0 1
       ---------
        1 0 1 0
        
       see, subtracting 0101 from 1111 is equivalent 
       to inverting the bits of 0101, as we got 1010 as a result. 

  
       
Step 2: add 0001 to the above result  

        1 0 1 0  ---> result of step 1
       +0 0 0 1
       ---------
        1 0 1 1      
       
       we get 1011 that is -5 in two's complement encoding.      

2의 보수 시스템이 기본적으로 0에서 숫자를 뺀다는 것을 보았습니까? 비트를 반전하고 1을 더하는 것은 0에서 숫자를 빼는 빠르고 영리한 방법입니다.

이것이 2의 보수를 계산할 때 음수의 양수와 양수의 음수를 얻는 이유입니다. 실제로는 0에서 숫자를 빼기 때문입니다(0 - number ).

1900년대의 컴퓨터는 2의 보수 인코딩 방식이 너무 아름다워서 뺄셈을 쉽게 수행할 수 있기 때문에 덧셈 산술 논리만 사용했습니다.

예를 들어, 100에서 12를 빼기 위해 CPU는 -12를 생성하는 +12의 2의 보수를 계산한 다음 -12를 100에 더하여 필요한 출력을 제공합니다.

숫자의 음수를 찾기 위해 0에서 직접 빼거나 이진법에서 그 반대를 찾는 것은 어떻습니까?

뺄셈은 느리고 복잡한 과정이기 때문에(차용 덕분에) 그렇게 하려면 컴퓨터에 값비싼 뺄셈 회로가 필요합니다. 음의 정수를 나타낼 때마다 0에서 빼는 것을 상상해 보십시오. 그것은 우리와 우리 컴퓨터 모두에게 악몽이 될 것입니다!

2의 보수 인코딩은 보다 성능이 뛰어난 솔루션이며 간단한 회로 설계로 이어지며 많은 비용을 절약합니다. 뺄셈을 위해 값비싼 회로가 필요하지 않고 + 및 - 정수의 산술을 처리하는 추가 논리가 없기 때문입니다. 단순히 더하기만 하면 더하기와 빼기를 모두 할 수 있습니다.

따라서 이 아름다운 인코딩 체계에 대해 컴퓨터 디자이너에게 감사를 표합시다. 2의 보수 ❤️.

최종 단어

나는 내가 생산하는 어떤 학습 자료에도 비용을 청구하지 않을 것이라고 스스로에게 약속했습니다. 내가 교육을 위해 하는 모든 일은 간단한 기사든 강의든 전자책이든 항상 100% 무료이며 개방적입니다.

Twitter 계정에 유용한 리소스를 게시하고 의미 있는 생각을 공유합니다. 여기에서 저를 팔로우하고 이 기사에서 새로운 것을 배웠다면 저에게 DM을 보낼 수 있습니다. 내 하루를 만들어줄 거에요 :)

모든 개발자, 모든 저자, 모든 인간은 누군가에게서 배웁니다. 저는 우리가 배우는 사람과 자원이 인용되고 전파되어야 한다고 믿습니다. 이것은 그 좋은 사람들이 우리 모두를 위해 더 많은 일을 하도록 격려합니다. 여기 내 좋은 것들이 있습니다.

mycodeschool의 Animesh는 이 기사에서 제가 쓴 개념을 포함하여 다른 누구보다 더 많은 프로그래밍 개념을 가르쳐주었습니다.

제 멘토이자 친구인 André Jaenisch의 검토 노력과 끊임없는 지원이 없었다면 저는 이 기사를 쓰지 못했을 것입니다.

즐겁게 배우세요!