5

少し前にアセンブリの学習を開始することにしたので、FASMW を使用して 16 ビット アセンブリから始めました。しかし、最近、Windows 7 64 ビットを実行する新しいコンピューターを手に入れましたが、プログラムがアセンブルするコンパイル済みの .COM ファイルが機能しなくなりました。.COM は 64 ビット Windows と互換性がないというエラー メッセージが表示されます。32 ビット アセンブリは引き続き動作しますが、16 から始めて、徐々に上に進んでいきたいと思います... Windows 7 で 16 ビット プログラムを実行することは可能ですか? またはそれらをコンパイルする特定の方法はありますか?それともあきらめて、代わりに 32 ビットにスキップする必要がありますか?

4

3 に答える 3

8

16 ビット アセンブリを使用できない理由は、Windows のすべての 64 ビット バージョンから16 ビット サブシステム が削除されているためです。

これを解決する唯一の方法は、DOSBox などをインストールするか、VirtualBox などの仮想マシン パッケージをインストールしてから、そこに FreeDOS をインストールすることです。そうすれば、とにかく真の DOS を取得できます。( NTVDM は真の DOS ではありません)

個人的には、DOS 用に 16 ビット アセンブリを作成することをお勧めしますか? いいえ。32 ビットまたは 64 ビットのアセンブリを使用します。その理由は、オペレーティング システムごとに異なる関数呼び出しのセット (ABI と呼ばれる) があるためです。そのため、64 ビット Linux アプリの ABI は 32 ビットのものとは異なります。それがWindowsの場合かどうかはわかりません。ただし、割り込みの意味はおそらく異なることを保証します。

また、使用中のメモリ モデルなど、16 ビット アセンブリではさまざまな考慮事項があります。私は間違っているかもしれませんが、DOS は 64K のメモリを提供して「それだけ」で遊べると信じています。私が理解しているように、すべて、ヒープ全体、スタック全体、およびコードがこのスペースに収まる必要があります。

于 2010-09-01T17:55:07.063 に答える
7

私のアドバイスは、32 ビット コードを記述することです。最初は 16 ビット コードの書き方を学び、次に 32 ビット コードに「卒業」するのが理にかなっているように思えるかもしれませんが、実際にはその逆であると言えます。32 ビット コードを書く方が実際には簡単です。かなりの数の任意のアーキテクチャ上の制約 (たとえば、ベース レジスタとして使用できるもの) が基本的に 32 ビット コードではなくなっているためです。

さらに言えば、16 ビット x86 コードを作成する本当の理由があるかどうかについては、かなりの疑問が残ると思います。ほとんどの実用的な目的では、これはデッド プラットフォームです。デスクトップ マシンの場合は非常に時代遅れであり、組み込みマシンの場合は、ARM や Microchip PIC などを目にする可能性が高くなります。特定のターゲットを念頭に置いていて、それが 16 ビットの x86 になることが確実にわかっていない限り、世界の他のほとんどの国と同じように、その存在を忘れてしまうでしょう。

于 2010-09-01T18:00:28.010 に答える