마이크로 프로그래밍 수준과 기계 언어 수준간에 약간 혼란 스러워요. 예를 들면 다음과 같습니다.
- 실행되는 동안 두 유형의 프로그램이 어디에 있습니까?
- 어셈블리 언어 true-op 명령어에 1 : 1 매핑이 있습니까?
- 프로세서 아키텍처에 의해 형식이 정의되어 있습니까?
마이크로 프로그래밍 수준과 기계 언어 수준간에 약간 혼란 스러워요. 예를 들면 다음과 같습니다.
답변:
마이크로 코드는 머신 코드 이외의 추상화 수준입니다. 실제 CPU는 마이크로 코드를 실행 중이며 변환 엔진은 기계 코드를 마이크로 코드로 즉시 변환합니다. 이는 더 빠르고 작은 프로세서, 더 적은 디버깅으로 복잡한 프로세서를 쉽게 만들 수 있으며 이전 버전과의 호환성 등 다양한 이유로 수행됩니다. 예를 들어, x86 명령어 세트에는 거의 사용되지 않는 일부 문자열 처리 명령어가 포함되어 있습니다. 그러나 이전 버전과의 호환성을 유지하려면 최신 x86 프로세서에서 계속 사용할 수 있어야합니다. 이러한 명령어의 실행 경로를 하드 와이어 연결하는 대신 마이크로 코드로 변환하여 실행합니다. 이것은 여전히 하위 호환성을 유지하면서 실리콘을 절약합니다.
실행되는 동안 두 유형의 프로그램이 어디에 있습니까?
머신 코드는 RAM에서 가져온 후 캐시에 상주합니다. 마이크로 코드는 특정 머신 아키텍처에 따라 마이크로 코드 캐시에 있습니다. 캐시는 가능한 가장 큰 머신 코드 명령어로부터 변환 된 마이크로 코드를 보유하기에 충분한 마이크로 코드를 보유 할만큼 충분히 크거나, 또는 많은 머신 코드의 변환 된 결과를 저장하여 모두 다시 변환 할 필요가없는 더 큰 캐시 일 수 있습니다. 작은 루프에 대한 각 반복의 기계어 코드
일부 아키텍처에서는 변환 된 마이크로 코드가 어디에도 저장되지 않습니다. 페치 / 번역 장치는 현재 실행중인 머신 코드를 기반으로 일련의 마이크로 코드 명령어를 뱉어냅니다. 이 경우 마이크로 코드는 일종의 ROM에서 실행되며 머신 코드는 본질적으로 ROM에 대한 인덱스이며 머신 코드 명령을 완전히 실행하기 위해 실행해야하는 일련의 마이크로 코드 명령을 가리 킵니다.
어셈블리 언어 true-op 명령어에 1 : 1 매핑이 있습니까?
기계 코드 및 어셈블리 코드 는 일반적 으로 어셈블리 명령어에 1 : 1로 매핑됩니다. 어셈블러에 따라 다릅니다. 상위 레벨 어셈블러에는 한 세트의 어셈블리 코드를 작성할 수있는 큰 매크로 세트가있을 수 있으며 어셈블러는 여러 기계 코드를 생성합니다.
그러나 일반적으로 "순수한"어셈블리 언어는 프로세서 매뉴얼의 명령어 세트 표를 사용하여 기계 코드로 직접 변환 할 수 있습니다.
그래도 "실제 지침"이 무엇을 의미하는지 잘 모르겠습니다. 아마도 당신은 참조를 설명 할 수 있습니다.
프로세서 아키텍처에 의해 형식이 정의되어 있습니까?
머신 코드와 마이크로 코드의 형식은 프로세서 아키텍처에 의해 정의됩니다.
기본적으로 마이크로 코드는 제한된 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 대신 하드웨어에서 "사용자 정의 명령어"를 구현하기 때문에).
많은 프로세서는 실행중인 명령어에 의해 전환 시퀀스가 영향을받는 상태 머신에 의해 구동됩니다. 마이크로 코드 "명령"은 종종 프로그래머가 볼 수없는 방식으로 다양한 레지스터와 버스 간의 상호 작용을 지정합니다.
예를 들어, 상태 # 1의 8 비트 CPU에 대한 마이크로 코드 명령어는 프로그램 카운터의 양쪽 절반에 대한 출력 가능이 활성화되도록 지정합니다 (프로그램 카운터가 상단 및 하단 내부 주소 버스에서 출력되도록 함). 프로그램 카운터 증가 신호가 활성화되어야하고 외부 주소 래치 신호가 활성화되어야합니다 (따라서 외부 주소 버스가 내부 신호를 추적합니다). RAM 읽기 신호가 활성화되어야하며 컨트롤러는 상태 # 2로 전환해야합니다.
상태 # 2에서 외부 데이터 버스는 내부 기본 데이터 버스로 공급되고 해당 버스에서 읽은 명령 레지스터가로드되어야합니다. 프로그램 카운터는 이전과 같이 주소 버스의 절반과 RAM 읽기가 모두 수행되어야합니다. 명령 레지스터의 비트 5-7은 상태 제어기의 비트 0-2에로드되어야하며, 명령 레지스터의 비트 1-7이 모두 설정되지 않은 한 상태 레지스터의 비트 3은 상태 레지스터의 다른 비트가 설정되어야합니다. 다음 결과는 # 7- # 15가 될 것입니다.
마이크로 코드는 실제로 명령어로 정의되는 것이 아니라 제어 신호의 조합으로 정의됩니다. 하드웨어는 마이크로 코드로 범용 명령어를 허용하도록 설정되지 않고, 버스가있는 버스에 다양한 레지스터를로드 또는 출력하거나, 서로 다른 버스를 서로 연결하고, 다양한 비트 또는 이들의 조합을 사용하도록 설정됩니다. 다른 상태를 선택하십시오. 설계의 많은 측면이 배선으로 연결됩니다 (예 : opcode FE 및 FF는 마이크로 코드가 아닌 하드웨어에 특수한 경우가 있습니다). 마이크로 코드 개념은 프로그램을 실행하는 것이 아니라 논리를 대체하는 것입니다.