2011-06-25 6 views
2

基本的には、オペレーティングシステムの違いにもかかわらず、x86プロセッサを搭載したコンピュータで動作するプログラムを書くために機械語またはアセンブリ言語を使用できるかどうかを知りたいと思っています。たとえば、プログラムを実行していて、どのコンピュータであっても、「Hello、World!」と表示されます。 これらの言語のどちらかを知りたいと思うのはちょっと夢中ですが、私は学ぶのは信じられないことだと思っています。一般的にはアセンブリ言語または機械語で書くと、プログラムは互換プロセッサを搭載したコンピュータで動作しますか?

答えて

2

、第

別のOSのAPI関数ごとに異なるサポートを持っており、異なるアドレスで異なるハードウェアをサポートします。

プラットフォームの最大量をカバーしたい場合は、Javaがおそらく行く方法です。

+0

私の主要なプログラミング言語はjavaです。私はそれを楽しむためにアセンブリを学んでいます。 – user663425

0

要するに、

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

バイナリプログラムがオペレーティングシステムにどのようにアドレス空間を設定したいかを指示する方法は、オペレーティングシステムによって異なります。

0

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

このようにして、すべてのプラットフォームで同じように高速の3D演算や何かを実行できますが、アセンブリルーチンにデータを出し入れする方法と、それを使用する方法はすべて異なりますプラットフォーム。どのOSでもhello worldを "表示"することはできませんが、 "hello world"(または変換された頂点のセット)をどこかのメモリに入れておけば、OS特有のコードで引き抜くことができます。あなたは、その後、答えはノー実際のスタンドアローン実行可能なバイナリである場合

0

「それは依存します」。しかし、アセンブリのスニペットを書こうと思っている場合は、それを大きな実行可能ファイルに埋め込みます。答えは「はい」です。しかし、アセンブリコードのそのブロブ内のOS固有の機能を呼び出すことは許されません。ですから、おそらく、複数のオペレーティングシステムで "Hello world"をプリントアウトする1つのアセンブリプログラムを作成するというこの夢を実現することはできません。

1

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

オペレーティングシステムの要求は、通常、番号または同様の方式でコード化されます。したがって、出力ストリームに文字を書くことを要求するには、$ eaxに1つの数値を入れます。ファイルを開くには、別の番号などを使用します。明らかに、コードはオペレーティングシステムによって異なります。 (これらの要求は、通常、ライブラリ呼び出しでラップされます。ライブラリを "write"のように呼び出すと、上で説明したのと同様のことを行うための指示が含まれます。)

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

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

生のバイナリファイルであるため、DOS .COM形式はこれに適しています。別のシステム用の実行可能ファイルの最初の数バイトがジャンプ命令を表すバイトであれば、.COMファイルはファイル内の他の場所にジャンプする可能性があります。そこでは、好きなバイトそれ以外のファイルは他のシステムの実行可能ファイルです。

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

0

バロニー。 x86コンピュータのMACHINE LANGUAGEはマシン間で変更されません。彼らがやっていることは、プログラムが「hello world」よりも何か関与していることを望むなら、命令を追加することです。例えば、h/wがページングをどのように処理するかによって少し違うでしょう。ラムの中で飛び回らなかった小さなプログラムは、それぞれほぼ同じであろう。

関連する問題