마이크로 프로그래밍 대 기계 언어 프로그래밍


10

마이크로 프로그래밍 수준과 기계 언어 수준간에 약간 혼란 스러워요. 예를 들면 다음과 같습니다.

  1. 실행되는 동안 두 유형의 프로그램이 어디에 있습니까?
  2. 어셈블리 언어 true-op 명령어에 1 ​​: 1 매핑이 있습니까?
  3. 프로세서 아키텍처에 의해 형식이 정의되어 있습니까?

4
아직 읽지 않았다면 [Wikipedia] [1] 기사를 확인하십시오. 꽤 좋습니다. [1] : en.wikipedia.org/wiki/Microcode
Shawn J. Goff

5
마이크로 코드는 아마도 당신이 말하는 것이 아닐 것입니다. 자체 CPU를 설계하지 않는 한 마이크로 코드에 관심이 없을 것입니다. '마이크로 코드'의 '마이크로'와 '마이크로 컨트롤러'를 혼동 할 수 있지만 같은 것은 아닙니다.
davr

1
아니요, 마이크로 코드를 사용하고 있습니다. CPU 내부를 연구하고 있으며 마이크로 코드와 같은 가장 낮은 계층을 이해하려고합니다.

답변:


7

마이크로 코드는 머신 코드 이외의 추상화 수준입니다. 실제 CPU는 마이크로 코드를 실행 중이며 변환 엔진은 기계 코드를 마이크로 코드로 즉시 변환합니다. 이는 더 빠르고 작은 프로세서, 더 적은 디버깅으로 복잡한 프로세서를 쉽게 만들 수 있으며 이전 버전과의 호환성 등 다양한 이유로 수행됩니다. 예를 들어, x86 명령어 세트에는 거의 사용되지 않는 일부 문자열 처리 명령어가 포함되어 있습니다. 그러나 이전 버전과의 호환성을 유지하려면 최신 x86 프로세서에서 계속 사용할 수 있어야합니다. 이러한 명령어의 실행 경로를 하드 와이어 연결하는 대신 마이크로 코드로 변환하여 실행합니다. 이것은 여전히 ​​하위 호환성을 유지하면서 실리콘을 절약합니다.

실행되는 동안 두 유형의 프로그램이 어디에 있습니까?

머신 코드는 RAM에서 가져온 후 캐시에 상주합니다. 마이크로 코드는 특정 머신 아키텍처에 따라 마이크로 코드 캐시에 있습니다. 캐시는 가능한 가장 큰 머신 코드 명령어로부터 변환 된 마이크로 코드를 보유하기에 충분한 마이크로 코드를 보유 할만큼 충분히 크거나, 또는 많은 머신 코드의 변환 된 결과를 저장하여 모두 다시 변환 할 필요가없는 더 큰 캐시 일 수 있습니다. 작은 루프에 대한 각 반복의 기계어 코드

일부 아키텍처에서는 변환 된 마이크로 코드가 어디에도 저장되지 않습니다. 페치 / 번역 장치는 현재 실행중인 머신 코드를 기반으로 일련의 마이크로 코드 명령어를 뱉어냅니다. 이 경우 마이크로 코드는 일종의 ROM에서 실행되며 머신 코드는 본질적으로 ROM에 대한 인덱스이며 머신 코드 명령을 완전히 실행하기 위해 실행해야하는 일련의 마이크로 코드 명령을 가리 킵니다.

어셈블리 언어 true-op 명령어에 1 ​​: 1 매핑이 있습니까?

기계 코드 및 어셈블리 코드 는 일반적 으로 어셈블리 명령어에 1 ​​: 1로 매핑됩니다. 어셈블러에 따라 다릅니다. 상위 레벨 어셈블러에는 한 세트의 어셈블리 코드를 작성할 수있는 큰 매크로 세트가있을 수 있으며 어셈블러는 여러 기계 코드를 생성합니다.

그러나 일반적으로 "순수한"어셈블리 언어는 프로세서 매뉴얼의 명령어 세트 표를 사용하여 기계 코드로 직접 변환 할 수 있습니다.

그래도 "실제 지침"이 무엇을 의미하는지 잘 모르겠습니다. 아마도 당신은 참조를 설명 할 수 있습니다.

프로세서 아키텍처에 의해 형식이 정의되어 있습니까?

머신 코드와 마이크로 코드의 형식은 프로세서 아키텍처에 의해 정의됩니다.


'true-op'은 합성 또는 의사 어셈블리 언어 명령어가 아닌 명령어를 의미합니다. 두 번째 질문의 경우 마이크로 코드 명령어가 어셈블리 언어 true-op 명령어에 매핑되는지 여부를 묻습니다.

@Louis-일반적으로 마이크로 코드로의 1 : 1 변환 인 게시 된 어셈블리 코드는 없습니다. 인텔과 AMD (및 기타)는 프로세서의 내부 아키텍처에 대한 강력한 통찰력을 제공하므로 마이크로 코드를 독점적으로 유지합니다. 예를 들어 연구자들에게 특정 목적을 위해 정보를 기꺼이 제공하여 특정 응용 프로그램에 대해 기계에서 마지막 1 %의 성능을 얻을 수 있지만 대부분의 경우 게시 된 사양 만 제공한다고 들었습니다. 기계 코드 및 일반 아키텍처 설명이 포함됩니다.
Adam Davis

8

기본적으로 마이크로 코드는 제한된 CPU 명령어 세트를 확장하여 하드웨어에서 구현하기에 번거롭지 만 기존 명령어로 비교적 쉽게 구축 할 수있는 상위 명령어를 포함합니다. 마이크로 코드를 사용하면 작은 명령어 세트가있는 프로세서가 큰 명령어 세트가있는 프로세서처럼 작동 할 수 있습니다.

MARIE 명령어 세트로 작업 중이고 Add x, y 함수를 원한다고 가정하지만 아키텍처는 Add x (현재 레지스터에있는 것을 x에 추가하는 것) 만 허용하므로 마이크로 코드 명령어를 추가하십시오.

LOAD x //Load x into the register
ADD y //Add y to the value in the register

이제 기계어 코드가 다음과 같이 말합니다.

ADD x,y

ROM에 추가 한 ADD 기능 (마이크로 코드)을 찾아서 실행합니다. 명령어 세트가 증가하여 더 읽기 쉬운 머신 코드가 가능하고 마이크로 코드가 ROM에 저장되어 있기 때문에 RAM에서 LOAD 및 ADD를 호출하는 것보다 약간 빠릅니다.

필자는 구형 시스템에서 매우 빠른 속도로 사용자 정의 측정을 수행하기 위해 실제로 마이크로 코드를 작성한 회사에서 근무했습니다. 그러나 FPGA가 발전함에 따라 훨씬 더 빠른 속도로 전환되었습니다 (실제로는 ROM 대신 하드웨어에서 "사용자 정의 명령어"를 구현하기 때문에).


마이크로 코드는 어떻게 작성하고 실행 했습니까?
Erik Kaplun

@ErikAllik 처음부터 자신의 컴퓨터를 구축해야만 가능합니다.
user253751

5

많은 프로세서는 실행중인 명령어에 의해 전환 시퀀스가 ​​영향을받는 상태 머신에 의해 구동됩니다. 마이크로 코드 "명령"은 종종 프로그래머가 볼 수없는 방식으로 다양한 레지스터와 버스 간의 상호 작용을 지정합니다.

예를 들어, 상태 # 1의 8 비트 CPU에 대한 마이크로 코드 명령어는 프로그램 카운터의 양쪽 절반에 대한 출력 가능이 활성화되도록 지정합니다 (프로그램 카운터가 상단 및 하단 내부 주소 버스에서 출력되도록 함). 프로그램 카운터 증가 신호가 활성화되어야하고 외부 주소 래치 신호가 활성화되어야합니다 (따라서 외부 주소 버스가 내부 신호를 추적합니다). RAM 읽기 신호가 활성화되어야하며 컨트롤러는 상태 # 2로 전환해야합니다.

상태 # 2에서 외부 데이터 버스는 내부 기본 데이터 버스로 공급되고 해당 버스에서 읽은 명령 레지스터가로드되어야합니다. 프로그램 카운터는 이전과 같이 주소 버스의 절반과 RAM 읽기가 모두 수행되어야합니다. 명령 레지스터의 비트 5-7은 상태 제어기의 비트 0-2에로드되어야하며, 명령 레지스터의 비트 1-7이 모두 설정되지 않은 한 상태 레지스터의 비트 3은 상태 레지스터의 다른 비트가 설정되어야합니다. 다음 결과는 # 7- # 15가 될 것입니다.

마이크로 코드는 실제로 명령어로 정의되는 것이 아니라 제어 신호의 조합으로 정의됩니다. 하드웨어는 마이크로 코드로 범용 명령어를 허용하도록 설정되지 않고, 버스가있는 버스에 다양한 레지스터를로드 또는 출력하거나, 서로 다른 버스를 서로 연결하고, 다양한 비트 또는 이들의 조합을 사용하도록 설정됩니다. 다른 상태를 선택하십시오. 설계의 많은 측면이 배선으로 연결됩니다 (예 : opcode FE 및 FF는 마이크로 코드가 아닌 하드웨어에 특수한 경우가 있습니다). 마이크로 코드 개념은 프로그램을 실행하는 것이 아니라 논리를 대체하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.