COMファイルで使用される命令セットは何ですか?8086だと思っていたのですが、間違っていたようです。私が見つけた8086のマニュアルでは、shlは2番目の引数として1またはclしか受け入れられませんが、1以外の即値は私にとっては問題なく機能します。重要な場合は、NASMを使用しています。
御時間ありがとうございます。
3 に答える
これはそれらの面白い質問の1つであり、いつものように答えは誤解を招くものです。
真のDOSCOMファイルにはヘッダーがなく、メモリの単一セグメント内に収まる必要があります。これは、再配置情報がないため、DOSはファイルを必要な場所に配置する必要があり、(x86と)互換性がある唯一の真の方法は8086互換のアセンブリを使用します。編集:上記を明確にするために、これは8086にメモリページがなかったためです。
確かに、286/386オペランドでコンパイルできます。プログラムが実行されると、DOSには、停止して「それはできません。386命令です」と言うエグゼクティブランタイムがないためです。
これは、おかしなことに、COMファイルがWindows7 x32で、またはWindows7x64でまったく機能しない理由の一部です。
DOSの動作方法により、.comファイルの実行時にcommand.comがアンロードされ、後で再ロードされたため、基本的に.comファイルはシステムのすべてのメモリにアクセスでき、理論的にはPharlapのDOS/4GWなどのDOSメモリエクステンダーを使用できます。そしてCWSDPMIが思い浮かびます。
短編小説; 現在のシステムでサポートできるあらゆる種類のコマンドを使用できますが、確実に使用するのは16ビットx86互換のコマンドのみです。
上記がPITAのように聞こえる場合、それはそうだったからです、私は覚えています:)それは、.EXE形式が非常に急速に普及した理由でもあります。
真のCOM(実際にはEXEなどのCOMには入りません)は、単純なDOS実行可能ファイルであることを意味します。サポートされている命令セットは何でも利用できます。私は昔、8088からi486までのDOSプログラミング(COMとEXEの両方)を行っていましたが、そのモードで合法的な命令であれば、何でも使用できます。たとえば、ターゲットが「16ビット」(技術的には「リアルモード」と呼ばれるべき)DOSの場合、32ビット文字列命令と即時プッシュをよく使用しました。
COMファイルには主に2つのタイプがあります。1つはMS-DOSで実行するように設計されており、もう1つはCP /MOSで実行するように設計されています。私の知る限り、DOSCOMファイルはx86ベースである必要があります。ウィキペディアによると、CP / M COMファイルは8085、8080、またはZ80命令である可能性があります。別の回答として述べたように、COMは単純な実行可能形式であり、サポートされている基本的な命令セットを使用できます。
SHL命令に関しては、最新のx86ハードウェア(おそらくx64)は、この命令の即値の使用をサポートしているようです。ただし、8086のドキュメントだけを見ると、参照が見つからなかったため、ある時点で追加されたに違いありません。この手順の詳細を説明する参考資料をいくつか示します。
http://siyobik.info/main/reference/instruction/SAL%2FSAR%2FSHL%2FSHR