4

基本的に、オペレーティングシステムの違いにもかかわらず、マシン言語またはアセンブリ言語のいずれかを使用して、x86プロセッサを搭載した任意のコンピュータで動作するプログラムを作成できるかどうかを知りたいと思っています。たとえば、プログラムを実行すると、どのコンピューターを使用していても、「Hello、World!」と表示されます。これらのいずれかを言語で知りたいと思うのは少しおかしいと思いますが、学ぶのは素晴らしいことだと思います。

4

6 に答える 6

2

いいえ、プログラムはオペレーティング システムに大きく依存しています。「Hello, world!」などの出力を書き込むために、通常、プログラムはオペレーティング システムに要求を出します。通常、プログラムはオペレーティング システムによって指定された場所 (EAXレジスタなど) に要求の引数を配置し、オペレーティング システムからのサービスを要求する命令を実行します。

オペレーティング システムの要求は、通常、番号または類似のスキームによってコード化されます。したがって、出力ストリームへの文字の書き込みを要求するには、 に 1 つの数字を入れますEAX。ファイルを開くには、別の番号などを使用します。明らかに、コードはオペレーティング システムごとに異なります。(これらのリクエストは通常​​、ライブラリ呼び出しでラップされます。「書き込み」などのライブラリを呼び出すと、上記で説明したのと同様のことを行うための命令が含まれています。)

ハードウェアを操作して「自分で」画面に書き込みたいと思っても、いくつかの問題があります。1 つは、オペレーティング システムがハードウェアへのアクセスを許可する必要があることです。最近のほとんどのシステムでは、ユーザー モード プログラムがハードウェアに直接アクセスできないようになっています。2 つ目は、プログラムを特定のハードウェア向けに設計する必要があることです。文字を送信できる古いスタイルの BIOS があるか、システムに最新のファームウェアがある可能性があります。異なるファームウェアまたは CPU 以外の異なるコンポーネントを操作するには、さまざまな方法が必要です。

とはいえ、いくつかの異なるオペレーティング システムで動作するアセンブリ言語プログラムを作成することは、不可能ではないかもしれません。FORTRAN と C の両方のように、同時に複数の高級言語で書かれた(多言語と呼ばれる) プログラムがいくつかあります。行は有効な C コードです。そして、その C コードはコメントを開始できます。その後の行は、FORTRAN コードと C コメント、または FORTRAN コメントと C コードのいずれかになるように配置されます。2 つの異なるオペレーティング システムがそれを実行可能ファイルとして受け入れ、"Hello, world!" を出力するように、実行可能ファイルで同様のことを行うことができるかもしれません。それぞれで(または、さらに良いことに、それぞれで異なることを行います)。

DOS .COM フォーマットは生のバイナリ ファイルなので、これには適しているかもしれません。別のシステムの実行可能ファイルの最初の数バイトがジャンプ命令を表すバイトである可能性がある場合、.COM ファイルはファイル内の別の場所へのジャンプを引き起こす可能性があり、そこで任意のバイトを配置することができます。 、それ以外の場合、ファイルは他のシステムの実行可能ファイルです。

もちろん、これは実行可能ファイルを設計するための意図した方法ではなく、簡単な作業ではありません。

ほとんどのオブジェクトまたは実行可能ファイル形式では、ファイルの最初の 2 バイトまたは 4 バイトがファイル形式を識別するマジック ナンバーである必要があるため、.COM 以外のほとんどのファイル形式では不可能な場合があります。広く使用されている ELF 形式のマルチプラットフォーム実行可能ファイルは、プラットフォームごとに異なる ELF ファイル内のフィールドの異なる値を表示する方法を見つけることができれば可能です。

于 2011-06-25T01:03:55.303 に答える
2

一般的に、No.

OS が異なれば、API 関数のサポートも異なり、異なるアドレスで異なるハードウェアをサポートします。

多数のプラットフォームをカバーしたい場合は、おそらく Java が最適です。

于 2011-06-25T00:41:21.073 に答える
1

"場合によります"

実際のスタンドアロンの実行可能バイナリが必要な場合、答えはノーです。ただし、アセンブリのスニペットを作成するだけの場合は、それをより大きな実行可能ファイルに埋め込むと、答えは「はい」になります。ただし、アセンブリコードのそのblob内でOS固有の機能を呼び出すことは許可されません。したがって、複数のオペレーティングシステムで「Helloworld」を出力する単一のアセンブリプログラムを作成するというこの夢を実現することはおそらく不可能です。

于 2011-06-25T00:47:59.937 に答える
1

バロニー。x86 コンピュータの MACHINE LANGUAGE は、マシンごとに変わりません。彼らがすることは、命令などを追加することです。プログラムに「hello world」よりも複雑なことをさせたい場合、それを達成する方法は、ハードウェアがページングなどをどのように処理したかによって少し異なります。 RAMで飛び回らない小さなプログラムは、それぞれでほぼ同じです。

于 2014-01-04T00:08:07.120 に答える
0

要するに、違います。

オペレーティングシステムは通常、バイナリプログラムの最初のバイトの実行を開始するだけではありません。代わりに、アプリケーションのアドレススペースを設定します。これには、呼び出しスタックの大きさ、定数に事前に割り当てたい値、バイナリファイルのどの部分を実行可能ファイルとしてロードするかなどが含まれます。書き込み可能なデータではなく、コード。

バイナリプログラムがオペレーティングシステムにアドレス空間を構成する方法を指示する方法は、オペレーティングシステムによって異なります。

于 2011-06-25T00:42:17.473 に答える
0

はい、いいえがあなたの答えです。たとえば、x86アセンブリを記述して、Linux、Mac OS X、およびMS Windowsで同じことを実行できます...しかし、同じことを実行すると、文字通り、同じ場所からデータを取得し、同じように実行します。操作し、メモリのどこかに保存します。

したがって、このようにして、すべてのプラットフォームで同じ方法で高速3D計算などを行うことができますが、データをアセンブリルーチンに出し入れする方法と、それを使用する目的はすべてのプラットフォームで異なります。したがって、どのOSでもhello worldを「表示」することはできませんが、OS固有のコードがそれを引き出して使用できるように、文字「helloworld」(または変換された頂点のセット)をメモリのどこかに置くことができます。

于 2011-06-25T00:45:19.763 に答える