Intel x86 Assembly Language & Microarchitecture
アセンブラ
サーチ…
Microsoftアセンブラ - MASM
8086/8088がIBM PCで使用され、その上のオペレーティングシステムがMicrosoftから最も頻繁に使用されていたことを考えると、MicrosoftのアセンブラMASMは長年にわたるデファクトスタンダードでした。それはインテルの構文を厳密に守っていたが、便宜的だが見通しにおいてはコードの混乱とエラーだけを引き起こす「緩い」構文が許されていた。
完璧な例は次のとおりです。
MaxSize EQU 16 ; Define a constant
Symbol DW 0x1234 ; Define a 16-bit WORD called Symbol to hold 0x1234
MOV AX, 10 ; AX now holds 10
MOV BX, MaxSize ; BX now holds 16
MOV CX, Symbol ; ????
最後のMOV命令は、 Symbolの内容をCX 、 SymbolのアドレスをCXますか? CXは0x1234か0x0102 (または何でも)で0x1234ですか? CXは0x1234終了することが判明し0x1234 - アドレスが必要な場合は、 OFFSET指定子を使用する必要があります
MOV AX, [Symbol] ; Contents of Symbol
MOV CX, OFFSET Symbol ; Address of Symbol
インテルアセンブラ
Intelは8080、8008、および4004プロセッサの派生品である8086アセンブリ言語の仕様を書いています。このように、彼らが書いたアセンブラは、独自の構文に正確に従いました。しかし、このアセンブラはあまり広く使われていませんでした。
インテルは、オペコードをゼロ、1つまたは2つのオペランドのいずれかにすることを定義しました。 2オペランド命令は、その時点で他のアセンブラとは異なるdest 、 source順序にあると定義されていました。しかし、いくつかの命令では暗黙的なレジスタをオペランドとして使用していました。インテルは「接頭辞」オペコードの概念も使用しました.1つのオペコードが次の命令に影響します。
; Zero operand examples
NOP ; No parameters
CBW ; Convert byte in AL into word in AX
MOVSB ; Move byte pointed to by DS:SI to byte pointed to by ES:DI
; SI and DI are incremented or decremented according to D bit
; Prefix examples
REP MOVSB ; Move number of bytes in CX from DS:SI to ES:DI
; SI and DI are incremented or decremented according to D bit
; One operand examples
NOT AX ; Replace AX with its one's complement
MUL CX ; Multiply AX by CX and put 32-bit result in DX:AX
; Two operand examples
MOV AL, [0x1234] ; Copy the contents of memory location DS:0x1234 into AL register
インテルはまた、他のアセンブラが使用していた規約を破った。各オペコードについて、異なるニーモニックが発明された。これには、同様の操作には微妙な名前または別の名前が必要です。たとえば、「Load from Memory」のLDMと「Load Immediate」のLDIです。 Intelは1つのニーモニックMOV使用し、アセンブラがコンテキストから使用するopcodeを決定することを期待していました。これは、プログラマーが実際に望んでいたことを、アセンブラーが直感的に理解できなかったときに、将来、プログラマーにとって多くの落とし穴やエラーを引き起こしました...
AT&Tアセンブラ - as
8086はMicrosoftと一緒にIBMのPCで最もよく使われていましたが、他にも数多くのコンピュータやオペレーティングシステムが使われていました。これはAT&Tの製品であり、すでに他の多くのアーキテクチャー上で動作していました。これらのアーキテクチャでは、より一般的なアセンブリ構文を使用しました。特に、2オペランド命令でsource 、 destオーダーで指定しました。
AT&Tアセンブラのコンベンションがインテルの命令を覆し、x86の新しい方言が導入されました。
- レジスタ名の先頭には
%:
%al、%bxなど - 即時値は$によって予告され
$:
$4 - オペランドは、
source、dest順 - オペコードにはオペランドサイズが含まれています:
movw $4, %ax ; Move word 4 into AX
ボーランドのターボアセンブラー - TASM
Borlandは、「Turbo Pascal」と呼ばれるパスカルコンパイラを使い始めました。これには、C / C ++、Prolog、Fortranといった他の言語のコンパイラが続いていました。また、「Turbo Assembler」というアセンブラも製作しました.Turbo Assemblerは、Microsoftの命名規則に従って「TASM」と呼ばれました。
TASMは、指定されたIDEALモードでのソースコードのより厳密な解釈を提供することによって、MASM(上記を参照)を使用してコードを書く問題のいくつかを修正しようとしました。デフォルトでは、 MASMモードを前提としていたため、MASMソースを直接アセンブルすることができましたが、BorlandはMASMのより奇妙な特質とのバグ対応が必要であることを発見したので、 QUIRKSモードも追加しました。
TASMはMASMよりもはるかに安価であったため、大きなユーザーベースを持っていました。
GNUアセンブラ - ガス
GNUプロジェクトでx86ファミリ用のアセンブラが必要になったとき、彼らはIntel / MicrosoftバージョンではなくUnixに関連したAT&Tバージョン(およびその構文)を使いました。
Netwideアセンブラ - NASM
NASMはx86アーキテクチャー向けに最も移植されたアセンブラです。これは、x86ベースのほとんどすべてのオペレーティングシステム(MacOSに含まれています)でも利用可能で、他のプラットフォームのクロスプラットフォームアセンブラとしても利用できます。
このアセンブラはインテルの構文を使用しますが、それは独自の「マクロ」言語に重点を置いているため、他の言語とは異なります。これにより、プログラマはより単純な定義を使用してより複雑な式を構築し、
残念なことに、この強力な機能にはコストがかかります。データの種類が一般化された命令の方法になるため、データの型指定は強制されません。
response: db 'Y' ; Character that user typed
cmp response, 'N' ; *** Error! Unknown size!
cmp byte response, 'N' ; That's better!
cmp response, ax ; No error!
しかし、NASMは他のものに欠けていた1つの機能、すなわちスコープ付きシンボル名を導入しました。他のアセンブラでシンボルを定義するとき、その名前は残りのコード全体で使用できますが、その名前を "使い果たし"、グローバル名空間をシンボルで "汚染"します。
たとえば(NASM構文を使用して):
STRUC Point
X resw 1
Y resw 1
ENDSTRUC
この定義の後、XとYは永遠に定義されます。 XとYの名前を「使い切って」しまうのを避けるために、より明確な名前を使用する必要がありました。
STRUC Point
Pt_X resw 1
Pt_Y resw 1
ENDSTRUC
しかし、NASMは代替手段を提供しています。 「ローカル変数」という概念を活用することで、将来の参照で包含構造を指定する必要がある構造フィールドを定義することができます。
STRUC Point
.X resw 1
.Y resw 1
ENDSTRUC
Cursor ISTRUC Point
ENDISTRUC
mov ax,[Cursor+Point.X]
mov dx,[Cursor+Point.Y]
残念ながら、NASMは型の追跡をしないので、より自然な構文を使うことはできません:
mov ax,[Cursor.X]
mov dx,[Cursor.Y]
さらに別のアセンブラ - YASM
YASMはNASMの完全な書き換えですが、IntelとAT&Tの両方の構文と互換性があります。