web-dev-qa-db-ja.com

WindowsとLinuxのX86アセンブリ言語には大きな違いがありますか?

私はアセンブリーの完全な初心者です。私の目標は、アセンブリーを使用してできる限り多くのことを学び、専門家レベルに達することができるようにすることです(私は今、私はすぐに道を外れていることを知っていますが、あなたは決して知りません)。私の唯一の問題はこれです。私は、どちらもアセンブリを教える2冊の本を持っています。1つはLinuxに関するもので、もう1つはWindowsに関するものです。これらは、Jeff Duntemannのアセンブリ言語のステップバイステップ(Linux版)および80x86アセンブリ言語とコンピューターアーキテクチャの紹介(Windowsバージョン)です。アセンブリを最大限に活用したい場合、これをLinuxとWindowsで実行する必要がありますか?また、構文はWindowsとLinuxで同じですか、それとも他のOSで学習するときにもう一度自分に教えますか(これが私の懸念事項ですが、WindowsとLinuxでアセンブリを使用できるようにしたいです)。

8
Logan545

何を書きたいかによります。

記述したいのがCで記述された「ドライバー」プログラムから呼び出される特定の関数であり、システムコールを実行する必要がない場合は、使用するCコンパイラーがアーキテクチャーよりもはるかに重要です。関数を公開する方法を規定しているためです。

代わりに、Assemblyで本格的なアプリケーションを作成し、システムコールを利用する(またはデバイスドライバーを作成する)ことに関心がある場合は、オペレーティングシステムも非常に重要です。

したがって、基本的には、プログラムを作成する対象を選択します。

FreeBSDの開発者向けハンドブックには、アセンブリプログラミングに特化した章があります。短くてよく書かれていて、興味深い例が含まれていて、最後は単純なCGIスクリプト(!)で終わります。あなたはそれを読んで感じを得ることができます:

http://www.freebsd.org/doc/en/books/developers-handbook/x86.html

追伸:集会は90年代の半ばに私が最初に学んだ言語の1つです。 MS-DOS 6.22システムで、IsaacsonのシェアウェアアセンブラーとRalf Brownの割り込みリストを使用してそれを学びました。VirtualBoxのおかげで、おそらくその感覚を再び得ることができます! :-)

Win/Linux/OSX上のASMでのコーディングの1つの大きな違いは、呼び出し規約です。他のものより使用するのに難しいものはありません、それらはただ違うだけです。また、呼び出し間で保持する必要のあるレジスターにも注意する必要があります。

WINDOWS:RCX、RDX、R8、R9

Microsoft x64呼び出し規約は、WindowsおよびプリブートUEFI(x86-64のロングモード用)に準拠しています。最初の4つの整数またはポインター引数に(この順序で)レジスターRCX、RDX、R8、R9を使用し、浮動小数点引数にはXMM0、XMM1、XMM2、XMM3を使用します。追加の引数はスタックにプッシュされます(右から左)。 64ビット以下の場合、整数の戻り値(x86と同様)がRAXで返されます。浮動小数点の戻り値はXMM0で返されます。 64ビット長未満のパラメーターはゼロ拡張されません。上位ビットはゼロにされません。

LINUX/OSX:RDI、RSI、RDX、RCX、R8、R9

System V AMD64 ABIの呼び出し規約は、Solaris、Linux、FreeBSD、OS X、およびその他のUNIXライクまたはPOSIX準拠のオペレーティングシステムに準拠しています。最初の6つの整数またはポインター引数は、レジスターRDI、RSI、RDX、RCX、R8、およびR9で渡されますが、XMM0、XMM1、XMM2、XMM3、XMM4、XMM5、XMM6、およびXMM7は、浮動小数点引数に使用されます。システムコールの場合、RCXの代わりにR10が使用されます。 Microsoft x64呼び出し規約と同様に、追加の引数がスタックに渡され、戻り値はRAXに格納されます。

TOOLS:WindowsとLinuxでほとんど同じツールが見つかります。

私の個人的な意見:

  • FASMとNASMは素晴らしいです:)
  • 私はよくPurebasicを使用します。これは、ニースの読み取り可能/コメント付きのFASMコードを生成し、インラインアセンブラーを受け入れる、クローズドソースのコマーシャル(無料、限定バージョンの限定版)ベーシックです。それはこれまで断食されたコードを生成しませんが、それは私が好きなツールです。もちろん、それなしで行うことができ、純粋なASMを最初から作成するだけです。
  • 386を使用する場合は、x86_64 ASMにジャンプしてください。より多くの命令(注意:MMX/SSEパック命令は奇妙で、(非常に?)使いにくい)とはるかに多くのレジスタ(素晴らしい!)!
  • ハードコアオプション:BOCHSまたはQEMUをインストールし(QEMUを使用)、オペレーティングシステムなしでASMの作成を開始します。 MBRから始めて、次にブートローダーのステージ1、ステージ2、カーネルなど...私の詳細に文書化されたMBR /ブートローダー(機能的だが不完全)を自由に見てください https://github.com/ker2x/zymology/tree/master/bootloader/Oak64/src 気分が良ければ:)
5
ker2x

アセンブリはプラットフォーム間で異なり、同じプラットフォーム上の異なるアセンブラ間でも異なります。システムコールと割り込みは異なり、AT&TとIntelの構文の問題があります。ただし、WindowsとLinuxアセンブリの違いは、たとえばx86とPICアセンブリの違いよりもはるかに小さいです。どちらかを知っていれば、もう一方を学ぶのは簡単です。

readアセンブリできるようにする方が、それを書くよりもはるかに便利です。また、いくつかの異なるアーキテクチャを試すことで、より上手に読むことができます。自分を制限しないでください。私の仕事では、x86アセンブリは表示されませんが、PowerPCアセンブリでデバッグすることがあります。

4
Karl Bielefeldt

Linuxは何らかの理由でAT&Tスタイルのx86アセンブリコードを好む傾向があります。それはかなりひどいです。 Windows開発を行うには、おそらくはるかに読みやすいIntelスタイルの構文をサポートするVisual Studioを使用します。 Intelのサンプルコードもこのスタイルを一般的に使用しています。 Visual Studioを使用して64ビットアプリのインラインアセンブリを作成することはできません。32ビットアプリでのみ機能します。 64ビットアプリは、代わりに組み込み関数を使用することが想定されています。 gccにこの制限があるとは思いません。

0
James