이 답변의 내용의 대부분은 원래 온 이 답변 (다른 질문이 중복으로 표시되기 전에 작성). 따라서 8 비트 값을 사용하는 방법에 대해 논의하지만 (이 질문은 32 비트 값을 요구했지만) 8 비트 값은 개념적으로 이해하기가 더 쉽고 동일한 개념이 32 비트 산술과 같은 더 큰 값에 적용되기 때문에 괜찮습니다.
8 비트 인 두 개의 숫자를 추가하면 가장 큰 숫자를 얻을 수 있습니다 (0xFF + 0xFF = 1FE). 실제로 8 비트 인 두 숫자를 곱하면 얻을 수있는 가장 큰 숫자 (0xFF * 0xFF = 0xFE01)는 여전히 8 비트의 두 배인 16 비트입니다.
이제 x 비트 프로세서가 x 비트 만 추적 할 수 있다고 가정 할 수 있습니다. 예를 들어, 8 비트 프로세서는 8 비트 만 추적 할 수 있습니다. 정확하지 않습니다. 8 비트 프로세서는 8 비트 청크로 데이터를 수신합니다. 이러한 "청크"는 일반적으로 "단어"라는 공식 용어를 사용합니다. 8 비트 프로세서에는 8 비트 단어가 사용됩니다. 64 비트 프로세서에는 64 비트 단어가 사용될 수 있습니다.
따라서 컴퓨터에 3 바이트를 주면
바이트 # 1 : MUL 명령어
바이트 # 2 : 상위 바이트 (예 : 0xA5)
바이트 # 3 : 하위 바이트 (예 : 0xCB)
컴퓨터는 다음과 같은 결과를 생성 할 수 있습니다. 8 비트 이상입니다. CPU는 다음과 같은 결과를 생성 할 수 있습니다.
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka :
0x4082xxxxD7
이제,
다음과 같은 숫자는 16 진수를 의미합니다.
"40"에 대해 좀 더 자세하게 설명하겠습니다.
82는 일련의 8 비트 인 "A"레지스터의 일부입니다.
xx와 xx는 "B"레지스터와 "C"레지스터라는 다른 두 레지스터의 일부입니다. 이러한 비트를 0 또는 1로 채우지 않은 이유는 "ADD"명령어 (CPU로 전송)가 명령어에 의해 해당 비트가 변경되지 않을 수 있기 때문입니다 (이 예제에서 사용하는 대부분의 다른 비트는 일부 플래그 비트를 제외하고 변경됩니다.
D7은 "D"레지스터라고하는 더 많은 비트에 맞습니다.
레지스터는 메모리의 일부일뿐입니다. 레지스터는 CPU에 내장되어 있으므로 CPU는 RAM 스틱의 메모리와 상호 작용할 필요없이 레지스터에 액세스 할 수 있습니다.
따라서 0xA5 곱하기 0xCB의 수학적 결과는 0x82D7입니다.
이제 왜 비트가 A 및 B 레지스터 또는 C 및 D 레지스터 대신 A 및 D 레지스터로 분리 되었습니까? 다시 한 번, 이것은 내가 사용하고있는 샘플 시나리오이며, 개념 상 실제 어셈블리 언어 (Intel x86 16 비트, Intel 8080 및 8088 및 많은 최신 CPU에서 사용되는 개념)와 다소 유사합니다. "C"레지스터 (일반적으로 루프의 경우)를 계산하기위한 인덱스로 사용되는 "C"레지스터 및 메모리 위치를 지정하는 데 도움이되는 오프셋을 추적하는 데 사용되는 "B"레지스터와 같은 일반적인 규칙이있을 수 있습니다. 따라서 "A"와 "D"는 일부 일반적인 산술 함수에서 더 일반적 일 수 있습니다.
각 CPU 명령어에는 Assembly에서 프로그램하는 사람들이 사용하는 문서가 있어야합니다. 이 설명서에는 각 명령어에서 사용되는 레지스터를 지정해야합니다. (따라서 사용할 레지스터에 대한 선택은 종종 어셈블리 언어 프로그래머가 아닌 CPU 디자이너에 의해 지정됩니다. 그러나 약간의 유연성이있을 수 있습니다.)
이제, 위의 예제에서 "40"으로 돌아가서 : "플래그 레지스터"라고도하는 일련의 비트입니다. 플래그 레지스터의 각 비트에는 이름이 있습니다. 예를 들어, 결과가 1 바이트의 결과를 저장할 수있는 공간보다 큰 경우 CPU가 설정할 수있는 "오버 플로우"비트가 있습니다. "오버플로"비트는 종종 "OF"의 약칭으로 참조 될 수 있습니다. 이는 0이 아닌 대문자 o입니다. 소프트웨어는이 플래그의 값을 확인하고 "문제"를 확인할 수 있습니다. 이 비트로 작업하는 것은 종종 고급 언어에 의해 보이지 않게 처리되므로 초보자는 종종 CPU 플래그와 상호 작용하는 방법을 배우지 못합니다. 그러나 어셈블리 프로그래머는 일반적으로 다른 변수와 매우 유사한 방식으로 이러한 플래그 중 일부에 액세스 할 수 있습니다.
예를 들어, 여러 ADD 명령어가있을 수 있습니다. 하나의 ADD 명령어는 16 비트의 결과를 A 레지스터와 D 레지스터에 저장할 수있는 반면, 다른 명령어는 단지 8 개의 하위 비트를 A 레지스터에 저장하고 D 레지스터를 무시하고 오버플로 비트를 지정할 수 있습니다. 그런 다음 나중에 (A 레지스터의 결과를 기본 RAM에 저장 한 후) 8 개의 높은 비트 만 레지스터 (A 레지스터)에 저장하는 다른 ADD 명령어를 사용할 수 있습니다. 오버플로 플래그를 사용해야하는지 여부 사용하는 곱셈 명령어에 따라 다릅니다.
원하는 결과에 맞지 않도록 너무 많이 빼면 일반적으로 "언더 플로우"플래그가 있습니다.
그냥 복잡한 일이 있었는지를 보여 :
인텔 4004는 4 비트 CPU이었다
인텔 8008는 8 비트 CPU했다. A, B, C 및 D라는 8 비트 레지스터가있었습니다
. Intel 8086은 16 비트 CPU였습니다. AX, BX, CX 및 DX라는 16 비트 레지스터가있었습니다.
인텔 80386은 32 비트 CPU였습니다. EAX, EBX, ECX 및 EDX라는 32 비트 레지스터가있었습니다.
Intel x64 CPU에는 RAX, RBX, RCX 및 RDX라는 64 비트 레지스터가 있습니다. x64 칩은 16 비트 코드를 실행할 수 있으며 (일부 작동 모드에서) 16 비트 명령어를 해석 할 수 있습니다. 그렇게 할 때 AX 레지스터를 구성하는 비트는 EAX 레지스터를 구성하는 비트의 절반이며 RAX 레지스터를 구성하는 비트의 절반입니다. 따라서 AX 값을 변경할 때마다 AX에서 사용하는 비트가 RAX에서 사용하는 비트의 일부이기 때문에 EAX 및 RAX도 변경됩니다. EAX를 65,536의 배수로 변경하면 하위 16 비트는 변경되지 않으므로 AX는 변경되지 않습니다. EAX를 65,536의 배수가 아닌 값으로 변경하면 AX에도 영향을 미칩니다. .)
내가 언급 한 것보다 더 많은 플래그와 레지스터가 있습니다. 간단한 개념의 예를 제공하기 위해 일반적으로 사용되는 것을 선택했습니다.
이제 8 비트 CPU를 사용하는 경우 메모리에 쓸 때 4 비트 또는 16 비트 주소가 아닌 8 비트 주소를 참조 할 수 있다는 제한이있을 수 있습니다. 세부 사항은 CPU에 따라 달라 지지만 이러한 제한이있는 경우 CPU가 8 비트 단어를 처리 할 수 있으므로 CPU를 가장 일반적으로 "8 비트 CPU"라고합니다.