69

私は本当にアセンブリを学びたいと思っています。私は c/c++ がかなり得意ですが、下位レベルで何が起こっているのかをよりよく理解したいと思っています。

以前にアセンブリ関連の質問があったことは承知していますが、私の状況に特有の方向性を探しているだけです:

Windows 7 を実行していますが、アセンブリの作業を開始する方法について混乱しています。Windows 7 を実行しているため、x64 から開始する必要がありますか? 「最初は 32 ビットから始めてください」と言う人もいますが、これを行うにはどうすればよいですか? 「32」または「64」ビットのアセンブリを作成する能力と、オペレーティング システムとの関係は何ですか。実際、「n ビット」アセンブリとはどういう意味ですか?n は数字です??


編集:

アセンブリを開始するのに役立つリンクをいくつか示します。始めたばかりの人は、役に立つかもしれません。組み立ての旅を続けながら、このリストを更新し続けます:)

注: 学んできたので、masm32 を使用したプログラミングに集中することにしました。したがって、以下のリソースのほとんどはそれに焦点を当てています。

  • タグ wiki (ビギナー ガイド、リファレンス マニュアル、ABI ドキュメントなど)
  • www.masm32.com
  • X86 アセンブリ WikiBook
  • X86 Dissassembly WikiBook (いくつかの規則を理解するのに最適で、高レベルのコードをアセンブリに変換する方法の基本)
  • WinAsm IDE (masm32 とうまく連携)
  • はじめに: Windows 用のアセンブリ(すべてのコード例は masm32 用です)
  • 割り込み一覧
  • アセンブリ チュートリアル(主要な概念を理解するのに役立ちます)
  • x86 組み立てガイド
  • Agner Fog のソフトウェア最適化リソースには、さまざまなプラットフォーム (Windows と Linux/OS X) での呼び出し規則に関するいくつかの優れた情報や、特定のことを効率的に行う方法の多くの例が含まれています。まったくの初心者向けではありませんが、中級者から上級者向けです。

    (彼はまた、Intel および AMD CPU の各命令の詳細なパフォーマンス情報を提供しており、深刻なパフォーマンスのマイクロ最適化に最適です。一部の初心者は、CPU がどのように機能するか、およびなぜ何かを行うのかについて考え始めるために、その一部を調べたいと思うかもしれません。別の方法ではありません。)

4

5 に答える 5

43

32-bit人々がand assemblyに言及するとき64-bit、彼らはあなたがどの命令セットを使用するかについて話している-彼らは時々呼ばIa32x64、Intelの場合、あなたが尋ねていると私は推測する. 64 ビットの場合はさらに多くの処理が行われるため、32 ビットから始めるのがおそらく適切です。32 ビット アセンブラを使用してプログラムを 32 ビット バイナリにアセンブルしていることを確認する必要があるだけです。Windows は、それを実行する方法を引き続き認識します。

アセンブリを開始するために私が本当にお勧めするのは、ハンドルを取得するためのより単純な命令セットを備えたものです。MIPS アセンブリを学びましょう-spimシミュレーターは素晴らしく、使いやすいです。インテルのアセンブリーの世界に飛び込みたい場合は、アセンブリー・ルーチンを呼び出す小さな C プログラムを自分で作成してください。「実際のプログラム」のすべてのセットアップとティアダウンを行うのは大混乱であり、そこから始めることさえできません。そのため、その中に C ラッパーを記述しmain()、それをコンパイルして、アセンブリ コードの記述から取得したオブジェクト ファイルとリンクするだけです。

C コードでインライン アセンブリを記述する習慣を身につけないでください。これはコードの移植性の悪夢であり、その理由はありません。

Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者用マニュアルをすべてダウンロードして、作業を開始できます。

于 2010-02-28T18:22:52.090 に答える
33

私は1977年に長い道のりをたどってアセンブリを書き始めました。最初に基本的な操作(および、または、xorではない)と8進数学を学び、その後、OS/8および8kのメモリを備えたDECPDP-8/Eのプログラムを作成しました。これは1977年のことでした。

それ以来、私は慣れていないアーキテクチャのアセンブリを学ぶ方法についていくつかのトリックを発見しました。いくつかあります:8080/8085 / Z80、x86、68000、VAX、360、HC12、PowerPC、V850。スタンドアロンプ​​ログラムを作成することはめったにありません。通常、Cで作成されるシステムの他の部分とリンクされている関数です。

したがって、まず最初に、パラメーターの受け渡し、スタックレイアウト、スタックフレームの作成、パラメーターの位置、ローカル変数の位置、スタックフレームの破棄、戻り値、戻り値、およびスタックのクリーンアップを学習する必要があるソフトウェアの残りの部分とインターフェイスできる必要があります。 。これを行う最良の方法は、Cで別の関数を呼び出す関数を記述し、コンパイラーによって生成されたコードリストを調べることです。

アセンブリ言語自体を学ぶために、私はいくつかの簡単なコードを書き、コンパイラーが何を生成するかを見て、生のデバッガーでそれをシングルステップで実行します。命令セットのマニュアルを近くに置いているので、よくわからない命令を調べることができます。

(前述のスタック処理に加えて)知っておくとよいことは、コンパイラーが特定の高級言語構造を指定してマシンコードを生成する方法です。そのようなシーケンスの1つは、インデックス付きの配列/構造体がポインターに変換される方法です。もう1つは、ループの基本的なマシンコードシーケンスです。

では、「生のデバッガー」とは何ですか?私にとって、これは単純な開発パッケージの一部であり、ビジュアルデバッガーのようなハードウェアから私を保護しようとしないデバッガーです。その中で、ソースとアセンブリのデバッグを簡単に切り替えることができます。また、開発IDEの内部からすばやく開始します。それは3000の機能を持っていません、おそらく30であり、それらはあなたが99.9%の時間使用するものになるでしょう。開発パッケージは通常、インストーラーの一部であり、ライセンスの承認のために1回クリックし、デフォルトのセットアップを承認するために1回クリックし(誰かがあなたのためにその作業を考えて実行したときにそれが好きではありませんか?)、最後にインストールします。

x86-32(IA-32)用のお気に入りのシンプルな開発環境が1つあります。それは、OpenWatcomです。openwatcom.orgで見つけることができます。

私はx86-64(AMD64)にかなり慣れていませんが、追加のレジスタr8からr15などの追加のギミックがあり、メインレジスタが64ビットであるため、移行は簡単に見えます(x86-16からx86-32に移行する場合とよく似ています)。幅。私は最近、XP / 64、Vista / 64、および7/64の開発環境(おそらくサーバーOSでも機能します)に出くわしました。これはPelles C(pellesc.org)と呼ばれています。これは、スウェーデンの1人のPelle Oriniusによって作成および保守されており、私が一緒に過ごした数時間から、x86-64のお気に入りになる運命にあると言えます。私はVisualExpressパッケージを試しました(それらは非常に多くのジャンクをインストールします-後で何回アンインストールする必要があるか知っていますか?20以上)そしてまたIDE(Eclipseまたは何か他のもの)で動作するために1つの場所からgccを取得しようとしました)別から。

ここまで来て、新しいアーキテクチャに出くわしたら、生成されたリストを1〜2時間かけて見て、その後、他のアーキテクチャがどのように似ているかをほぼ知ることができます。インデックスとループの構成が奇妙に見える場合は、それらを生成しているソースコードと、おそらくコンパイラの最適化レベルを調べることができます。

一度コツをつかむと、近くのデスク、コーヒーマシン、会議、フォーラム、その他の多くの場所で、あなたを軽蔑するのを待っている人がいることに気付くでしょう。あなたは、あなたに不完全な引用を投げ、あなたが集会に興味を持っているので、情報に通じていない/無能なアドバイスをします。なぜ彼らがこれをするのか私にはわかりません。おそらく彼ら自身は失敗したアセンブリプログラマーであり、おそらく彼らはOO(C ++、C#、およびJava)しか知らず、アセンブラーが何であるかについての手がかりを持っていません。おそらく、彼らが「知っている」(または彼らの友人が知っている)「本当に良い」人は、フォーラムで何かを読んだり、会議で何かを聞いたりしたことがあるかもしれません。時間。ここstackoverflowにはたくさんあります。

于 2011-02-16T13:12:01.837 に答える
3

IDA プロを取得します。組み立て作業用のミツバチです。

個人的には、32 ビットと 64 ビットの違いはあまりわかりません。それはビットではなく、命令セットに関するものです。アセンブリについて話すときは、命令セットについて話します。おそらく彼らは、32 ビットの命令セットの方が学習に適していることをほのめかしているのでしょう。ただし、それがあなたの目標である場合は、Donald Knuths のアルゴリズムに関する本をお勧めします。7 ビットの命令セット アセンブリの観点からアルゴリズムを教えています :D

移植性の問題については、インライン アセンブリの代わりに、コンパイラの組み込み関数の使用方法を学ぶことをお勧めします。これは、組み込み以外の最適化に最適な最適化です。:D

于 2010-02-28T18:21:12.913 に答える
1

しかし、より低いレベルで何が起こっているかをよりよく理解したい

x86/x64 プロセッサ/システムの下位レベルで行われていることをすべて知りたい場合は、基本、つまり 286/386 リアル モード コードから始めることを強くお勧めします。たとえば、16 ビット コードでは、理解することが重要な概念であるメモリ セグメンテーションを使用する必要があります。今日の 32 ビットおよび 64 ビットのオペレーティング システムは、依然としてリアル モードで起動され、その後、関連するモードに切り替えます。

しかし、アプリケーションやアルゴリズムの開発に興味がある場合は、低レベルの OS のすべてを学びたくないかもしれません。代わりに、プラットフォームに応じて、x86/x64 コードからすぐに始めることができます。32 ビット コードは 64 ビット Windows でも実行されますが、その逆は実行されないことに注意してください。

于 2010-02-28T18:26:18.190 に答える
0

C (C++ や C# ではなく) のプログラミングを開始すると、レジスタ、スタック フレーム、データ処理など、「すべて自分で行う」ために必要なものの基本的な理解を得るのに役立ちます。私はコンピューター サイエンスの修士号を取得しましたが、私のお気に入りのトピックの 1 つはコンパイラーの構築 (yacc と lex です!) であり、これはすべての高水準言語を深く親密なレベルで理解するのに役立ちました。私は自分の言語を定義し、それを低レベルの構造にコンパイルする瞬間を今でも大切にしています。実際、仮想プロセッサ上で実行されるオブジェクト指向言語を設計しました。

つまり、アセンブラを学ぶ近道はありません。退屈な場合があります。でも大満足。

于 2019-06-23T13:31:28.320 に答える