衒学的に言うと、CPU と直接対話するために使用する実際の言語はマシン コードです。これは、特定の命令に使用する必要がある実際のバイト値を把握することを意味します。これは明らかに退屈でエラーが発生しやすいため、代わりにアセンブラを使用します。アセンブラは、マシンコードのテキスト表現をマシンコード自体に変換し、相対アドレスの計算などのさまざまな面倒な詳細を処理します。
特定のマシン コードに対して、さまざまなアセンブラが多数存在する可能性があり、それぞれがアセンブリの記述方法について独自の考えを持っています。これは特に x86 プロセッサに当てはまります。大きく分けて、Intel と AT&T の 2 つのスタイルがあります。そして、それらの中で、さまざまなアセンブラーがさまざまなマクロやディレクティブのセットなどを持つことができます。
説明のために、C コードから生成されたアセンブリのサンプルを以下に示しますgcc -S -masm=intel
。
cmp eax, ebx
jl .L63
mov eax, DWORD PTR inbuffd
mov DWORD PTR [esp+8], 8192
mov DWORD PTR [esp+4], OFFSET FLAT:inbuf
mov DWORD PTR [esp], eax
call read
cmp eax, -1
mov ebx, eax
mov DWORD PTR inbytes, eax
je .L64
test eax, eax
je .L36
mov eax, 1
xor edx, edx
jmp .L33
そして、これは で生成された同じスニペットgcc -S -masm=att
です:
cmpl %ebx, %eax
jl .L63
movl inbuffd, %eax
movl $8192, 8(%esp)
movl $inbuf, 4(%esp)
movl %eax, (%esp)
call read
cmpl $-1, %eax
movl %eax, %ebx
movl %eax, inbytes
je .L64
testl %eax, %eax
je .L36
movl $1, %eax
xorl %edx, %edx
jmp .L33
これら 2 つのスニペットは同じマシン コードを生成します。違いはアセンブリ構文のみです。特に、引数の順序の違い (Intel は宛先が先、AT&T はソースが先)、命令名のわずかな違い、%
AT&T でレジスタを指定するための の使用などに注意してください。
そして、さまざまな CPU があります。CPU には特定のアーキテクチャがあります。つまり、そのアーキテクチャの命令セットを実行します。そのアーキテクチャには、コア命令セットがあり、場合によっては拡張機能または特別なアプリケーション用の追加の命令グループがあります。x86 は良い例です。浮動小数点命令、MMx、3DNow があります。そのアーキテクチャの異なる CPU は、追加の命令を理解できる場合とできない場合があります。一般に、CPU が何をサポートしているかを CPU に問い合わせる方法があります。
「x86 アセンブリ」と言うとき、「x86 アーキテクチャの任意の CPU で実行されるアセンブリ」という意味を理解する人がいます。
より洗練された CPU - 特にメモリ管理 (x86 を含む) を備えた CPU は、単に命令を実行するだけではありません。80286以降、x86 アーキテクチャには、リアル モードとプロテクト モードの 2 つのメイン モードがあります。コア命令セットはどちらのモードでもそのまま使用できますが、各モードでメモリが機能する方法は完全に異なるため、どちらのモードでも機能する実際のコードを試して書くことは実際的ではありません。
後の CPU では、より多くのモードが導入されました。386 は仮想 8086 モード(別名 v86 モード) を導入し、プロテクト モードのオペレーティング システムが実際に CPU をリアル モードに切り替えることなくリアル モード プログラムを実行できるようにしました。AMD64 プロセッサは、ロング モードで 64 ビット コードを実行します。
CPU は複数のアーキテクチャをサポートできます。Itanium アーキテクチャは別のアーキテクチャと見なされ、Itanium をサポートする Intel によってリリースされたすべての CPU は x86 もサポートし、それらを切り替えることができます。
x86 ファミリは、おそらくアセンブリ言語の非常に複雑な例です。33 年以上前にさかのぼる、非常に長く複雑な歴史があります。(32 ビット) アプリケーションで使用されるコア命令のマシン コードは、1978 年にリリースされた 8086 のものと同じです。いくつかの改訂が行われ、それぞれに命令が追加されています。
x86 アセンブリを正しく学習したい場合は、次のことを考慮してください。
The Art of Assembly Language Programmingには、DOS、Windows、および Linux のそれぞれのエディションがありました。Windows と Linux のバージョンでは、作成者が考案した High Level Assembly (HLA) と呼ばれる言語を使用しています。これは、x86 アセンブリのようなものですが、実際にはそうではありません。これはあなたの好みかもしれませんし、そうでないかもしれません - 厳密には実際のアセンブリではありませんが、概念はすべてそこにあり、後で適切なアセンブリを書くことを学ぶのはたいした努力ではありません. その名誉のために、それはまた、プロセッサアーキテクチャ、BIOS、ビデオなどに関する情報など、アセンブリ関連の資料をたくさん含んでいます.DOSバージョンは、まっすぐなMASM(Intel)アセンブリを教えています.
基礎からのプログラミングは、 Linux での AT&T スタイルのアセンブリを教えます
実際のアセンブラ (無料のもの) については、Windows またはLinuxでMASM32 (intel スタイル) を試してください。as
たまたま、Linuxas
は Intel または AT&T スタイルのアセンブリをアセンブルします。
x86 アーキテクチャに圧倒され、他のアーキテクチャのアセンブリを学習したい場合は、より小さなもの から始めることを検討してください。