예를 들어 C와 같은 언어로 두 정수를 비교할 때 :
if (3 > 2) {
// do something
}
3이 2보다 큰지 (true) 아닌지 (false)의 판단은 어떻게 내부적으로 이루어 집니까?
답변
토끼 구멍으로 내려가는 거지? 알았어 한번해볼 게
1 단계. C에서 기계 언어로
C 컴파일러는 비교를 기계 언어로 저장된 opcode로 변환합니다 . 기계 언어는 CPU가 명령어로 해석하는 일련의 숫자입니다. 이 경우에는 “carry로 빼기”와 “carry 인 경우 점프”라는 두 개의 opcode가 있습니다. 즉, 한 명령어에서 3에서 2를 빼고 다음 명령어는 오버플로되었는지 확인합니다. 여기에는 2와 3의 숫자를 비교할 수있는 위치에로드하기위한 두 개의 명령이옵니다.
MOV AX, 3 ; Store 3 in register AX
MOV BX, 2 ; Store 2 in register BX
SUB AX, BX ; Subtract BX from AX
JC Label ; If the previous operation overflowed, continue processing at memory location "Label"
위의 각각은 이진 표현을 가지고 있습니다. 예를 들어, 코드 SUB
는 2D
16 진 또는 00101101
2 진입니다.
2 단계. ALU로 opcode
산술 연산 코드가 좋아 ADD
, SUB
, MUL
, 및 DIV
사용하여 기본 정수 연산 수행 ALU 또는 산술 논리 단위 는 CPU에 내장. 숫자는 일부 opcode에 의해 레지스터 에 저장됩니다 . 다른 opcode는 칩에 ALU를 호출하여 당시 레지스터에 저장된 모든 것에 대해 수학을 수행하도록 지시합니다.
참고 :이 시점에서 우리는 C 와 같은 3GL로 작업 할 때 모든 소프트웨어 엔지니어가 걱정할 수있는 모든 것을 뛰어 넘습니다 .
3 단계. ALU, 반가산기 및 완전 가산기
알고있는 모든 수학 연산을 일련의 NOR 연산으로 줄일 수 있다는 것을 알고 있습니까? 이것이 바로 ALU 작동 방식입니다.
ALU는 이진수로 작업하는 방법 만 알고 있으며 OR, NOT, AND 및 XOR과 같은 논리 연산 만 수행 할 수 있습니다. 이진 덧셈과 뺄셈의 구현은 adder 로 알려진 서브 시스템에서 특정 방식으로 배열 된 일련의 논리 연산으로 수행됩니다 . 이 하위 시스템은 두 비트에서 작동하고 단일 비트 합과 단일 비트 캐리 플래그를 결정하는 “반가산기”네트워크로 구성됩니다. 이들을 묶음으로써 ALU는 8, 16, 32 등의 비트 수로 연산을 수행 할 수 있습니다.
뺄셈은 어떻습니까? 빼기는 또 다른 형태의 덧셈입니다.
A - B = A + (-B)
ALU -B
는의 2의 보수 를 취하여 계산합니다 B
. 음수로 변환되면 가산기에 값을 제출하면 빼기 연산이 발생합니다.
4 단계 : 마지막 단계 : 온칩 트랜지스터
가산기 동작은 트랜시버-트랜지스터 로직 또는 TTL 또는 CMOS 에서 발견되는 것과 같은 “논리 게이트”를 생성하기 위해 상호 작용하는 전기 컴포넌트의 조합을 사용하여 구현됩니다 . 몇 가지 예제를 보려면 여기 를 클릭 하십시오 .
물론 칩에서 이러한 “회로”는 수백만 개의 작은 비트의 전도성 및 비전 도성 재료로 구현되지만 원리는 마치 브레드 보드의 전체 크기 구성 요소 인 것과 동일합니다. 전자 현미경 렌즈를 통해 마이크로 칩의 모든 트랜지스터를 보여주는 이 비디오 를 보십시오 .
몇 가지 추가 사항 :
-
작성한 코드는 실제로 컴파일러에 의해 사전 계산되고 런타임시 실행되지 않습니다. 상수로만 구성되어 있기 때문입니다.
-
일부 컴파일러는 기계 코드로 컴파일하지 않지만 Java 바이트 코드 또는 .NET 중급 언어와 같은 또 다른 계층을 도입합니다. 그러나 결국 모든 것은 기계 언어를 통해 실행됩니다.
-
일부 수학 연산은 실제로 계산되지 않습니다. 그것들은 산술 코 프로세싱 유닛의 거대한 테이블에서 조회되거나 조회와 계산 또는 보간 조합을 포함합니다. 예를 들어 제곱근을 계산하는 함수 가 있습니다 . 최신 PC CPU에는 각 CPU 코어에 부동 소수점 코 프로세싱 장치가 내장되어 있습니다.