2012-05-07 3 views
1

이것은 스택 오버플로에 대한 나의 첫 번째 게시이므로 제대로 수행하고 있기를 바랍니다. ;-)TriCore 에뮬레이터에서 피연산자를로드해야하는 시점은 언제입니까?

TriCore 에뮬레이터를 개발하려고하지만 명령에 피연산자를로드 할 때 전략을 결정할 수 없습니다. TriCore는 다소 모호한 종류의 마이크로 컨트롤러 일 수 있으므로 아키텍처에 대해 조금만 설명하겠습니다.

16 비트와 32 비트의 두 가지 유형의 명령어가 있습니다. 16 비트인지 32 비트인지 여부는 마지막 바이트의 비트 0에 의해 결정됩니다. 바이트 순서는 리틀 엔디안이므로 항상 메모리의 첫 번째 바이트입니다. 문제 없습니다.

이러한 두 가지 명령어 유형에는 16 비트의 경우 14 개와 32 비트 명령어의 경우 25 개의 opcode 형식이 있습니다. 비록 16 비트의 대부분이 하나의 opcode 필드만을 갖더라도, Opcode는 2 개의 별도의 opcode 필드로 나뉘어집니다. 첫 번째 opcode 필드는 하위 8 비트에 있습니다. 직접 16 비트 명령어에 대한 명령어를 설명하고 32 비트 명령어의 많은 부분에 대해 피연산자 인코딩을 설명하지만 두 번째 필드는 실제 명령어를 설명합니다 (물론 예외가 있습니다).

제 계획은 항상 모든 opcode 필드를 추출해야합니다 (두 번째 필드의 위치가 모든 명령어 형식에서 동일하지 않으므로 약간 짜증이납니다). 그리고 함께 사용할 16 비트 값으로 넣으십시오. 함수 포인터 테이블.

이 값에 따라 피연산자를 추출하고 싶습니다. 예를 들어 32 비트 명령어에서 첫 번째 opcode가 0x8B이고 피연산자가 두 개의 데이터 레지스터와 하나의 9 비트 상수입니다. 하지만 실제로 지루한 예외가 있습니다.

ADD.AADDSC.A 명령은 모두 opcode 1 == 0x01입니다. 그러나 ADD.A은 세 개의 주소 레지스터를 사용하는 반면 ADDSC.A은 두 개의 주소 레지스터, 하나의 데이터 레지스터와 인덱스를 사용하여 명령에 인코딩됩니다.

제 질문은 : 명령을 실행하기 전에 이와 같은 아키텍처에서 피연산자를로드하는 것이 가능합니까? 아니면 먼저 명령어 함수를 호출하고 거기에 피연산자를 추출하는 것이 더 낫겠습니까? 관심있는 사람들을위한

는 명령 세트 설명서는 여기에 있습니다 : 어떤 힌트 http://www.infineon.com/dgdl/tc_v131_instructionset_v138.pdf?folderId=db3a304412b407950112b409b6cd0351&fileId=db3a304412b407950112b409b6dd0352

감사합니다!

BTW : 선택한 언어는 C 또는 C++입니다.


(요청, 나는 내 원래의 질문에 내 생각을 삽입했다.)

글쎄, 나는 내가 가지고있는 다른 옵션에 대해 광범위하게 생각하고 난 다음에 해결 것이라 생각합니다.

제가 두 부분으로 전체 프로세스를 나누는 것이다

  1. 프로그램 분석과 피연산자 추출
  2. 실행

첫 번째 단계에서, 각각의 명령들은로드되고 32 비트로 정렬된다.그런 다음로드 된 명령어를 일련의 비트 마스크와 비교하여 마지막으로 실행해야 할 것뿐만 아니라 피연산자가로드되는 방식을 알려주는 올바른 opcode를 결정합니다. 주소 모드 특정 함수에서 피연산자는 포인터에로드됩니다. 지시 즉시는 필요에 따라 저장된다.

이이에 구조체와 유사한 귀결 :

struct instruction_t { 
    int32_t **operands; 
    int32_t *immediates; 
}; 

이것은 기본적으로 (각 명령에 대한 가장 큰 단점 할당됩니다. 메모리 소비를 나는 (와 최악의 경우와 같은 구조체에 대한 40 바이트를 계산 64 비트 포인터) 이는 일반적으로 16 비트 명령어로 구성된 4 메가 ​​바이트의 프로그램은 결국 약 80 메가 바이트의 메모리를 차지한다는 것을 의미합니다. 반면에 실행 속도는 비교적 빠를 것이라고 생각합니다.

이 방법을 사용하면 피연산자가로드되는 방식과 상관없이 각 명령을 한 번만 구현할 수 있습니다. 또한 동일한 피연산자 집합을 사용하여 동일한 명령을 실행하면 실제 컴퓨터에서와 같이 작동합니다. 코드 실행은 올바른 구조체를 선택하고 이에 따라 명령어 함수를 호출하여 올바른 피연산자 세트를로드하는 것을 의미합니다.

다른 접근법이 있습니다. 특히 동적 재 컴파일이 좋습니다. 그러나이 시스템은 다양한 온칩 구성 요소와 입출력 매핑 레지스터를 사용하기 때문에 다소 복잡합니다. 어쨌든 상당한 양의 상용구 코드가 추가됩니다.

내 접근 방식에 대한 의견을 보내 주시면 감사하겠습니다. 어쩌면 당신은 더 나은 방법을 알고 있을까요?

감사합니다.

답변

-1

(내 접근 방식을 원래 질문으로 옮겼습니다.)

+0

이것은 고유 한 답변이 아닌 원래 질문의 편집으로 더 유용합니다. –

관련 문제