2014-02-08 4 views
0

작은 프로젝트로서 필자는 8080 아키텍처를 기반으로하는 구형 마이크로 컴퓨터 CPU 에뮬레이터를 제작 해왔다. 8 비트 범용 레지스터 (according to wikipedia)는 "3 개의 16 비트 레지스터 쌍"과 일반 8 비트 모드로 사용될 수 있습니다. 그리고 여기 내 문제가있다.모델링 마이크로 컴퓨터 메모리에 등록 하시겠습니까?

첫 번째 모델링 시도는 개별 이름이 지정된 바이트와 단락이었습니다. 사양 페이지를 다시 읽고 16 비트 레지스터가 실제로 자체적 인 것이 아니라는 것을 알았을 때까지 잘 작동했습니다. 죄송합니다.

내가 지금 노력하고있는 것은 8 비트 레지스터마다 하나의 위치와 스택/명령어 포인터 용으로 예약 된 두 위치의 바이트 배열입니다. 이것은 매우 잘 작동하고 8 비트 레지스터에 좋으며 관리하기가 훨씬 쉽지 않지만 2 바이트를 메모리 부족으로 변환하는 방법을 실제로 알지 못합니다. 그게 가능한가? 그렇지 않다면 어떻게해야하는지에 대한 제안이 있습니까?

+3

공용체 사용을 고려하십시오. 또는 메모리 표현을 사용하여 직접 작업하려면 포인터를 사용하십시오. –

+0

어, 어떻게 다른 유형의 두 변수를 가리키는 포인터를 만들까요? 나는 아직도 C++ 위업을 배우고있다. – Lexusjjss

+1

기본적으로 동일한 메모리 주소를 가진 두 개의 다른 유형의 포인터가 있습니다. C++에이 작업을 위해 많은 것을 권유하고 있습니다. 그러나 C에서 벌거 벗게 드러난 프로그래밍 모델과 에뮬레이트하려고하는 하드웨어 아키텍처의 유사성 때문에 C에서는 사소한 부분도 없습니다. 물론 포인터 접근 방식은 에뮬레이트 된 호스트 아키텍처와 동일한 엔디안 방식을 필요로합니다 ... 현재 시점에서는 가능성이 매우 높습니다. –

답변

-1

16 비트 레지스터의 첫 번째 바이트 주소를 void 포인터로 캐스팅하여 해결하고 다시 short로 변환합니다. 별로 안전하지는 않지만 헤이 작동합니다. 명백하게 나는 틀린 물건을 인터넷 검색으로 만하고 있었다.

+0

유니온은 더 우아하지만 작동합니다. – Dougvj

+1

전통적인 안전 개념 유형이 에뮬레이터를 빌드 할 때와 마찬가지로 여기에서 작동하기 시작할 것입니다. 시스템에서 동일한 비트를 해석 할 필요가 있다는 사실을 재현해야합니다. 실행중인 명령에 따라 다양한 방법. 이미 너비 차이를 알고 있습니다. 그러나 서명 된/서명되지 않은 것을 조심하십시오. 모든 ALU 연산이 직접 C/C++ 연산을 수행하는 것은 아닙니다. 예를 들어, 회전과 교대를 사용할 수 있습니다. 그리고 나서 캐리 비트가 있습니다. 캐리 비트는 캐리 비트에 포함될 수도 포함되지 않을 수도 있습니다. –

+1

이것은 C++에서 합법적 일만큼 타입 안전하지 않습니다. 죄송합니다. 그리고 빅 엔디 언 (big-endian) 머신에서 프로그램을 실행하려고 시도하면 깨질 수 있습니다. – Potatoswatter