2017-02-12 3 views
1

나는 운영 체제 개발과 초급 과정을 배우고 있습니다. C 언어를 사용하는 16 비트 환경 인 리얼 모드 환경에서 시스템을 구축하고 싶습니다. GCC의 언어로 16 비트 실행 파일을 (정확히는 아니지만) 생성`asm()`함수는 C 언어로 어떻게 작동합니까?

asm(".code16") 

을 :

는 C에서, 나는 다음과 같은 16 비트 코드를 변환하는 기능 asm()을 사용했다.

질문 :

가정하자 나는 두 개의 헤더 파일 head1.hhead2.hmain.c 파일이 있습니다. 이제

asm(".code16"); 
#include<head1.h> 
#include<head2.h> 
int main(){ 
    return 0; 
} 

내가 16 비트 실행 파일을 생성하는 명령을 내 코드를 시작하고 head1.hhead2.h 포함되어 있기 때문에 나는 모든 헤더 파일에서 동일한 작업을 수행해야합니다, 다음과 같이 main.c 파일의 내용은 나는 창조 할 것인가? (또는) asm(".code16"); 번 줄을 한 번 추가하는 것으로 충분합니까?

OS : 우분투는

컴파일러 :은 GNU CC

+4

gcc를 사용하여 16 비트 코드를 컴파일하지 않는 것이 좋습니다. 당신이 사용하는 것은 많은 문제를 일으키는 괴롭힘입니다. – fuz

답변

4

은 귀하의 질문에 대답하려면 : asm 블록이 번역 단위의 시작 부분에 존재하는 것이 충분하다.
처음에 한 번 넣으면됩니다.

하지만 더 잘할 수 있습니다. 모두 피할 수 있고 대신 the -m16 command line option (available from 5.2.0)을 사용할 수 있습니다.

하지만 더 잘할 수 있습니다. 완전히 피할 수 있습니다.


-m16.code16의 효과는 리얼 모드 코드를 생성하는 하지입니다, 리얼 모드에서 32 비트 코드를 실행하는 것입니다.

(16).추출 C

int main() 
{ 
    return 4; 
} 

우리가 피연산자 크기 접두사로 가득 단지 32 비트 코드

00000000 6655    push ebp 
00000002 6689E5   mov ebp,esp 
00000005 6683E4F0   and esp,byte -0x10 
00000009 66E800000000  call dword 0xf 
0000000F 66B804000000  mov eax,0x4 
00000015 66C9    o32 leave 
00000017 66C3    o32 ret 

을 얻을 원시

>gcc -c -m16 16.c 
>objcopy -j .text -O binary 16.o 16.bin 
>ndisasm 16.bin 

세그먼트는 .text.
On a real pre-386 machine this won't work as the 66h opcode is UD.


제대로 리얼 모드 응용 프로그램의 문제를 해결하는, Turbo C1처럼, 기존 16 비트 컴파일러가 있습니다.

Turbo C code generation options

또는 가능한 한 빨리 보호 모드에서 스위치 또는 UEFI를 사용하는 것이 좋습니다.


1는 온라인으로 사용할 수 있습니다. 이 컴파일러는 나만큼 오래되었습니다!

+1

[ "전쟁을 언급하지 마십시오!"] (https://www.youtube.com/watch?v=yfl6Lu3xQW0). Turbo-C (++)에 대해 잘 아는 사람들이 적을수록 좋습니다. –

0

asm("code16")head1.hhead2.h에 추가 할 필요가 없습니다.

주된 이유는 C 사전 컴파일러가 어떻게 작동하는지입니다. 이 파일은 head1.hhead2.h의 내용을 main.c으로 바꿉니다.

자세한 내용은 How `#include' Works을 확인하십시오.

희망이 있습니다.

안부,

미겔 앙헬