サーチ…


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内容CXSymbolアドレスCXますか? CX0x12340x0102 (または何でも)で0x1234ですか? CX0x1234終了することが判明し0x1234 - アドレスが必要な場合は、 OFFSET指定子を使用する必要があります

             MOV     AX, [Symbol]      ; Contents of Symbol
             MOV     CX, OFFSET Symbol ; Address of Symbol

インテルアセンブラ

Intelは8080、8008、および4004プロセッサの派生品である8086アセンブリ言語の仕様を書いています。このように、彼らが書いたアセンブラは、独自の構文に正確に従いました。しかし、このアセンブラはあまり広く使われていませんでした。

インテルは、オペコードをゼロ、1つまたは2つのオペランドのいずれかにすることを定義しました。 2オペランド命令は、その時点で他のアセンブラとは異なるdestsource順序にある​​と定義されていました。しかし、いくつかの命令では暗黙的なレジスタをオペランドとして使用していました。インテルは「接頭辞」オペコードの概念も使用しました.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オペランド命令でsourcedestオーダーで指定しました。

AT&Tアセンブラのコンベンションがインテルの命令を覆し、x86の新しい方言が導入されました。

  • レジスタ名の先頭には%
    %al%bxなど
  • 即時値は$によって予告され$
    $4
  • オペランドは、 sourcedest
  • オペコードにはオペランドサイズが含まれています:
    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は永遠に定義されます。 XYの名前を「使い切って」しまうのを避けるために、より明確な名前を使用する必要がありました。

       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の両方の構文と互換性があります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow