2

その過程で基本的な ASM を学びながら、FreeDOS で C でプログラミングすることに興味があります。

次に、ASM についてですが、最新のプロセッサでは、CPU アーキテクチャが複雑なため、アセンブリでプログラミングするのが難しいことはわかっていますが、FreeDOS を使用すると、おそらくより単純な 16 ビット命令セットに制限されますか?

4

2 に答える 2

3

MS-DOS と FreeDOS は "HIMEM" 領域を使用します: これらは:

  • 0xA000:0x0000 を超える一部のメモリ領域は、拡張カードの代わりに RAM を含む拡張カード用に予約されています
  • 0xFFFF:0x0010 から 0xFFFF:0xFFFF までのメモリで、1MB より上にありますが、16 ビットのリアル モード コードを使用してアクセスできます (いわゆる A20 ラインがアクティブな場合)。

この方法でアーカイブできる最大メモリ サイズは約 800K です。

XMS と EMS を使用すると、最大 64M を使用できます。

  • XMS は、16 ビット リアル モード コードを介してアクセスできる領域の上にメモリ ブロックを割り当てます。そのメモリから下位 640K のメモリに、またはその逆にデータをコピーできる特別な機能があります。
  • EMS も同様です。ただし、EMS を使用すると、上位メモリを下位アドレスに「マップ」することができます (32 ビット CPU の機能)。これは、1MB 領域より上のメモリに、1MB より下のアドレスにあるかのようにアクセスできることを意味します。
于 2013-12-03T16:07:36.560 に答える
1

エクステンダがなければ、プログラムは DOS で最大 640KB の低メモリを使用できます。ただし、各構造はセグメントのサイズ、つまり 64KB に制限されます。つまり、サイズが 64KB の大きな配列を 10 個持つことができます。もちろん、1 つのセグメントに複数の配列を含めることができますが、それらの合計サイズがセグメント サイズを超えてはなりません。一部のコンパイラは、複数のセグメントにまたがるアドレスも自動的に処理するため、64KB を超えるオブジェクトをシームレスに使用できます。また、アセンブリで記述している場合も同じことができます。

より多くのメモリにアクセスするには、 EMSXMSなどのエクステンダが必要です。ただし、アドレス空間は依然として 20 ビット幅であることに注意してください。エクステンダーは、高メモリ領域をアドレス可能なスペースのいくつかのセグメントにマップするだけなので、一度にデータの小さなウィンドウしか見ることができません

アセンブリに関しては、16 ビット モードで 32 ビット レジスタを使用できます。オペランドのサイズを変更するための 66h および 67h プレフィックスがあります。ただし、それは 16 ビット コードを書く方が簡単だという意味ではありません。実際、メモリ アドレッシングでの制限されたレジスタの使用など、覚えておくべき多くの特異性があります。32 ビットの x86 命令セットは、よりクリーンなアドレッシング モードと、より使いやすいフラットなアドレス空間を備えています。

于 2013-12-03T08:17:07.693 に答える