EAX의 더 높은 바이트가 포함 된 레지스터가없는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/228200

  •  03-07-2019
  •  | 
  •  

문제

%AX = (%AH + %AL)

그래서 왜 안돼 %EAX = (%SOME_REGISTER + %AX) 일부 레지스터의 경우 %SOME_REGISTER?

도움이 되었습니까?

해결책

약간의 설명을 위해. 1970 년대 초 초기 마이크로 프로세서 시대에 CPU는 적은 수의 레지스터와 매우 제한된 지침 세트를 가졌습니다. 일반적으로 산술 단위는 단일 CPU 레지스터에서만 작동 할 수 있으며, 종종 "축적기"라고합니다. 8 비트 8080 & Z80 프로세서의 축합기를 "A"라고합니다. B, C, D, E, H & L.이 6 개의 레지스터는 36 비트 레지스터 (BC, DE & HL)에 짝을 이룰 수 있습니다. 내부적으로 축합기는 FLAGS 레지스터와 결합하여 AF 16 비트 레지스터를 형성했습니다.

Intel은 16 Bit 8086 제품군을 개발했을 때 8080 코드를 포트 할 수 있기를 원했기 때문에 동일한 기본 레지스터 구조를 유지했습니다.

8080/Z80  8086
A         AX
BC        BX
DE        CX
HL        DX
IX        SI    
IY        DI

8 비트 코드를 포트해야하기 때문에 AX, BX, CX & DX의 개별 8 비트 부분을 참조 할 수 있어야했습니다. 이들은 AL, AH, AH 및 BL/BH, CL/CH & DL/DH의 경우 AL, AH라고합니다. Z80의 IX & IY는 16 비트 포인터 레지스터로만 사용되었으므로 Si & di의 두 절반에 액세스 할 필요가 없었습니다.

80386이 1980 년대 중반에 출시되었을 때 그들은 모든 레지스터의 "확장 된"버전을 만들었습니다. 따라서 AX는 EAX, BX가 EBX가되었습니다.이 새로운 확장 레지스터의 상위 16 비트에 액세스 할 필요가 없었기 때문에 EAXH Pseudo 레지스터를 만들지 않았습니다.

AMD는 처음 64 비트 프로세서를 생산할 때 동일한 트릭을 적용했습니다. AX 레지스터의 64 비트 버전을 RAX라고합니다. 이제, 당신은 다음과 같은 것처럼 보이는 것이 있습니다.

|63..32|31..16|15-8|7-0|
               |AH.|AL.|
               |AX.....|
       |EAX............|
|RAX...................|

다른 팁

여기에 많은 답변이 게시되었지만 주어진 질문에 대한 답변은 없습니다. 왜 16 비트의 EAX 또는 32 비트의 RAX를 직접 인코딩하는 레지스터가없는 이유는 무엇입니까? 답은 X86 명령 자체의 한계로 요약됩니다.

16 비트 역사 수업

인텔이 8086을 설계했을 때, 그들은 많은 지침에 가변 길이 인코딩 체계를 사용했습니다. 이것은 특정 매우 공통된 지시 사항을 의미했습니다 POP AX, 단일 바이트 (58)로 표현 될 수 있지만 드물지만 여전히 유용하지는 지시 지침 MOV CX, [BX*4+BP+1023] 저장하는 데 여러 바이트가 필요하더라도 여전히 표현 될 수 있습니다 (이 예에서는 8b 8c ff 03).

이것은 합리적인 솔루션처럼 보일 수 있지만 설계하면 그들은 사용 가능한 대부분의 공간을 작성했습니다. 예를 들어 8 개가있었습니다 POP 8 개의 개별 레지스터 (AX, CX, DX, BX, SP, BP, SI, DI)에 대한 지침은 Opcodes 58 ~ 5F를 작성했으며 Opcode 60은 완전히 다른 것입니다 (PUSHA), Opcode 57과 마찬가지로 (PUSH DI). 그 후 또는 그 이전에 남은 방이 없습니다. 세그먼트 레지스터를 밀고 터지는 경우에도 개념적으로 일반 목적 레지스터를 밀고 튀어 나오는 것과 거의 동일합니다. 옆에 공간이 없었기 때문에 다른 위치 (약 06/0e/16/1E)에서 인코딩해야했습니다. 나머지 푸시/팝 지침.

마찬가지로, "mod r/m"바이트는 복잡한 명령에 사용됩니다. MOV CX, [BX*4+BP+1023] 레지스터를 인코딩하기위한 3 개의 비트 만 있으므로 총 8 개의 레지스터 만 나타낼 수 있습니다. 8 개의 레지스터 만 있으면 괜찮지 만 더 많은 것을 원한다면 실제 문제를 제시합니다.

(X86 아키텍처에는 이러한 모든 바이트 할당에 대한 훌륭한지도가 있습니다. http://i.imgur.com/xfewv.png . 기본지도에 공간이없는 방법, 일부 지침이 바이트가 겹치는 지, 심지어 MMX 및 SSE 명령 덕분에 2 차 "0F"맵이 얼마나 많이 사용되고 있는지 확인하십시오.)

32 및 64 비트를 향해

따라서 CPU 디자인을 16 비트에서 32 비트에서 32 비트까지 확장 할 수 있도록 이미 디자인 문제가 있었으며 접두사 바이트: 모든 표준 16 비트 지침 앞에 특별한 "66"바이트를 추가함으로써 CPU는 16 비트 버전 (AX) 대신 동일한 명령어를 원하지만 32 비트 버전 (EAX)을 원한다는 것을 알고 있습니다. 나머지 디자인은 동일하게 유지되었습니다. 전체 CPU 아키텍처에는 여전히 8 개의 총 일반 목적 레지스터가있었습니다.

건축을 64 비트 (RAX 및 친구)로 확장하기 위해 비슷한 해커를 수행해야했습니다. 그곳에서 또 다른 접두사 코드 세트를 추가하여 문제가 해결되었습니다.REX, 40-4f)는 "64 비트"(그리고 "Mod R/M"필드에 또 다른 두 비트를 효과적으로 추가했으며, 아무도 사용하지 않았던 이상한 오래된 지시 사항을 버리고 새로운 물건에 대한 바이트 코드를 재사용하는 이상한 오래된 지시 사항을 버렸습니다.

8 비트 레지스터를 따로 따로

그러므로 묻는 더 큰 질문 중 하나는 AH와 AL과 같은 도대체 일이 8 개의 레지스터를위한 디자인에 실제로 공간이 있다면 처음에 어떻게 일했는지입니다. 답의 첫 번째 부분은 ""와 같은 것은 없다는 것입니다.PUSH AL"-일부 지침은 단순히 바이트 크기의 레지스터에서 전혀 작동 할 수 없습니다! AAD 그리고 XLAT) 및 "mod r/m"지침의 특수 버전 : "mod r/m"바이트에 매우 구체적인 비트를 뒤집어 놓으면 "확장 된 지침"이 뒤집어 질 수 있습니다. 16 비트. Al, CL, DL, BL, AH, AH, DH 및 BH (순서대로)와 정확히 8 개의 8 비트 레지스터도 있습니다. "mod r/m"바이트에서.

인텔은 8086 디자인이 8080/8085와 "소스 호환"이어야한다고 지적했다. (그들은 가까이 있지 않음), 새로운 바이트 코드를 사용하기 위해 프로그램을 다시 컴파일해야합니다 (다시 조립). 그러나 "소스 호환"은 오래된 소프트웨어를위한 방법이었으며 8085의 개별 A, B, C 등과 콤보 "BC"및 "DE"레지스터가 지금이더라도 새 프로세서에서 여전히 작동 할 수있었습니다. "Al"및 "BL"및 "BX"및 "DX"(또는 매핑이 무엇이든)라고합니다.

그래서 그것은 정말로 진짜 답변입니다. Intel 또는 AMD가 의도적으로 EAX의 높은 16 비트 레지스터 또는 RAX의 높은 32 비트 레지스터를 "삭제"하는 것은 아닙니다. 8 비트 레지스터가 이상한 남은 역사적 역사적이라는 것입니다. 아키텍처가 뒤로 호환되었다는 요구 사항을 감안할 때 비 비트 크기로 디자인을 복제하는 것은 실제로 어려울 것입니다.

성능 고려 사항

그 이후로 "높은 레지스터"가 추가되지 않은 이유에 대한 또 다른 고려 사항이 있습니다. 현대 프로세서 아키텍처 내에서 성능의 이유로 다양한 크기의 레지스터는 실제로 겹치지 않습니다 : AH와 AL AREN ' A Ax의 일부 및 AX는 EAX의 일부가 아니며 EAX는 RAX의 일부가 아닙니다. 모두 후드 아래에있는 별도의 레지스터이며 프로세서는 하나의 중 하나를 조작 할 때 다른 사람에게 무효화 플래그를 설정합니다. 다른 사람들로부터 읽을 때 데이터를 복사해야한다는 것을 알 수 있습니다.

(예 : AL = 5를 설정하면 프로세서가 AX를 업데이트하지 않습니다. 그러나 AX에서 읽으면 프로세서는 AL에서 AC의 하단 비트로 5를 빠르게 복사합니다.)

레지스터를 별도로 유지함으로써 CPU는 보이지 않는 레지스터 이름 변경과 같은 모든 종류의 영리한 작업을 수행하여 코드가 더 빨리 실행되도록 할 수 있지만 코드가 실행되는 것을 의미합니다. 느리게 작은 레지스터를 더 큰 레지스터로 처리하는 오래된 패턴을 사용하는 경우 프로세서가 스톨하고 업데이트해야하기 때문에. 이 모든 내부 부기가 손을 떼지 못하게하기 위해 CPU 디자이너는 현명하게 겹치는 레지스터를 추가하지 않고 최신 프로세서에 별도의 레지스터를 추가하기로 결정했습니다.

(그렇습니다. 그것은 현대 프로세서가 명시 적으로 더 빠르다는 것을 의미합니다. "MOVZX EAX, value"오래되고 더 칙칙한 방법을하는 것보다"MOV AX, value / use EAX".)

결론

모든 말로, 인텔과 AMD가 실제로 원한다면 더 많은 "겹치는"레지스터를 추가 할 수 있습니까? 확신하는. 수요가 충분하다면 그들을 벌리는 방법이 있습니다. 그러나 중요한 역사적 수하물, 현재 건축 한계, 주목할만한 성능 제한 및 요즘 대부분의 코드가 랩핑되지 않은 레지스터에 최적화 된 컴파일러에 의해 생성된다는 사실을 감안할 때, 곧 그러한 것들을 곧 추가 할 가능성은 거의 없습니다.

오래된 8 비트 일에는 A 레지스터가있었습니다.

16 비트 일에는 16 비트 AX 레지스터가 있었는데, 이는 여전히 8 비트 값으로 작업하고 싶었던 시대에 AH와 AL의 두 개의 8 비트 부품으로 나뉘 었습니다.

32 비트에 32 비트 EAX 레지스터가 도입되었지만 AX, AH 및 AL 레지스터는 모두 유지되었습니다. 디자이너들은 EAX의 16-11에서 31에서 다루어진 새로운 16 비트 레지스터를 도입 할 필요가 없다고 생각했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top