14

x86命令セットアーキテクチャについて学びたいです。x86のアセンブリを学ぶという意味ではありません。マシンコードベイビーを理解したい。

その理由は、x86用のアセンブラーを作成したいからです。次に、そのアセンブリにコンパイルするコンパイラを作成します。

x86命令セットをカバーするIntelマニュアルとAMDマニュアルがあることを私は知っています。しかし、それらは非常に大きくて密度が高いです。

x86命令セットアーキテクチャを学習するためのより親しみやすい(おそらくチュートリアルの)アプローチがあるかどうか疑問に思います。

4

6 に答える 6

22

まあ、私はあなたに同意しません。x86の複雑さは誤解されているため、誇張されています。複雑ではないと言っているのではありません。確かにそうですが、それは本格的なコンパイラまたはアセンブラを作成したい場合にのみ当てはまります。アセンブリを学びたいだけなら。それほど複雑ではありません。

x86-64アーキテクチャを分解して、私の主張を証明しましょう。


レジスター:

x86-64は少数のレジスタを指定します。正確にいくつですか?それらを列挙しましょう

  • 16汎用レジスタ(RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP + R8、R9、R10、R11、R12、R13、R14、R15)
  • 6つのセグメントレジスタ(CS、DS、SS、ES、FS、GS)
  • 64ビットRFlagsと64ビットRIP
  • 8つの80ビット浮動小数点(x87)レジスタ(FPR0-FPR7)は、64ビットMMXレジスタ(MM0-MM7)にエイリアスされます。
  • 16個の128ビット拡張メディアレジスタ(XMM0-XMM7 + XMM8-XMM16)
  • 制御レジスタ(CR0〜4)、デバッグレジスタ(DR0〜3、プラス6および7)、テストレジスタ(TR4〜7)、記述子レジスタ(GDTR、LDTR、IDTR)、タスクレジスタなどの特殊/その他のレジスタ(TR)私たちがほとんど気にする必要はありません。

代替テキストhttp://www.viva64.com/content/articles/64-bit-development/amd64_em64t/01-big.png


アドレッシングモード:

メモリの場所を参照する方法は?

ソース: http: //en.wikipedia.org/wiki/X86#Addressing_modes

32ビットまたは64ビットx86プロセッサでの32ビットアドレスサイズのアドレッシングモードは、次の式で要約できます。

代替テキスト

64ビットx86プロセッサ上の64ビットコードのアドレッシングモードは、次の式で要約できます。

代替テキスト

RIP+[変位]


動作モード:

これらはそれが作動できるモードです:

  1. リアルモード
  2. 保護モード
    • 仮想8086モード
  3. ロングモード

指図書:

あなたは人々がその大きな命令セットを言うのを聞きます。さて、約500-600の指示があります。しかし、それらのいくつかは、CMPS / CMPSB / CMPSW / CMPSD / CMPSQのように、ほとんど変化のない同じ命令です。このようにグループ化すると、400命令になります。

とても大きいと思いますか?それから私はいくつか質問があります。C標準ライブラリにはいくつの関数がありますか?POSIXライブラリにはいくつの関数がありますか?.NETとJavaはどうですか?クラスとメソッドはいくつありますか?すべての関数/メソッド/クラスを知る必要がありますか?これらのライブラリを学習するためにどのようなアプローチを取りますか?

それぞれから少し学ぶだけです。それらすべてを大まかに調べます。それらの存在を感じ取り、必要なときにリファレンスを使用してください。

これらの命令は、論理的に次のカテゴリに分類できます。

  1. 汎用の説明
    • 基本的なデータ操作(移動とコピー)
    • 制御転送(ジャンプ、呼び出し、割り込み)
    • 算術および論理命令(add、sub、and、xorなど)
    • 文字列およびビット指向の命令
    • システムコール
  2. システムの説明
  3. x87浮動小数点命令
  4. 64ビットメディア(MMX)命令
  5. 128ビットメディア(SSE)命令

それでおしまい!!あなたが知る必要があるのはそれだけです。率直に言ってください。そんなに複雑ですか?

x86アーキテクチャをカバーするアセンブリ言語に関する優れた本を入手してください。個人的には、RajatMoonaによる「GNU/LinuxでのIA32アーキテクチャ用のアセンブリ言語プログラミング」をお勧めします。あなたの時間の多くを無駄にしません。ただし、X86-64は対象外です。

x86-64用のIA32に慣れたら、http: //csapp.cs.cmu.edu/public/1e/public/docs/asm64-handout.pdfを読んでください。

于 2010-05-11T19:19:14.943 に答える
6

ある時点で、少し複雑に対処する必要があります。x86命令セットは大きいです。

ただし、古いCPUのドキュメントを読むことで、作業を大幅に簡素化できます。IntelとAMDは、各サブモデルに数十の新しい命令を追加しているようです。80386のIntelマニュアルを読んでみてください。これはかなり小さいですが、使用するものの多くをカバーしています。

私は良い(古い)本を知っていますが、それはフランス語です。J.-Mでは「Programmationdu80386」と呼ばれています。とM.トリオ。今日でも編集されているかどうかはわかりません(20年近く前に購入しました)。

于 2010-03-18T15:04:17.730 に答える
2

深海に飛び込んでそこから始めようと思います。

単純な(C / ++)アプリケーションを作成することから始めます。次に、OllyDbg(http://www.ollydbg.de/)と呼ばれる壮大なデバッガーを使用します。アプリケーションをデバッグし、コンパイラがコードをどのように実装したかを確認します。ループを確認します。関数呼び出しを確認してください。API呼び出しを確認してください。メモリ操作を確認してください。

そうすることで、あなたは物事をどのように行うかについての本当の考えを得るでしょう。

私はこの方法でアプリケーションをデバッグし、アセンブリを学びました。あなたはマシンコードを理解したいと言っていますが、私の意見ではこれ以上の方法はありません。

「crackme」(グーグル)と呼ばれるもので確認することもできます。これはあなたのスキルをテストするための挑戦にあなたを置きます。制御できるようになると、知りたいことはすべて、マニュアルセットの手順を掘り下げるだけの問題であることがわかります。ポイントを取得しますか?特定の目標に挑戦してください。

幸運を。それは簡単ではありませんが、非常に可能です。

于 2010-03-18T19:32:46.803 に答える
1

数と、Mod R / Mバイトやその背後にあるその他の奇妙な点などの複雑さを理解したいだけの場合は、単純な8086エミュレーターの実装を試してみてください。(CPUのみ)。楽しくて面白い体験だと思いました。

http://www.ousob.com/ng/iapx86/は、エミュレーターを作成するときに使用した非常に優れたリファレンスであり、表示されたCPUバージョン、および各バリエーションの16進オペコードとともに非常に優れたオペコードのリストを提供します。オペコード。

于 2010-03-18T15:00:46.933 に答える
1

NASMマニュアルの古いバージョンには、簡潔でわかりやすいリファレンスがありましたが、それらが参照するCPUは非常に最近のものです。これが私が見つけたランダムなコピーです。オペコード(パターンが見やすいように配置されている)を一覧表示し、アドレッシングモードのエンコーディングについて説明します。

http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html

基本的にこの情報だけを使用してランタイムマシンコードジェネレーター(486以上をターゲット)を作成したので、開始するのに十分なはずです...

于 2010-05-11T19:29:59.423 に答える
0

あなたは現実的ではないと思います。あなたはsed:

x86命令セットをカバーするIntelマニュアルとAMDマニュアルがあることを私は知っています。しかし、それらは非常に大きくて密度が高いです。

..。

そのすべてを学びたいです。おそらく、私は最も簡単で最も習得しやすいものから始めるべきです。

なぜ大きくて密集しているのか自問しましたか?答えは簡単です!Intelx86製品を探しているだけの場合

  • 8086、8088、80186、80188、8028616ビットCPUがあります。
  • ビルド浮動小数点コプロセッサ32ビットCPUを搭載した80386および80486があります。
  • PentiumとPentiumMMXがあります
  • Pentium Pro、Pentium II、PentiumIIIがあります
  • あります:Pentium 4 Pentium M、Pentium 5、Pentium 6、Celleron、Prescott
  • あります:Intel Core 2、Intel Core i7
  • あります:Intel Atom
  • あります:Sandy Bridge

  • 16、32、64ビットアーキテクチャがあります

  • 浮動小数点ユニットにはいくつかの異なる計算があります。
  • ストリーミングSIMD拡張命令がいくつかあります。
  • CPUにはいくつかの保護されたモデルがあります。

がある...

x86アーキテクチャには32年間の研究開発があります。 また、AMD、VIAなどについては触れませんでした。

いいえ、もっと速い方法はありません!

于 2010-03-18T19:11:36.797 に答える