2017-09-06 12 views
3

16 비트 타겟 용 GNU C++ 컴파일러 인 Sourcery IA16 compiler을 다운로드했으며 작동합니다 (멀리 포인터를 지원하지는 않지만 인라인 asm 레지스터 할당과 관련된 결함이 있지만). 내가 몇 가지 컴파일러 옵션을 추가해야한다, 그림에서 보듯이ia16-elf-g ++ 컴파일러로 fpu 코드 (에뮬레이션되지 않음)를 생성하는 방법은 무엇입니까?

/tmp/ccBB3kEN.o: In function `foo()': 
(.text+0x38): undefined reference to `__floatsisf' 
/tmp/ccBB3kEN.o: In function `foo()': 
(.text+0x44): undefined reference to `__mulsf3' 
/tmp/ccBB3kEN.o: In function `foo()': 
(.text+0x4c): undefined reference to `__fixsfsi' 

는, 기본적으로는 소프트 FPU를 사용하고자하는, 그래서 문질러서 : 나는 C에서 float 변수를 선언 할 때

그러나, 컴파일러는 말한다 네이티브 FPU 코드를 생성합니다. 그러나 나는 실패했다. 이제

나는 컴파일러 옵션 -march=i80186을 사용하고, 그리고 도움은 내가 몇 가지 접미사를 추가해야한다고 말한다 : 그것은 도움말 텍스트처럼 보이는

-march=CPU[,+EXTENSION...] 
    Igenerate code for CPU and EXTENSION, CPU is one of: 
    generic32, generic64, i386, i486, i586, i686, 
    pentium, pentiumpro, pentiumii, pentiumiii, pentium4, 
    prescott, nocona, core, core2, corei7, l1om, k1om, 
    iamcu, k6, k6_2, athlon, opteron, k8, amdfam10, 
    bdver1, bdver2, bdver3, bdver4, znver1, btver1, 
    btver2 
EXTENSION is combination of: 
    8087, 287, 387, no87, mmx, nommx, sse, sse2, sse3, 
    (etc.) 

은 IA16에 대한 것이 아니라, 포함하지 않는 16 비트 CPU를 (그러나 64분의 32 비트 것들 포함), 또한 작동하지 않는 확장, 나는 -march=i8086,8087으로 시도했습니다 :

ia16-elf-g++: error: unrecognized command line option '-march=i8086,8087 

다른 옵션을 -mhard-float도 작동하지 않습니다처럼.

ia16-elf-g++: error: unrecognized command line option '-mhard-float' 

내 질문은 :이 컴파일러에 대해 8086 + 8087 대상을 어떻게 설정할 수 있습니까? 지원하지 않는 경우, FPU 코드 (Linux 또는 MacOS 플랫폼)에서 MS-DOS .com 출력을 생성 할 수있는 다른 C/C++ 컴파일러가 있습니까?

+0

도스 시대의 FPU 에뮬레이션에 대한 기억은 소프트웨어 루틴을 호출했을 때 8087 코 프로세서가 설치되었는지 확인하고, 그렇다면 호출 사이트를 기본 8087 opcode로 패치하는 것입니다. 그런 다음 작업을 수행하기 위해 패치 된 opcode로 돌아갑니다 (물론 해당 코드를 실행하면 소프트웨어 루틴을 호출하지 않습니다). 나는 GCC FPU 에뮬레이션 라이브러리가 똑같은 일을하는지는 모르겠지만, 점검할만한 가치가있을 것이다. –

+0

BTW OpenWacom이 다양한 프로젝트에서 MS-DOS 실행 파일을 컴파일하는 데 사용되는 것을 보았습니다. 그것은 gcc와 같이 업데이트되고 표준에 부합하지 않을 수도 있지만, 와콤은 gcc가 실제로 그렇게 생각하지는 않지만 꽤 오랫동안 DOS 용 생산 강도 컴파일러였습니다. –

+0

@MichaelBurr : IIRC 모든 x87 opcode가 트랩 될 특수한 맹 글링 된 첫 바이트로 방출되었습니다. 인터럽트 루틴은 보조 프로세서가 사용 가능한지를 확인한 다음, op 코드를 패치하고 재개합니다. 그렇지 않으면 소프트웨어에서 계산을 수행합니다. 그러나 이런 종류의 링커 에러 (직접적으로 관련 함수가 아니라 일부 지원 라이브러리에서)에서 gcc는 소프트웨어로 모든 계산을 수행하려고 시도하고 있다고 생각합니다. –

답변

1

오피스 대상 에뮬레이터 또는 장치가 아닌 경우 path/to/share/doc/sourceryg++-ia16-elf/man/man1/ia16-elf-g++.1

에있는 80 {{1} 8 {6,8}, 286} -mfpmath=80387ia16-elf-g{++,cc}이 작은 모델을 생성하는 것으로

. 기본적으로 COM 파일.

-march=i8086+8087으로 시도 할 수도 있지만 as에서만 작동합니다.