2017-02-12 11 views
1

私はオペレーティングシステム開発と初心者を習っています。私は、C言語を使った16ビット環境のリアルモード環境でシステムを構築したいと考えています。 Cにおいて`asm()`関数はどのようにC言語で動作しますか?

、私は次のように16ビットにコードを変換する機能asm()を使用:

asm(".code16") 

GCCの言語で16ビットの実行可能ファイル(正確ではないけれども)を生成するためにどの。

質問:

私は2つのヘッダファイル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:Ubuntuの

コンパイラ:GNU CC

+4

gccを使用して16ビットコードをコンパイルしないことをお勧めします。あなたが使用しているのは、多くの問題を引き起こす泥だらけです。 – fuz

答えて

4

は、あなたの質問に答えるために:asmブロックは、翻訳単位の開始時に存在することが十分です。
だから初めに一度入れるといいでしょう。

しかし、あなたはもっとうまくいく可能性があります:それを避けて、代わりにthe -m16 command line option (available from 5.2.0)を使用してください。

しかし、あなたはもっとうまくいくかもしれません。あなたはそれを完全に避けることができます。


-m16.code16の効果は実モードで32ビット・コードを実行可能にするために、それはリアルモードコードを生成しないあります。

ルック

16。生の.textセグメント

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

を抽出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 

を取得します。
On a real pre-386 machine this won't work as the 66h opcode is UD


適切にリアルモードアプリケーションの問題に対処Turbo C のような古い16ビットのコンパイラは、あります。

Turbo C code generation options

また、できるだけ早くプロテクトモードで切り替えたり、UEFIを使用することを検討してください。


それはオンラインで入手可能です。このコンパイラは私と同じくらい古いです!

+1

[「戦争を言わないでください!」](https://www.youtube.com/watch?v=yfl6Lu3xQW0) Turbo-C(++)について知っている人が少なくなるほど良いでしょう! –

0

は、head1.hにもhead2.hもないasm("code16")を追加する必要はありません。

主な理由は、Cプリコンパイラの動作です。 head1.hhead2.hの内容をmain.cに置き換えます。

詳細については、How `#include' Worksをご確認ください。

希望すると助かります!

敬具、

ミゲル・アンヘル・

関連する問題