
この記事は、現在の現実を考慮してアセンブラー言語に専念しています。 Javaとの利点と相違点が示され、コンパイラーの小さな比較が行われ、かなりの量の最高の主題文献が細心の注意を払って収集されます。
1.言語。 Javaとの利点と違い
アセンブラー(アセンブリー)-概念がコンピューターのアーキテクチャーを反映するプログラミング言語。 アセンブリ言語は、マシンコードを記述するシンボリック形式であり、その使用により、マシンプログラムの記述が簡単になります。 同じコンピューターに対して異なるアセンブリ言語を開発できます。 アルゴリズムの実装に関する多くの問題が開発者から隠されている高レベルの抽象化の言語とは異なり、アセンブラー言語はマイクロプロセッサー命令システムと密接に関連しています。 コマンドシステムがプログラミング言語と完全に一致する理想的なマイクロプロセッサーの場合、アセンブラーは言語のオペレーターごとに1つのマシンコードを生成します。 実際には、実際のマイクロプロセッサでは、単一の言語演算子を実装するために複数の機械命令が必要になる場合があります。
アセンブリ言語は、レジスターへのアクセスを提供し、アドレス指定方法と、プロセッサー命令に関する操作の説明を指定します。 アセンブリ言語には、より高度な抽象化のツールが含まれている場合があります。複数のマシン命令に対応する組み込みマクロおよび定義済みマクロ、オペランドのタイプに応じた自動コマンド選択、データ構造の記述方法。 アセンブラー言語の主な利点は、プログラマーが使用するコンピューターの基礎であるプロセッサーへの「近接性」であり、主な欠点は、ほとんどのユーザーが認識しにくい典型的な操作の分割が小さすぎることです。 ただし、アセンブリ言語は、他のすべての言語よりもコンピューターの機能をはるかに反映しています。
現在、ドライバーとオペレーティングシステムはCで記述されていますが、Cはその利点のすべてについて、さまざまな鉄の微妙さとニュアンスをプログラマーから隠す高レベルの抽象化言語であり、アセンブラーはこれらすべての微妙さとニュアンスを直接反映する低レベルの抽象化言語です。
アセンブラーを正常に使用するには、3つのことが同時に必要です。
- 使用されるアセンブラートランスレータの構文の知識(たとえば、MASM、FASM、およびGASの構文が異なる)、アセンブラーディレクティブの割り当て(プログラムのソースコードの変換中にトランスレーターによって処理されるステートメント);
- プログラムの実行中にプロセッサによって実行される機械命令の理解。
- オペレーティングシステムによって提供されるサービスを操作する機能-この場合、これはWin32 APIの機能に関する知識を意味します。 高水準言語を使用する場合、プログラマーはシステムAPIに直接アクセスしないことが非常に多くあります。 言語ライブラリは特定のシステムに依存するプログラマの詳細から隠されているため、彼はその存在さえ疑わないかもしれません。 たとえば、Linux、Windows、およびC / C ++プログラムの他のシステムでは、printf()関数またはcoutストリームを使用してコンソールに行を印刷できます。つまり、これらのツールを使用するプログラマーには違いはありません。システムのAPIが非常に異なるため、これらの機能の実装はシステムごとに異なりますが、プログラムがどのシステム用に作成されるか。 しかし、人がアセンブラで書く場合、システムと「通信」する方法を考え出したprintf()のような既製の機能はもはやなく、自分でそれをしなければなりません。
その結果、単純なアセンブラー・プログラムを作成する場合でも非常に多くの予備知識が必要です。ここでは、「エントリーのしきい値」は高級言語よりもはるかに高くなっています。
Optimalは、可能な限り迅速に正しく動作し、おそらく少量のメモリを消費するプログラムと見なすことができます。 さらに、読みやすく理解しやすいです。 変更は簡単です。 その作成にはほとんど時間と低コストが必要です。 理想的には、アセンブラー言語には、これらの品質を可能な限り満たすプログラムを取得できるような特性の組み合わせが必要です。
プログラムまたはプログラムのフラグメントは、それらが非常に重要である場合にアセンブリ言語で書かれています。
- 使用されるメモリの量(ダウンローダー、組み込みソフトウェア、リソースが限られているマイクロコントローラーとプロセッサーのプログラム、ウイルス、ソフトウェア保護など)。
- 速度(アセンブリ言語で記述されたプログラムは、抽象度の高いプログラミング言語で記述されたアナログプログラムよりもはるかに高速で実行されます。この場合、速度は特定のプロセッサモデルの動作、プロセッサの実際のパイプライン、キャッシュサイズ、および作業の複雑さの理解に依存しますオペレーティングシステム:その結果、プログラムの動作は速くなりますが、移植性と汎用性が失われます。
さらに、アセンブリ言語の知識は、コンピューターのアーキテクチャーとそのハードウェアの操作の理解を促進します。これは、 高レベルの抽象化言語 (YaVU)の知識では得られないものです。 現在、ほとんどのプログラマーは、必要なすべての設計要素と制御要素が既製のビジュアルコンポーネントを使用して作成されると、ラピッドアプリケーション開発環境でプログラムを開発します。 これにより、プログラミングプロセスが大幅に簡素化されます。 ただし、多くの場合、個々のプログラムモジュールがアセンブリ言語(アセンブラーインサート)で記述されている場合にのみ、個々のプログラムモジュールの最も強力で効率的な機能が可能になる状況に遭遇します。 特に、繰り返し計算の繰り返し手順の実行に関連するプログラムでは、数学的計算のサイクルであろうとグラフィックイメージの出力であろうと、最も時間のかかる操作をアセンブリ言語でプログラムされたサブモジュールにグループ化することをお勧めします。 抽象度の高い最新のプログラミング言語のすべてのパッケージでこれが可能になり、その結果、プログラムの速度が常に大幅に向上します。
高レベルの抽象化のプログラミング言語は、コンピューターユーザーの使い慣れた記録形式、特に数学表現にプログラムを書く方法を可能な限り近似し、個々のコンピューターの特定の技術的特徴を考慮しないことを目的として開発されました。 アセンブリ言語は、プロセッサの仕様を考慮して開発されているため、プログラムをアセンブリ言語で正しく記述するには、一般に、使用するコンピューターのプロセッサアーキテクチャを知る必要があります。 ただし、PC互換のパーソナルコンピューターとそのための既製のソフトウェアパッケージの主な流通を念頭に置いて考えると、そのような開発者は専門的で普遍的なソフトウェア会社を引き受けるので、考えてはいけません。
2.コンパイラについて
どのアセンブラーが優れていますか?
x86-x64プロセッサには、12種類以上の異なるアセンブラコンパイラがあります。 それらは、関数と構文のさまざまなセットが異なります。 一部のコンパイラは初心者向けであり、一部のコンパイラは経験豊富なプログラマ向けです。 十分に文書化されているコンパイラもあれば、まったく文書化されていないコンパイラもあります。 いくつかのコンパイラ用に多くのプログラミング例が開発されています。 一部のアセンブラーについては、詳細な構文を記述した教科書や本が書かれていますが、他には何もありません。 どのアセンブラーが優れていますか?
x86-x64のアセンブラーの多くの方言とそれらを研究する限られた時間を考えると、次のコンパイラーの簡単な概要に制限されます:MASM、TASM、NASM、FASM、GoASM、Gas、RosAsm、HLA。
どのオペレーティングシステムを使用しますか?
これは最初に答えなければならない質問です。 最も用途の広いアセンブラは、使用する予定のオペレーティングシステムで動作するように設計されていない場合、役に立ちません。
窓 | ドス | Linux | BSD | QNX | MacOS実行中
Intel / AMDプロセッサー | |
---|---|---|---|---|---|---|
けいれん | x | x | x | x | ||
ガス | x | x | x | x | x | x |
ゴアス | x | |||||
フラ | x | x | ||||
MASM | x | x | ||||
NASM | x | x | x | x | x | x |
ロスム | x | |||||
タスム | x | x |
16ビットのサポート
アセンブラがDOSをサポートしている場合、16ビットコマンドをサポートしています。 すべてのアセンブラは、16ビットオペランドを使用するコードを記述する機能を提供します。 16ビットのサポートとは、16ビットのセグメント化されたメモリモデルで実行されるコードを作成する機能を意味します(最新のオペレーティングシステムで使用される32ビットのフラットメモリモデルと比較して)。
64ビットのサポート
Borlandがゼロに冷却し、32ビットプログラムさえも完全にサポートしていないTASMを除き、他のすべての方言は64ビットアプリケーションの開発をサポートします。
プログラムの移植性
明らかに、他のプロセッサーで実行されるコードをx86-x64アセンブラーで作成するつもりはありません。 ただし、単一のプロセッサ上でも、移植性の問題が発生する場合があります。 たとえば、異なるオペレーティングシステムでアセンブラプログラムをコンパイルして使用する場合。 NASMおよびFASMは、サポートするオペレーティングシステムで使用できます。
アセンブラーでアプリケーションを作成し、ソースコードを「再コンパイル」してこのアプリケーションを1つのOSから別のOSに移植するつもりですか? この機能はHLA方言でサポートされています。 最小限の労力でWindowsおよびLinuxアプリケーションをアセンブリ言語で構築できると期待していますか? ただし、1つのオペレーティングシステムを使用しており、他のOSで動作する予定がない場合は、この問題は関係ありません。
高水準言語構成のサポート
一部のアセンブラは、言語の高レベルの制御構造(IF、WHILE、FORなど)を提供する高度な構文を提供します。 このような構造は、アセンブリトレーニングを促進し、より読みやすいコードを作成するのに役立ちます。 一部のアセンブラには、機能が制限された組み込みの「高レベル構成体」があります。 その他は、高レベルのマクロレベルの構造を提供します。
マシンコマンドエンコーディングのレベルで作業する場合、アセンブラが制御構造や高レベルのデータ型を使用することを強制することはありません。 高レベルの構成体は、便利だと思う場合に使用できる基本的な機械語の拡張です。
ドキュメントの品質
アセンブラの使いやすさは、ドキュメントの品質に直接関係しています。 アセンブラ方言の作成に費やされる作業量を考慮すると、コンパイラの作成者は実際にはこの方言のドキュメントを作成することを気にしません。 著者は、言語を拡張して、これらの拡張機能を文書化することを忘れています。
次の表に、製品に付属のアセンブラリファレンスガイドの品質を示します。
ドキュメント | コメント | |
---|---|---|
けいれん | いいね | 著者は、自由時間のほとんどを革新的なFASMGの開発に費やしています。 それでも、著者はマニュアルを随時更新するFASMのサポートを提供し、独自のフォーラムで新機能について説明しています。 ドキュメントは非常に良いと考えることができます。 ドキュメントのWebページ 。
|
ガス
| 悪い
| 不十分な文書化と文書化ではなく、「一般的な見解」があります。 gasは、さまざまなプロセッサ向けのコードを簡単に記述できるように設計されたアセンブラです。 存在するドキュメントでは、基本的に擬似コードとアセンブラディレクティブについて説明しています。 「intel_syntax」操作モードでは、ドキュメントは実質的にありません。 AT&T構文を使用する本:Jonathon Bartlettによる「ゼロからのプログラミング」およびRichard Blumによる「Professional Assembly Language」、Konstantin Boldyshev asmutils-Linux Assembly
|
ゴアス
| 弱い
| 構文のほとんどはマニュアルに記載されており、経験豊富なユーザーは探しているものを見つけるでしょう。 多くのマニュアルもWebサイト( http://www.godevtool.com/ )で入手できます。 いくつかのGoAsmチュートリアル:
|
フラ
| スケーリング
| HLAには500ページのリファレンスガイドがあります。 このサイトには、HLAに関する多数の記事とドキュメントが含まれています。
|
MASM
| いいね
| MicrosoftはMASMについてかなりの量のドキュメントを作成しましたが、この方言用に多数のディレクトリが作成されています。
|
NASM
| いいね
| NASMの作者は、この方言用のソフトウェアをさらに作成しますが、マニュアルはあとで作成します。 NASMはかなり前から存在しているため、数人の著者が、Jeff DuntemannによるNASMのマニュアル「Assembly Language Step-by-Step:Programming with Linux」、Jonathan Leto、「Ause Useful Program With NASM 」をロシア語で書いています( A.V. Stolyarovのウェブサイト )。
|
ロスム
| 弱い
| あまりおもしろくない「オンラインチュートリアル」。
|
タスム
| いいね
| ボーランドはかつて優れたリファレンスガイドを作成していました。TASMリファレンスガイドは、ボーランドに所属していない熱心な著者によって書かれたためです。 しかし、ボーランドはもはやTASMをサポートしていないため、TASMのドキュメントのほとんどは印刷されておらず、見つけるのがますます難しくなっています。
|
教科書とトレーニング資料
アセンブラ自体のドキュメントは、もちろん非常に重要です。 アセンブリ言語(またはこのアセンブラの追加機能)を学習している初心者やその他の人々にとってさらに大きな関心を集めているのは、その言語のリファレンスマニュアル以外のドキュメントを入手できることです。 ほとんどの人は、機械語命令の構文を提供するだけでなく、実際の問題を解決するためにこれらの命令を組み合わせる方法を読者に説明するだけでなく、アセンブラーでのプログラミング方法を説明するチュートリアルが必要です。
MASMは、この方言でプログラムする方法を説明している膨大な本の中のリーダーです。 アセンブラーを教えるためにアセンブラーとしてMASMを使用する本は何十もあります。
ほとんどのMASM / TASMアセンブリの本は、MS-DOSプログラミングを教え続けています。 WindowsやLinuxでのプログラミングを教える教科書が徐々に登場していますが。
コメント | |
---|---|
けいれん | FASMプログラミングを説明するいくつかのチュートリアル:
|
ガス
| AT&T構文を使用したチュートリアル
Linux上のCプログラマ向けアセンブラチュートリアル |
フラ
| 32ビット版の「The Art of Assembly Language Programming」(電子形式と印刷形式の両方で利用可能)、WindowsまたはLinuxプログラミング
|
MASM
| DOSのプログラミング教育に関する多数の書籍。 Win32 / 64 Pirogov、Yurov、Zubkov、Flenovのプログラミングに関する本はあまりありません
|
NASM
| DOS、Linux、Windowsでのプログラミングに関する多くの本。 Jeff Duntemanの本であるAssembly Language Step-by-Step:Programming with Linuxでは、LinuxとDOSにNASMを使用しています。 Paul Carterのチュートリアルでは、NASM(DOS、Linux)を使用しています。
|
タスム
| MASMと同様に、多数のDOSベースの本がTASM用に作成されています。 しかし、ボーランドはこの製品をサポートしなくなったため、TASMの使用に関する書籍の執筆を中止しました。 Tom Swanは、Windowsプログラミングに関するいくつかの章を含むTASMチュートリアルを作成しました。
|
3.文献とウェブリソース
初心者
- IBM PCおよびプログラミング用のAbel P. Assembler言語。 -M .:高等学校、1992年-447 p。
- Bradley D. IBMのパーソナルコンピューター用アセンブリ言語でのプログラミング-M .: Radio and Communications、1988.-448 p。
- ガリセフG.V. アセンブラーIBM PC。 自習:-M .:ウィリアムズ出版社、2004年。-304 pp。、Ill。
- Tao L.マイクロプロセッサのプログラミング8088.-M。:Mir、1988.-357 p。
- Zhukov A.V.、Avdyukhin A.A. アセンブラー。 -サンクトペテルブルク:BHV-Petersburg、2003 .-- 448 p .: Ill。
- Zubkov S.V.、DOS、Windows、およびUNIX用アセンブラー。 -M .: DMK Press、2000 .-- 608 p .: Ill。 (「プログラマー向け」シリーズ)。
- Irwin K. Intelプロセッサー向けアセンブリー言語、第4版:transl。 英語から -M .:ウィリアムズ出版社、2005年。-912 p .:病気。 -パラル。 シジュウカラ。 英語(オリジナルの最新の第7版も参照)
- ノートンP.、Souhe D. IBM PCのアセンブリ言語。– M。:コンピューター、1992.– 352 p。
- ピルシチコフV.N. アセンブリ言語IBM PCでのプログラミング。– M .: DIALOGUE – MEPhI、1994–2014 288 p。
- スクリャロフI.S. 7日間でアセンブラーを学習しますwww.sklyaroff.ru
高度な
- カスペルスキーK.ハッキングの基礎。 分解の芸術。 -M .: SOLON-Press、2004.448秒 -(シリーズ "Digger")
- Kaspersky K.ソースなしでプログラムをデバッグするためのテクニック。 -サンクトペテルブルク:BHV-Petersburg、2005 .-- 832 p .: Ill。
- カスペルスキーK.コンピューターウイルスの内部と外部。 -サンクトペテルブルク:ピーター、2006 .-- 527 p .: Ill。
- カスペルスキーK.コンピューターウイルス研究者のメモ。 -サンクトペテルブルク:ピーター、2006 .-- 316 p .: Ill。
- Knut D. The Art of Programming、Volume 3. Sorting and Search、2nd ed。:Per。 英語から -M .: Williams Publishing House、2003。-832 p .:病気。 -パラル。 シジュウカラ。 英語
- コリスニチェンコD.N. Windowsのルートキット。 「見えない上限」をプログラミングする理論と実践。システムからデータ、プロセス、ネットワーク接続を隠すことができます。 -サンクトペテルブルク:科学技術2006年。-320 p .:病気。
- リアミンL.V. マクロアセンブラーMASM。– M。:ラジオと通信、1994.– 320 pp。、Ill。
- Intel Pentiumプロセッサ用のMagda J. Assembler。 -サンクトペテルブルク:ピーター、2006年-410 p .: Ill。
- メイコG.V. IBM PC用アセンブラー。– M .: Business Inform、Sirin、1997。– 212 p。
- Warren G.プログラマ向けアルゴリズムトリック、第2版:Per。 英語から -M .:ウィリアムズ出版社、2004。-512 p .:病気。 -パラル。 シジュウカラ。 英語
- スクリャロフI.S. 情報を保護およびハッキングする技術。 -サンクトペテルブルク:BHV-Petersburg、2004 .-- 288 p .: Ill。
- Weatherly C.プログラマー向けの研究:あたり 英語から -M。:ミール、1982年-288 p。、Ill。
- フロロフ兄弟の電子図書館www.frolov-lib.ru
- チェカトフA.A. ソフトウェア開発でのTurbo Assemblerの使用-Kiev:Dialectics、1995.-288 p。
- Yurov V. Assembler:特別な参考書-サンクトペテルブルク:Peter、2001.-496 pp。、Ill。
- ユロフV.アセンブラー。 ワークショップ 第2版 -サンクトペテルブルク:Peter、2006 .-- 399 p。:ill。
- ユロフV.アセンブラー。 高校向けの教科書。 第2版 -サンクトペテルブルク:ピーター、2007年-637 p .: Ill。
- Pirogov V. Assemblerトレーニングコース。 2001ノリージュ
- Pirogov V. ASSEMBLERトレーニングコース2003 Nolidzh-BHV
- Windows用のPirogov V. Assembler
初版-M .: S.モルガチョフの出版社、2002
第2版-サンクトペテルブルク:: BHV-Petersburg、2003-684 pp。、Ill。
第3版-サンクトペテルブルグ。 BHV-Petersburg、2005-864 p .:病気。
第4版-サンクトペテルブルク。 BHV-Petersburg、2012-896 pp。、Ill。 - Pirogov V.アセンブラーの例。 -SPb。:。 BHV-Petersburg、2012-416 pp。、Ill。
- Pirogov V. ASSEMBLERおよび分解。 -SPb。:。 BHV-Petersburg、2006年-464ページ:Ill。
- Pirogov V.は、本「64ビットアセンブリ言語プログラミング(Windows、Unix)」に取り組んでいます。 この本は、64ビットWindowsおよびUnixでのfasmプログラミングについて説明しています
- Yurov V.、Khoroshenko S. Assembler:トレーニングコース-サンクトペテルブルク:Peter、1999.-672 p。
- Yu-Zheng Liu、Gibson G. 8086/8088ファミリのマイクロプロセッサ。 マイコンシステムのアーキテクチャ、プログラミング、設計-M .:ラジオと通信、1987。– 512 p。
- Agner Fog:ソフトウェア最適化リソース(アセンブリ/ C ++)1996-2017。Web ページ
- Intel®64およびIA-32アーキテクチャ最適化リファレンスマニュアル
- Intel®64およびIA-32アーキテクチャソフトウェア開発者向けマニュアル第1巻:基本アーキテクチャ
- Intel®64およびIA-32アーキテクチャソフトウェア開発者向けマニュアル第2巻:命令セットリファレンス、AM
- Intel®64およびIA-32アーキテクチャソフトウェア開発者向けマニュアル第2巻:命令セットリファレンス、ニュージーランド
- Intel®64およびIA-32アーキテクチャソフトウェア開発者向けマニュアル第3巻:システムプログラミングガイド、パート1
- Intel®64およびIA-32アーキテクチャソフトウェア開発者向けマニュアル第3巻:システムプログラミングガイド、パート2
- Leiterman JC 32 / 64-BIT 80x86アセンブリ言語アーキテクチャ。 ©2005、Wordware Publishing、Inc(568 pages)2320 Los Rios Boulevard Plano、Texas 75074
- TurboAssembler®バージョン3.2ユーザーガイドBorland International。 Inc 1800 Green Hills Road PO BOX 660001、Scotts Valley、CA 95067-0001
- wasm.inの記事
- sasm.narod.ruの記事
- MASM32 Webサイトおよびフォーラム
- FASMウェブサイトおよびフォーラム
- NASMウェブサイト
4.練習
そのため、アセンブラーとは何か、それはどのアセンブラーと一緒に使用されるかを既に知っています。 数本/ 3冊の本とWebマニュアルを用意して、おそらくコンパイラを決めました...残念ながら、プログラミングのレッスンはこの記事の範囲を超えていますが、MASM / FASMで選択した人には次のレイアウトを使用できます:
- MASM64シンプルウィンドウmasm64SimpleWindow.asm
- FASM64シンプルウィンドウfasm64SimpleWindow.asm
問題は残り、どのエディターでコードを書くのか? 誰かがメモ帳に書いてコマンドラインでコンパイルし、より精通した準備スクリプト-プロセスを簡素化しますが、他の人は特別な開発環境を使用します。 はい、低レベルプログラミングの分野にIDEがあります。そのレビューもこの記事の範囲外です。 ただし、この機会を利用して、アセンブラー-ASM Visualでプログラミングするための独自の環境を試してみることをお勧めします。 基本的な機能に加えて、リファクタリングツール、コードメトリックス、全体としてより直感的なインターフェイス、および独自のプロジェクトタイプが存在する点で、アナログとは異なります。
ネタバレ
そのため、環境が完全に無料というわけではありません。 Proライセンスを無料で購入することで、プロジェクトをサポートできます。 コードを使用: HABR_zzdBG1qadG (スライダーを位置0に無料で設定した場合)。
2018年のあなた、友人、重要な成果と新しい知識を願っています!
よろしく
ミハイル・スモレンツェフ・ミクルイルク (イルクーツク州交通大学)、
Alexey Gritsenko expressrus (ドン州立工科大学)。
Ps1 :親愛なる、ハブラハブル! アセンブラーの強調表示(Intel構文)をエディターに追加します。これは、今後の記事で役立ちます!
Ps2 :すぐに、アセンブラーとコンピューターアーキテクチャの知識のためのテスト(質問-回答オプション)を備えたポータルを起動します。 テストは難易度別に構成されます。 アセンブラーを教えているか、この分野で十分な知識がある場合は、express-rus @ yandex.ruにご連絡ください。テストをシステムに送信することで参加できます。