2013-04-27 1 views
2

최근에 저는 x86 어셈블리 언어와 CPU 아키텍처를 배우기 시작했습니다. 전체 int 레지스터 수는 8이지만 x86-64의 경우 16입니다.왜 x86 int 레지스터의 수가 8입니까?

왜? 약간의 설명이 있어야합니다.

+1

x86은 정말로 오래되었습니다 ... 요즘 하드웨어를 단순하게 유지하는 것이 좋습니다. – Mysticial

+0

아마도 좀 더 구체적으로 대답 할 수 있지만 레지스터가 많으면 일반적으로 빠릅니다. 모든 값을 레지스터에 저장할 수 있기 때문에 스택에 쓰거나 읽지 않아도됩니다. 나는 거기에 약간의 단점이 있다고 확신한다. (PUSHA 명령은 어떻게 든 더 느릴 수 있겠는가?)하지만 이점에 의해 (아마) 더 중요하다. – rliu

+0

@ 신비하지만 여전히 x86은 큰 역할을합니다. – kirugan

답변

5

x86 아키텍처는 1970 년대 초반에 8008이라는 초기 화신에서 발전했습니다. 당시에는 메모리 바이트와 연산 코드 공간이 매우 귀중했습니다. A, B, C, D, E, F, (및 IIRC) H 및 L 레지스터 (모든 비트)에 대해서는 겨우 3 비트 만 남았습니다. (나는 그 기계가 얼마나 힘들었는지 기억하고 얼마나 천천히! 기억 읽기 또는 쓰기 전에 메모리 주소로 H와 L을로드해야했습니다!)

그 이후로 인텔은 명령 세트를 진화 시켰습니다. 1980 년대 후반의 8080, 8086, 80186, 80286, 80386, 80486 아키텍처를 통해 레지스터를 16 비트 및 32 비트로 확장했지만 레지스터를 선택하는 데 동일한 3 비트를 유지했습니다.

AMD가 80486 아카이브의 64 비트 버전을 설계 할 때까지는 아니었고, 4 번째 레지스터 비트는 명령어 접두어 바이트를 추가함으로써 (이제 메모리와 opcode 바이트가 저렴하기 때문에) 추가되었습니다. 이 접두사 바이트는 본질적으로 동일한 3 개의 레거시 레지스터 비트에 의해 선택된 레지스터 번호에 "8"을 추가합니다. 이것은 "레지스터 번호"가 명령어 전반에 퍼져 있다는 것을 의미합니다. 이것은 추악한 디코더를 만들지 만, 이제는 트랜지스터도 저렴합니다.

16 개의 레지스터에 대한 구실은 "등록 압력"입니다. 이상적인 CPU는 레지스터에 필요한 모든 연산을 수행 할 것이므로 항상 충분한 메모리가 있으므로 다른 계산을위한 공간을 만들기 위해 레지스터를 메모리에 스필 (나중에 저장하고 나중에 다시로드하지 않아도 됨) 할 필요가 없습니다. 측정 및 경험을 통해 8 개의 레지스터가 이러한 유출을 피하기에 충분하지 않았으며 터치 메모리를 쏟아 부어 프로세서가 상당히 느려지는 것으로 나타났습니다. 나는 32가 충분한 레지스터 이상인 것으로 (주의 깊게 측정 된) 생각되지만, 그것은 비트를 필요로하고, 16은 매우 실용적이라고 이상적으로 가깝습니다. 그리고 AMD는 효과적인 하이테크 마케팅 기능으로 잠시 동안 64 비트 제품과 16 개 레지스터를 8 개가 아닌 8 개까지 사용할 수있었습니다.

인텔은 64 비트 프로세서 전쟁에서 AMD를 잃고 있음을 발견하고 x86 자체의 64 비트 확장을 시도했지만 Microsoft는 AMD 명령어 세트를 지원한다고 말했고 2 가지 x86 64 비트 명령 세트. 인텔은 접 혔고, 근본적으로 AMD가 제안한 것과 동일한 기본적 64 비트 명령어 세트를 가지고 있습니다.

이 CPU의 매우 현대적인 버전에는 벡터 레지스터가 16과 32 (내 생각에는) 레지스터를 가지고 있다는 것을 알 수 있습니다. opcode 비트가 훨씬 저렴 해졌으며 명령어 인출 속도가 놀라 울 정도입니다.

+2

RISC CPU에는 레지스터 압박 이유로 16 개의 레지스터가있는 경향이있었습니다. 결국, RISC의 기본 개념은 명령 세트를 간단하게 설계하는 것이었지만 실제로 필요한 것은 무엇이 었는지를 다루는 것이지 CPU 디자이너에게는 멋지지 않았습니다 (지나치게 CISC 명령은 VAX를 실제로 죽였습니다). x86 아키텍쳐를 파헤 치면 발견 할 수있는 것은 칩 내부가 실제로 RISC 머신이고 실제로 복잡한 디코더가있어서 x86 명령어로 생각하는 것을이 간단한 마이크로 연산에 매핑 할 수 있습니다. –

+1

@AlexeiLevenkov : Cleanup? –

+0

몇 가지 추가 기록 : https://blogs.msdn.microsoft.com/oldnewthing/20040105-00/?p=41203 –

0

자신을 쉽게 설명 할 수 있습니다. 8 비트 레지스터를 처리하려면 3 비트 만 있으면되며 어셈블러 언어 명령 형식으로 사용할 수 있습니다. 64 커맨드가 두 배 더 커지기 때문에 6 비트를 갖습니다. 자세히보기 What is the size of each asm instruction?

따라서 최단 명령어 길이가 1 바이트 인 경우 8 비트가됩니다.

  1. 오피

  2. 소스 주소

  3. 목적지 주소

: 다른 하나 개의 레지스터에서 이동 명령을해야하는 경우 그래서, 다음과 같은 8 비트에서 보관해야

소스 및 지정 주소는 각각 3 비트를 사용하므로 6 비트가 소비되고 실제 작업을위한 2 비트 만 이동, 추가, 그리고 교환.

1

원래 8086은 1978 년부터 기억하기 때문에 몇 만 개의 트랜지스터가 있었기 때문에 모든 명령어가 마이크로 코드되었습니다. 즉, 16 비트 프로세서의 기능을 방정식에 넣기위한 절충안이 풍부합니다. 현재까지 가장 성공한 16 비트 프로세서는 8 개의 범용 레지스터가있는 Digital Equipment의 PDP-11이었습니다. 8086은 이것을 16 비트 레지스터 중 4 개에있는 8 바이트 레지스터와 비교했을 때 더 좋았다.

주소 변환도 마이크로 코딩되었습니다. 명령에 필요한 평균주기는 17이었습니다. 286은 더 많은 트랜지스터 (전체적으로 마이크로 코드 된 주소 변환 장치가 아닌), 386에서 4.4 및 486에서 1.8까지 덕분에 7로 낮 춥니 다. 그 시간 동안 클럭 속도는 5에서 100MHz로 증가했습니다 (486 DX-3에서는).

8086은 실시간 응용 프로그램 용이었고 적은 수의 레지스터는 더 빠른 인터럽트 처리 및 작업 스위치를 의미합니다. 이는 역사적인 맥락에서 볼 수 있으며 오늘날의 32 비트, 32 레지스터 RISC 프로세서와 비교되지 않습니다.

386은 최초의 32 비트 가능 프로세서였으며 8086 이후 10 년이되었습니다. 16 비트 하위 레지스터가 8 개 뿐인데 8 비트 하위 레지스터가 4 개뿐입니다.

8- 레지스터, 32 비트 아키텍처를 트랜지스터를 사용하여 더 빠르게 만들 수없는 시점이있었습니다. 또는 오히려, 더 많은 트랜지스터를 사용하는 8 레지스터, 32 비트 솔루션을 각각 64 비트의 16 레지스터로 확장하고 수정 된 명령어 세트를 구현하는 것이 그 비중이되었습니다. 후자가 이겼다.

+0

원래 8086이 마이크로 코드 된 것을 보여주는 참조를 인용 할 수 있습니까? 나는 그것이라고 생각하지 않으며, 보통 트랜지스터가 부족하다는 것은 당신이 필수적인 것을 단단히 묶어 놓고 다른 것을 가지고 있지 않으려 고한다는 것을 의미합니다. –

+0

여러 사이트에서 8086 명령어 세트가 마이크로 코드되었다고 말합니다. "hardwire the essential stuff"라고 말하면 나는 괜찮다고 말하지만 8086은 풍부한 명령어 세트를 갖고 있으며, 모든 것이 "필수적인 것"일 수는 없었다. 16 비트 곱셈은 비트 당 6+ 사이클 (시프트, 테스트 및 곱셈 프리미티브 추가)에서 나오는 실행하기 위해 100 개 이상의 사이클을 필요로 할 수 있습니다. 거의 하드 와이어되지 않은 영역입니다. 80286에는 부분적으로 고정 배선 된 유효 주소 계산이 있습니다. "offset [bx]"(하나의 덧셈)은 사이클 페널티가 없었지만 "offset [bx + si]"(두 개의 덧셈)에는 하나가있었습니다. 부서는 오늘날에도 여전히 마이크로 코드화되어 있습니다. –

+0

복잡한 지시 사항은 하드 와이어하기가 어렵습니다. 당신은 "모든 지시 사항이 마이크로 코드되었다"고 주장했는데, 그것은 내가 곤경에 처한 곳이다. 칭의로 시계의 uselots. Intel 칩은 IIRC를 다른 많은 프로세서의 단일 위상 클록과 비교하여 3 상 클럭을 사용했으며 사실상 처리량이 본질적으로 같았을 때이 "높은 클록 속도"를 모호하게 판매했습니다. 그러면 곱셈에 대한 3 단계 클럭은 add의 경우 3 단계로, shift의 경우 3 단계로 변환됩니다. 예를 들어 add의 경우 한 클럭, 간단한 구현의 경우 예상되는 shift의 경우입니다. –

관련 문제