2013-09-27 3 views

답변

4

내가 아는 한 GCC는 16 비트 x86 용 코드 생성을 지원하지 않습니다. 레거시 부트 로더 및 유사한 목적을 위해 어셈블리 언어로 된 작은 스텁을 작성하여 CPU를 32 비트 모드로 설정하고 실행을 32 비트 코드로 전달해야합니다. 다른 목적으로는 실제로 16 비트 코드를 작성하면 안됩니다.

+0

훨씬 더 설명해 주시겠습니까? -m16 옵션은? –

2

GCC는 8086 코드를 생성하지 않습니다. GNU AS 지시문 .code16gcc은 GCC의 출력을 어셈블하여 16 비트 모드에서 실행하고 C 소스의 시작 부분에 asm(".code16gcc")을 넣으면 프로그램이 64KB로 제한됩니다.

+0

문서화 위치 : https://sourceware.org/binutils/docs/as/i386_002d16bit.html#i386_002d16bit –

+2

.code16gcc 사용 (여전히 안정적인 기능이라고 할 수는 없지만)은 16 비트로 실행되는 코드를 생성합니다. 리얼 모드이지만 386+에서만 사용할 수있는 명령어 접두어를 사용합니다. 즉, 8086/8088 (실제 하드웨어 또는 에뮬레이터)을 대상으로하는 경우 코드가 제대로 작동하지 않을 수 있습니다. 항목을 32 비트 보호 모드로 부트 스트랩하려는 경우 모든 것을 설정하고 보호 모드를 시작한 다음 프로그램의 시작 부분 인 32 비트 "C"함수를 호출하는 작은 16 비트 어셈블러 스텁을 작성하십시오. –

+0

물론 __asm__ 지시문을 사용하여 GCC에서 16 비트 어셈블러를 인라인 어셈블리로 코딩 할 수 있습니다. –

6

GCC 5.2.0 (및 가능한 이전 버전)은 -m16 플래그가있는 16 비트 코드 생성을 지원합니다. 그러나 코드는 32 비트 프로세서 기능 (예 : 32 비트 폭 레지스터)에 거의 의존하므로 생성 된 어셈블리를 신중하게 확인해야합니다. man 페이지에서

는 :

-m16 옵션은 따라서 그 어셈블리 출력 초에 ".code16gcc"어셈블리 지시어를 출력 제외한 -m32와 동일 이진수는 16 비트 모드에서 실행할 수 있습니다.