초부터 LCC를 사용하는 것이 좋습니다. 이 homebrew 16-bit RISC 프로젝트에서 사용했습니다 : http://fpgacpu.org/xsoc/cc.html.
8 비트 변형을 구현하고 3 개의 add-with-carry를 사용하여 IP를 늘리거나 24 비트 변형을하고 하드웨어에서 전체 작업을 수행해야할지 여부는별로 다르지 않다고 생각합니다. 어셈블러의 차이를 숨길 수 있습니다.
위의 기사 나 여기의 더 간단한 CPU를 보면 : http://fpgacpu.org/papers/soc-gr0040-paper.pdf 정수 C 반복문을 다루는 데 필요한 많은 연산자/명령어가 필요하지 않습니다. 실제로 주어진 기계에 대해 min 연산자 세트를 인쇄하는 lcc 유틸리티 (ops)가 있습니다. 자세한 내용은
여기에 새 시스템으로 LCC를 포팅에 내 문서를 참조하십시오 http://www.fpgacpu.org/usenet/lcc.html 내가 LCC를 이식 한 후
, 나는 어셈블러를 작성하고, 기본적인 것들과 지침의 큰 repetoire을 합성.예를 들어, 내 컴퓨터는로드 바이트 부호하지만 부하 바이트 서명했다, 그래서 나는이 순서 방출 :
registers
load register with constant
load rd = *rs
store *rs1 = rs2
+ - (w/ w/o carry) // actually can to + with - and^
>> 1 // << 1 is just +
&^ // (synthesize ~ from ^, | from & and ^)
jump-and-link rd,rs // rd = pc, pc = rs
skip-z/nz/n/nn rs // skip next insn on rs==0, !=0, <0, >=0
:
lbs rd,imm(rs) ->
lbu rd,imm(rs)
lea r1,0x80
xor rd,r1
sub rd,r1
그래서 난 당신이 작업이 분 커버에 의해 얻을 수 있다고 생각을
심지어 레지스터가 없으면 (또는 메모리가있는 레지스터를 흐릿하게 만드는 경우 - 모든 레지스터에 메모리 주소가 있음) 훨씬 간단합니다.
SP에 대한 레지스터를 별도로 설정하고 컴파일러에 prolog/epilog 처리기 함수를 쓰면 스택 지침에 대해 걱정할 필요가 없습니다. 각 피 호출자 저장 레지스터를 저장하고 프레임 크기에 따라 SP를 조정하는 등의 코드가 있습니다.
인터럽트 (및 인터럽트로부터의 복귀)는 간단합니다. 명령 레지스터에 점프 앤 링크 명령을 강제로 수행하면됩니다. 0과 같은 비트 패턴을 선택하고 올바른 주소를 소스 레지스터 rs (특히 r0 인 경우)에 넣으면 플립 플롭 재설정 입력 또는 추가 강제 설정 값을 사용하여 수행 할 수 있습니다. 0과 게이트. 위의 두 번째 논문에서 비슷한 트릭을 사용합니다.
흥미로운 프로젝트입니다. TTL/7400 컨테스트가 진행 중이고 컴퓨터가 얼마나 단순해질 수 있는지 생각하고 있었고 코드와 데이터를 저장하기 위해 32KB 또는 128KB 비동기 SRAM을 컴퓨터에 추가하는 것이 바람 피 웠을 것입니다.
어쨌든, 해피 해킹!
p.s.
1) 각 정수 유형의 크기를 결정해야합니다. 원하는 경우 최소 문자 표현 범위에서 호환되지는 않지만 char, short, int, long, long long 등과 같은 크기, 한 개의 24b 단어를 만들 수 있습니다.
2) 그리고 여기서 lcc에 초점을 맞추었지만 C++에 대해 묻고있었습니다. 나는 C를 우선 권고한다. 소프트웨어에서 *, /, % 연산자를 포함한 C에 대한 정보를 얻은 후에는 LLVM 또는 GCC에 상관없이 완전한 C++로 이동하는 것이 더 쉽습니다. C와 C++의 차이점은 가상 함수 호출, 멤버 역 참조 (dereference), 동적 캐스트, 정적 생성자, 예외에 대한 포인터를 처리하는 데 필요한 여분의 vtable 및 RTTI 테이블과 코드 시퀀스 (전체적으로 기본 C 정수 연산자 repetoire로 구성되어 있음) 처리 등.
이것은 간단한 질문 일 수도 있지만, 왜 C++의 모든 기능을 구현해야합니까? 당신은 단지 새로운 LLVM 타겟 아키텍처를 쓸 수 없으며, Clang은 문제없이 C++를 컴파일 할 것인가? –
@Dan Cecile 바로 내가 할 일입니다. 그러나 24 비트 메모리 공간을 갖춘 8 비트 CPU 용 LLVM 백엔드 작성은 다소 단순 할 수 있습니다. – BarsMonster
그래서 네 부분으로되어 있습니다. [LLVM 어셈블리 언어] (http://llvm.org/docs/LangRef.html)를 구현하는 방법을 알아 내고 하드웨어와 함께 작동하며 [기존 LLVM 대상] (https://github.com/earl)을 복사 및 적용합니다./llvm-mirror/tree/master/lib/Target) 하드웨어를 사용하여 Clang이 [8 비트 LLVM 바이트 코드를 생성하는 방법] (http://clang.llvm.org/doxygen/classclang_1_1TargetInfo.html)을 구하십시오.) ([포인터 크기는 구성 가능합니다.] (http://clang-developers.42468.n3.nabble.com/Re-targeting-clang-to-a-new-architecture-tp761920p762813.html)) 하드웨어를 다음과 같이 변경하십시오. 더 적합하다. –