web-dev-qa-db-ja.com

アセンブリを学習するには-32ビットと64ビットのどちらから始めるべきですか?

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

私はアセンブリ関連の質問が以前に聞かれたことに気づきましたが、私は自分の状況に特有の方向性を探しています。

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


編集:

アセンブリを開始するのに役立ったリンクをいくつか紹介します。始めたばかりの人は役に立つと思うかもしれません。私はアセンブリの旅を続ける間、このリストを更新し続けます:)

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

52
Cam

人々が_32-bit_および_64-bit_アセンブリを参照するとき、彼らは使用する命令セットについて話している-インテルでは_Ia32_および_x64_と呼ばれることもあるあなたが質問していると思います。 64ビットの場合はさらに多くのことが行われるため、32ビットから始めるのがおそらく良いでしょう。 32ビットアセンブラでプログラムを32ビットバイナリにアセンブルしていることを確認する必要があります。 Windowsはそれを実行する方法をまだ知っています。

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

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

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

34
Carl Norum

1977年に、OS/8と8kのメモリを搭載したDEC PDP-8/Eのプログラムを作成する前に、基本操作(および、または、xor、not)と8進数の数学を最初に学習して、長い道のりでアセンブリを書き始めました。これは1977年です。

それ以来、私は馴染みのないアーキテクチャ向けのアセンブリを学習する方法に関するいくつかのトリックを発見しました。 8080/8085/Z80、x86、68000、VAX、360、HC12、PowerPC、およびV850のように、いくつかあります。スタンドアローンのプログラムを書くことはめったになく、通常はCで書かれたシステムの他の部分とリンクしている機能です。

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

アセンブリ言語自体を学ぶために、コンパイラーが生成するものを見て、生のデバッガーでそれをシングルステップ実行するいくつかの簡単なコードを書きます。取扱説明書を近くに持っているので、よくわからない説明書を調べることができます。

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

それでは、「生デバッガ」とは何ですか?私にとっては、単純な開発パッケージの一部であり、Visualデバッガーなどのハードウェアから私を保護しようとしないデバッガーです。その中で、ソースデバッグとアセンブリデバッグを簡単に切り替えることができます。また、開発IDE内からすばやく起動します。 3,000個の機能はありませんが、30個の可能性が高く、そのうち99.9%を使用します。開発パッケージは通常、インストーラーの一部であり、ライセンスの承認のために1回クリックし、既定のセットアップの承認のために1回クリックします(誰かがその作業を考えて行ったときに気に入らないのですか?) 。

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

私はx86-64(AMD64)を初めて使用しますが、移行は簡単です(x86-16からx86-32に移行するときのように)、追加のレジスタr8からr15などの追加のギミックとメインレジスタは64ビットですワイド。私は最近、XP/64、Vista/64、および7/64の開発環境(おそらくサーバーOS:sでも動作します)に遭遇しました。これはPelles C(pellesc.org)と呼ばれます。これはスウェーデンのPelle Oriniusによって書かれ、維持されています。数時間からx86-64で私のお気に入りになることを運命づけられていると言えます。私はVisual Expressパッケージを試してみました(それらは非常に多くのジャンクをインストールします-その後、アンインストールを何回行う必要があるか知っていますか?20以上)、また1つの場所からgccを取得してIDE(Eclipseまたは他の何か)別から。

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

一度慣れると、近くのデスク、コーヒーメーカー、会議、フォーラム、その他の多くの場所で、あなたを軽cornするのを待っている人がいることに気付くでしょう。あなたは、あなたに不完全な引用符を投げて、アセンブリに興味があるので、知識のない/無能なアドバイスを与えます。なぜ彼らがこれをするのか分かりません。おそらく彼ら自身は失敗したアセンブリプログラマであり、おそらくOO(C++、C#、およびJava)のみを知っており、アセンブラが何であるかについての手掛かりを持っていないだけかもしれません。 (または彼らの友人が知っている)「本当に良い」人は、フォーラムで何かを読んだり、会議で何かを聞いたことがあるため、アセンブリが完全に時間の無駄である理由について絶対的な真実を伝えることができます。ここでstackoverflowで。

22
Olof Forshell

Get IDA pro。 これは、アセンブリを操作するためのミツバチの膝です。

個人的には、32ビットと64ビットの違いはあまりありません。ビットについてではなく、命令セットについてです。アセンブリについて話すときは、命令セットについて話します。おそらく、彼らは32ビットの命令セットを学ぶ方が良いことを暗示しているのでしょう。しかし、それがあなたの目標であれば、ドナルド・クヌースのアルゴリズムに関する本をお勧めします-彼らは7ビットの命令セットの観点からアルゴリズムを教えていますAssembly:D

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

3
Hassan Syed

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

そのため、アセンブラーを学ぶショートカットはありません。面倒なことがあります。しかし、非常に満足です。

0
theking2

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

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

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

0
AndiDog