2012-02-14 3 views
3

스택 기반 방식으로 레지스터를 구현하려는 fpu의 동기는 무엇입니까? 내 이해를 위해 x86/sse와 같은 다른 명령어 세트는 명명 된 레지스터를 사용합니다. 스택 기반 특성이 일반적으로 함수에 대한 생각과 일치하므로 어셈블리 프로그래머를위한보다 직관적 인 설계가 가능하다는 것을 알 수 있습니다.fpu가 스택 기반 방식으로 레지스터를 구현하려는 동기는 무엇입니까?

그러나 더 확실한 동기 즉 기술 이점이 있는지 궁금했습니다.

+0

내 생각에 하드웨어로 구현하는 것이 더 쉬워졌습니다. 모든 명령어가 최상위 레지스터에서 작동하지 않으면 레지스터 파일이 필요하지 않습니다. – Mysticial

+0

비용/복잡성 외에도 산술 표현식을 트리로 표시하고 스택을 사용하여 평가할 수 있습니다. –

+2

표준 x86 FPU는 스택 (ST (x)를 통해 참조), SSE/AVX/FMA/MMX/3DNow! 레지스터가있는 경우 – Necrolis

답변

5

이러한 아키텍처는 오늘날 더 이상 현장에서 일반적으로 볼 수 없습니다. 그러나 오늘날 레지스터와 프로그램 코드 공간을위한 실리콘 공간은 드문 리소스였습니다 (요즘 임베디드 환경에서도 여전히 그렇듯이). 이러한 아키텍처 뒤에 두 개의 동기까지 그 거의 요약 :

  • ISA는 매우 희박하다
      레지스터 코딩을위한
    • 적은 공간은 스택 (명백하게) 처리 같은 것들
    에 대한
  • 덜 지침을 필요
  • 간단한 하드웨어 디자인
    • 적은 레지스터 디코딩 로직
    • 매우 결정적이고 수학적으로 잘 알려진 행동 (Java 가상 머신 같은 가상 아키텍처는 여전히 그것을 사용하는 이유)
1

이 주로 ARM도 파워도도 MIPS도 스팍 구현하기 때문에 86 만 사실이다 스택 기반 기계로서의 FPU.

이제 우리는 x86으로 범위를 좁혔습니다. 이유는 분명합니다. 컴퓨팅의 다른 많은 것들처럼 역사적인 이유도 있습니다 (실제 이유가 실제로 이해가 안되기 때문에 일부는 히스테리 건포도라고합니다).

역사적인 이유는 x86 아키텍처에 FPU가 없었기 때문입니다. 자, 당신이 "펜티엄을 봐라!"라고 말할 것입니다. 예, 그들은 FPU를 가졌지 만, IBM이 PC를 만들기 위해 선택한 원래의 8086은 FPU가 없었습니다. 요즘에는 로우 엔드 마이크로 컨트롤러와 같이 엄밀히 말하면 정수 기계였습니다.

저급 단말기와 텍스트 프로세서를 주로 사용했기 때문에 문제가되지 않았습니다. 그러나 그것의 싸구려와 인기는 그것이 과학과 공학 응용에 사용되는 것을 갑자기 보았다. 따라서 사람들은 FPU 칩을 장착 한 확장 카드를 사용하여 작업 속도를 높였습니다. 이 카드 중 가장 인기있는 것은 Intel에서 제조 한 스택 기반 칩을 사용하는 것입니다. 이 작은 사실 때문에 인텔은 나중에 인텔 칩을 차세대 CPU에 쉽게 통합 할 수있게되었습니다.

이 시점에서 인텔은 추가 기능 칩을 기반으로하지 않은 명령 세트를 설계 할 수있었습니다. 그러나 두 가지 일이 일어났습니다. 대부분 게임 및 스프레드 시트와 같은 많은 앱이 애드온 FPU를 사용하기 시작했으며 이러한 앱은 매우 인기가있었습니다. 또한 다른 칩 벤더들은 PC 시장에서 무슨 일이 일어나고 있는지를보고 행동을 원했습니다. 따라서 이전 버전과의 호환성 및 이러한 기능을 빠르게 추가 할 필요가 있었기 때문에 인텔은 엔지니어링 측면에서 볼 때 비즈니스 관리 측면에서 가장 현명한 작업을 수행했습니다. 단순히 코 프로세서 칩을 x86의 다음 버전에 포함 시켰기 때문에 마케팅 부서는 그들이 FPU를 가지고 있다고 말할 수 있습니다.

짧은 이야기 : 히스테리 건포도!

+0

http://en.wikipedia.org/wiki/8087 –

3

이 질문은 "On the Advantages of the 8087's Stack"이라는 짧은 종이에 작성한 W. Kahan 본래의 8087 자신의 설계자가 진정으로 대답 할 수 있습니다.

거기에서 :

  • 8087 스택은 정말 "고전 스택"아닙니다, 당신은 어떤 레지스터뿐만 아니라 상위 두/세 개의 레지스터에 액세스 할 수 있습니다.
  • 2 개의 피연산자/명령어로 구성된 플랫 레지스터는 비실용적이었습니다. 하나의 피연산자 명령어를 선호하는 코 프로세서 명령어에 대한 인코딩 공간이 부족했습니다 (그리고 그 스택은 탁월합니다). 그리고 레지스터 수 (분명히 8 개가 불가능했고, 4 개의 레지스터에 충분한 공간이있는 것 같았습니다) 일부 공통 부동 소수점 연산을 효율적으로 계산할 수 없었습니다.
  • 스택 오버플로/언더 플로는 자주 발생하지 않고 소프트웨어로 처리되어 훨씬 더 큰 스택의 환상을 제공합니다.