アセンブリ言語で書かれたプログラムは、アセンブラによってコンパイルされます。 すべてのアセンブラは、特定のコンピュータアーキテクチャ用に設計された独自のアセンブリ言語を持っています。
機械語は単なる一連の数字であり、人間にとって読むのは容易ではありません。 ASMを使用して、プログラマーは機械語にほぼ正確に対応する人間が読めるプログラムを書くことができます。
不利な点は、コンピュータが実行するすべてのことを、正確かつ詳細に明示的に説明しなければならないことです。 利点は、プログラマーがコンピューターの動作を最大限に制御できることです。
なぜASMは「低レベル」言語なのですか?
アセンブリは、低レベルのプログラミング言語と呼ばれます。これは、コンピュータに指示することとコンピュータが行うことの間に(ほぼ)1対1の関係があるためです。 一般に、アセンブリプログラムの1行には、コンピュータに対する最大1つの命令が含まれています。
ASMは「高級」言語とどう違うのですか?
高水準言語は低水準操作の抽象化を提供し、それによってプログラマーは彼らがしたいことを記述することにもっと集中することができ 、そしてそれがどのように行われるべきであるかに集中することができます 。 このようにプログラミングする方が便利で、低レベルの制御を犠牲にしてプログラムを読みやすくします。
高級言語で書かれたプログラムは、アセンブリで書かれたプログラムの生の速度と効率とは決して一致しません。 高水準言語の例には、Python、Java、JavaScript、Clojure、およびLispが含まれます。
「中級」言語とは何ですか?
中レベルまたは低レベルの言語は、低レベルの操作へのアクセスを提供しながら、プログラマーの生活を楽にするためにいくつかの高レベルの抽象化を提供します。 それらはしばしばオペレーティングシステムを書くために使われるので、それらは時々 システムプログラミング言語と呼ばれます 。
中間言語で書かれたプログラムは、アセンブリ言語で書かれたプログラムと同じように、またはほぼ同じように実行できます。 中間レベルのプログラミング言語の例には、C、C ++、Ada、Nim、およびRustがあります。
ASMは移植可能ですか?
いいえ。アセンブリ言語は特定のコンピュータアーキテクチャに関連付けられているため、移植性はありません。 あるアセンブリ言語で書かれたプログラムを別の種類のマシンで実行するには、そのプログラムを完全に書き直す必要があります。
移植性は、高水準言語の主な利点の1つです。 Cコンパイラは現代のほぼすべてのシステムアーキテクチャに対応しているため、Cプログラミング言語はしばしば "ポータブルアセンブリ"と呼ばれます。 Cで書かれたプログラムは他のコンピュータでコンパイルする前にいくつかの変更を必要とするかもしれませんが、コア言語は移植可能です。
一般的に言って、より高いレベルの言語であれば、それが他のアーキテクチャで動作するために必要な変更は少なくなります。 最低レベルの言語 - 機械語とアセンブリ言語 - は移植性がありません。
例:こんにちは、世界! 32ビットアセンブリで、Windows用
これは32ビットIntelプロセッサ用に書かれた「Hello、World」です。 64ビットプロセッサでも動作します。 Windows 10でコンパイルして実行します。
global _main extern _printfセクション.text _main:プッシュメッセージ呼び出し_printf add esp、4 retメッセージ:db 'Hello、World!'、10、0
はじめに、メモ帳を開きます。 上記のコードをコピーして新しいテキストファイルに貼り付け、 hello.asmという名前でファイルを保存します。
アセンブリをコンパイルするために、 NASM 、Netwide Assemblerを使用します。 それは//www.nasm.us/でダウンロードすることができます。
nasm -f win32 hello.asm
このコマンドを実行すると、NASMはオブジェクトファイルを作成します。 オブジェクトファイルにはマシンコードが含まれていますが、実行可能ファイルではありません。 このオブジェクトファイルはhello.objという名前です。
実行ファイルを作成するために、32ビットバージョンのMinGW (Minimal GNU for Windows)を使用します。これは、gccコンパイラを提供します。 これは//www.mingw.org/からダウンロードできます。
gcc -o hello.exe hello.obj
こんにちは
こんにちは世界!
例:こんにちは、世界! 64ビットアセンブリでは、Linux用
これは、64ビットIntelプロセッサ用に書かれた「Hello、World」です。 64ビットのLinuxでコンパイルして実行します。
extern printf; Cのprintf関数。セクション.dataと呼びます。 データセクション、初期化された変数msg:db "こんにちは、world!"、0; C文字列は0で終了します。fmt:db "%s"、10、0; printfフォーマット、 "\ n"、 '0'セクション.text; コードセクションのグローバルメインを開始します。 標準のgccエントリポイントmain: エントリポイントpush rbpのプログラムラベル。 スタックフレームを設定します。整列させる必要があります。mov rdi、fmt mov rsi、msg mov rax、0; xor rax、raxはprintfを呼び出します。 Cのprintf function pop rbpを呼び出します。 スタックmov rax、0を復元します。 正常、エラーなし、戻り値ret 戻る
このプログラムをコピーしてhello.asmという新しいファイルに貼り付けます。
次に、NASMを使用してアセンブリをコンパイルします。これは、パッケージマネージャを使用してインストールできます。 たとえば、UbuntuやDebianでは、aptを使ってNASMをインストールできます。
sudo aptアップデート&& sudo apt install nasm
このコマンドを実行してオブジェクトファイルを作成します。
nasm -f elf64 hello.asm
オブジェクトファイルはhello.oという名前です 。
次に、 gccを使用してこのオブジェクトファイルをコンピュータ上の必要なライブラリにリンクし、それをhelloという実行可能ファイルにコンパイルします。
gcc hello.o -oこんにちは
最後に、実行可能ファイルを実行します。
。/こんにちは
こんにちは世界!
参考までに、これはCで書かれた同じプログラムです。
#include int main(){char msg [] = "Hello world \ n"; printf( "%s \ n"、msg); 0を返します。 }
- 低レベルのアセンブリコードの他の例および各ルーチンの動作に関する追加情報については、デバッグルーチンを参照してください。
- アセンブリ言語のその他の例については、Happy CodingsのWebサイトを参照してください。
2GL、アセンブラ、低レベル言語、機械語、プログラミング用語