この教科書は、アセンブリ言語プログラミングをやさしく紹介します。この紹介が「優しい」のは、読者がすでに C または C++ コーディングに慣れていることを前提としているためです。この想定された知識を使用して、低レベルの ISA (命令セット アーキテクチャ) に向けて後方へ橋渡しします。
非常に鋭い指摘をいただきました。
アセンブリ言語は怖いものではありません。前述したように、すでに C (または C++ などの C から派生した言語) に精通している場合は、この本はすでに知っていることから始めます。
後の章では、ARM V8 ISA の隅々までさらに深く掘り下げており、64 ビット ARM プロセッサの豊富な命令セットをマスターしたい人に適しています。
はい、絶対に。
アセンブリ言語プログラミングは、基礎となるハードウェア アーキテクチャに非常に密接に依存しています。ホストのオペレーティング環境は、アセンブリ言語プログラムの構築方法を決定する上で大きな役割を果たします。 「呼び出し規約」とは、関数の呼び出し方法とパラメーターの受け渡し方法を指します。
当初、この本は ARM LINUX の規則のみを説明しました。しかし、時間の経過とともに、MacOS または LINUX で使用するコードをより簡単に作成できるマクロ スイートを開発しました。
このリンクから、それらの最新コピーとドキュメントにアクセスできます。プログラミングを少し簡単にするマクロも含まれています。
この章では、Apple Silicon アセンブリ言語プログラミングに関する追加情報を提供します。
OS システムコールを行うのではなく、C ランタイムを直接利用していることがわかります。したがって、たとえば、 write()
を呼び出したい場合は、アセンブリ言語からwrite
呼び出します。
このバージョンのシステム コールwrite
システム コール実行の下位レベルの詳細を処理する C ランタイム (CRT) に組み込まれたラッパー関数です。これらのラッパー関数内で実際に何が起こるかについては、こちらを参照してください。
CRT ラッパーを使用する利点は、CRT ラッパーを使用することでマスクされるディストリビューションとアーキテクチャの間に違いがあることです。したがって、システムコールを直接行う方法ではなくラッパーを使用すると、コードの移植性が高まります。
ARM の設計は賞賛に値しますが、ARM の知的財産の命名規則はひどいものです。本書では、AARCH64 と ARM V8 は 64 ビット ARM 命令セット アーキテクチャ (ISA) の同義語として扱われます。
ARM サイトには非常に多くのバージョンがあり、同じものに非常に多くの名前があり、一般的に非常に多くのドキュメントがあるため、ARM サイトでドキュメントを見つけるのは非常に困難です。それは本当に腹立たしいことかもしれません。
本文内では、必要に応じて関連リンクを提供します。
ここに、メイン命令セットのページへのリンクがあります。
アセンブリ言語開発用のツールを入手するのは非常に簡単です。おそらくすでにそれらを持っているでしょう。 Linux ターミナルからapt
使用して、次のようにします。
sudo apt update
sudo apt install build-essential gdb
Macintosh の場合は次のように入力します。
xcode-select --install
端末にアクセスし、指示に従ってください。 gdb
lldb
に置き換えられていますが、違いは泣けるほどであることに注意してください。
次に、お気に入りのエディターが必要になります。私たち自身も、簡単な編集にはvi
使用し、重い作業には Visual Studio Code を使用しています。
C の「コンパイラー」であるgcc
使用します。 g++
も使用できます。 Mac では、 clang
も使用できます。
アセンブリ言語を「コンパイル」するために「コンパイラ」を使用することにどのような意味があるのでしょうか?
これに答えるには、「コンパイラー」という言葉はビルド シーケンスの 1 つのステップのみを指すことを理解する必要があります。私たちが「コンパイラー」として話しているものは、実際には以下を含む包括的なものです。
#include
などの#
コマンドで動作するプリプロセッサ。これらのコマンドは C または C++ の一部ではありません。むしろ、それらはプリプロセッサへのコマンドです。
アセンブリ言語ファイルが.S
(大文字の S) で終わる場合、 gcc
C プリプロセッサを呼び出すことに注意してください。ファイルが小文字の s またはその他のファイル拡張子で終わる場合、システムに応じて C プリプロセッサが呼び出される場合と呼び出されない場合があります。
実際のコンパイラは、C や C++ などの高級言語をアセンブリ言語に変換するのが仕事です。
アセンブラ。アセンブリ言語を実行準備が整っていないマシンコードに変換します。
最後に、リンカーは、潜在的に多くの中間マシン コード ファイル (オブジェクト ファイルと呼ばれる)、潜在的に多くのライブラリ ファイル (Windows では静的にリンクされた .dll、Linux では .a ファイル) を結合します。リンカーは、このチェーンの最後のステップです。
このプロセスを説明するビデオは次のとおりです。
gcc と g++ はアンブレラなので、上記の手順を自動化し、CRT と自動的にリンクするため、直接使用します。
main()
C ファイル (main.c) に実装し、自分で作成したアセンブリ言語ファイル (asm.S) を利用したいとします。これはいくつかの方法で実行できます。
gcc main.c asm.S
最小限のビルドに必要なのはこれだけです。結果のプログラムはa.out
に書き込まれます。生成された中間ファイルはすべて削除されます。
gcc -c main.c
gcc -c asm.S
gcc main.o asm.o
この方法で使用すると、 .o
ファイルがディスク上に残ります。前の方法を使用すると、 .o
ファイルは表示されずに削除されます。
main()
がアセンブリ言語で実装され、 main.s
自己完結型であると仮定すると、次のようになります。
gcc main.S
多くの場合、デバッガgdb
またはlldb
を有効にすることが必要になります。これを実行します:
gcc -g main.S
-g
コマンド ライン オプションを指定しないと、デバッガが正しく動作しない可能性があります。
繰り返しになりますが、 gcc
に C プリプロセッサを介してコードを実行させたい場合 ( #include
処理する場合など)、アセンブリ言語ソース コード ファイルの名前に大文字の S を付けます。つまり、Linux では次のようになります。
gcc main.s
C プリプロセッサは経由しませんが、
gcc main.S
意思。
「コンパイラー」が傘であることを強調すると、gcc を使用してプログラムを「コンパイル」すると、ARM 上で実行されている Ubuntu で次のコードが呼び出されます。
/usr/bin/cpp
/usr/lib/gcc/aarch64-linux-gnu/11/cc1
/usr/bin/as
/usr/lib/gcc/aarch64-linux-gnu/11/collect2 which is...
/usr/bin/ld
cpp
は C プリプロセッサです。他の言語 (C++ など) でも使用できる一般的なツールです。
cc1
実際のコンパイラです。
アセンブラas
です。
ld
はリンカーです。
この本では、デフォルトで傘コマンドを使用する理由がわかります。
私たちは、C および C++ からアセンブリ言語へのいわゆる「ブリッジ」を提供することから始めます。私たちはあなたがすでに持っている知識を使って新しい知識を学びます。それはとても素晴らしいことです。
章 | マークダウン | |
---|---|---|
0 | キックスタート | リンク |
1 | こんにちは世界 | リンク |
2 | If ステートメント | リンク |
3 | ループ | |
3a | While ループ | リンク |
3b | For ループ | リンク |
3c | 継続の実装 | リンク |
3D | ブレークの実施 | リンク |
4 | 間奏曲 | |
4a | レジスター | リンク |
4b | ロードして保存する | リンク |
4c | ldr 詳細 | リンク |
4D | レジスタサイズ | リンク |
4e | 16進数 | リンク |
5 | switch | リンク |
6 | 機能 | |
6a | 発信と折り返し | リンク |
6b | パラメータの受け渡し | リンク |
6c | いくつかの一般的な C ランタイム関数の呼び出しの例 | リンク |
7 | FizzBuzz - 完全なプログラム | リンク |
8 | 構造体 | |
8a | 位置合わせ | リンク |
8b | 定義する | リンク |
8c | 使用する | リンク |
8d | これは何ですか" | リンク |
9 | const | リンク |
浮動小数点演算は、独自の命令と独自のレジスタのセットを使用します。したがって、浮動小数点演算については、独自のセクションで説明します。
章 | マークダウン | |
---|---|---|
0 | 章の概要 | リンク |
1 | 浮動小数点数とは何ですか? | リンク |
2 | レジスター | リンク |
3 | 切り捨てと丸め | リンク |
4 | リテラル | リンク |
5 | fmov | リンク |
6 | 半精度浮動小数点数 | リンク |
7 | NEON SIMD はまだ書き込まれていません | リンク |
アセンブリ言語に関する本は、ちょっとしたバッシングなしには何になるでしょうか?
章 | マークダウン | |
---|---|---|
1 | ビットフィールド | |
1a | ビットフィールドなし | リンク |
1b | ビットフィールドあり | リンク |
1c | 新たに記述された指示のレビュー | リンク |
2 | エンディアンネス | リンク |
このセクションでは、デバッグに関する「世界的に有名な講義」を含むさまざまな資料を紹介します。この講義はいくつかの大学に招待されています。 C、C++、アセンブリ言語などの言語を扱う読者を対象としていますが、そこに含まれるレッスンの一部はすべての言語に適用できます。
章 | マークダウン | |
---|---|---|
1 | アップルシリコン | リンク |
2 | Apple / Linux の融合 | リンク |
3 | 可変個引数関数 | リンク |
4 | 内部: システムコール | リンク |
5 | C 関数の文字列リテラルの長さの決定 | リンク |
6 | Python からアセンブリ言語を呼び出す | リンク |
7 | アトミックオペレーション | リンク |
8 | ジャンプ台 | リンク |
9 | 引数 | ASMコード |
10 | スピンロック | リンク |
- | デバッグ講座 | PPTX |
すぐ上に示したように、マクロ スイートはここにあります。
ここでは、あなたの熟練度の向上に挑戦できるプロジェクトの仕様をいくつか紹介します。ここでは、アルファベット順に非常に簡単に説明します。
おそらく、これらに取り組む前に、まず完全に説明されている FIZZBUZZ プログラムをチェックしてください。
次に、これを最初のプロジェクトとして試してください。いくつかの空白行とコメントを含めると 35 行になります。
DIRENT プロジェクトは、複雑なstruct
アセンブリ言語で使用する方法を示します。
PI プロジェクトは浮動小数点命令を示します。プログラムは「ターゲットに向かってダーツを投げ」、「投げられた」ダーツの総数に対して「ターゲットに当たった」ダーツの数を追跡することで PI の近似値を計算します。
SINE プロジェクトは浮動小数点演算と関数に重点を置いています。
SNOW プロジェクトは、1970 年代の技術を使用して、単純なパーティクル システムをアニメーション化します。このプロジェクトは、複雑な問題をより単純な部分に分解する合理的な設計プロセスを示します。
ウォーキーは、ポインターの参照解除を伴うループを示すかわいい小さなアニメーションを表示します。
ペリー・キボロウィッツのコンピューターサイエンスにおけるキャリアは 50 年弱に及びます。彼は、主にハードウェア、画像処理、視覚効果 (映画やテレビ向け) に関連する会社を 5 つ以上立ち上げました。ペリーは、『バビロン 5』のパイロット エピソードであるザ・ギャザリングでの功績が評価され、エミー賞を受賞しました。その後、SilhouetteFX, LLC の同僚とともにエミー賞エンジニアリング賞を受賞しました。 SilhouetteFX は、ロトスコーピング、ペイント、トラッキング、2D から 3D への再構築、合成などの目的で、ほぼすべての重要な映画で使用されています。
1996 年、ペリーはシェイプ ドリブン ワーピングとモーフィングの発明によりアカデミー科学的および技術的功績賞を受賞しました。これは、フォレスト ガンプ、タイタニック、スターゲイトの有名なエフェクトの多くを担うテクニックです。
223 日は、ペリーが大学レベルでコンピュータ サイエンスを教えて 19 年目を迎え、UW マディソン校で 10 年間、そして現在はカーセージ カレッジで 8 年以上経ちます。
Perry はアセンブリ言語に情熱を注いでいます。これまでに次の ISA (時系列順) で働いてきました。
ユニバック1100
デジタル・イクイップメント株式会社 PDP-11
デジタル・イクイップメント株式会社 VAX-11
モトローラ 68000
AARCH64 で始まる ARM
この作品は妻のサラと息子のイアンとエヴァンに捧げます。
ペリーは、CS 1、CS 2、データ構造、ネットワーキング、オペレーティング システム、およびコンピューター組織のクラスに適した約 200 のプログラミング プロジェクトのライブラリを作成しました。 CS テキスト (またはその他の CS 関連コンテンツ) の出版社がライブラリの購入に興味がある場合は、ご連絡ください。
また、プログラマー向けのゾンビ小説である Get Off My L@wn もチェックしてください。
あなたはその通りです...エリートプログラマーのダグ・ハンズマンは、妻ルース・アンの故郷であるウィスコンシン州北部に隠居しました。そして、まあ、黙示録が起こります。残念だ。
70 件以上のレビューがあり、5 点満点中 4.3 と評価されており、楽しく読めて、費用もほとんどかかりません。