一般に、もちろん、ルールから始める価値があります。 そうします。 AT&T構文を使用するアセンブラでは、すべてのラテン文字、数字、およびパーセント、コンマ、ピリオド、下線、アスタリスク、ドル記号などの追加記号も作業に使用されます。 プロセッサコマンド:特殊記号または数字で始まらず、コロンで終わらない許可された文字のシーケンスは、アセンブラプロセッサコマンドと見なされます。
// hlt
そのようなシーケンスがパーセント記号で始まる場合、これはプロセッサレジスタです。
 pushl %eax //    %eax       ($),    .       0, 10h,    qwerty: pushl $0 pushl $0x10 pushl $qwerty
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      シーケンスがピリオドで始まる場合、これはアセンブラーデリックと見なされます。
.aling 2
シーケンスがコロンで終わる場合、これはラベルです(docおよびwindowsのアセンブラーと同じ方法で使用されます)。 特別なドットラベルに注目する価値があります。このラベルは、dの下のacmaのように、現在のアドレスを特徴付けます。
AT&T構文のタイプ変換コマンドには、C、ソースサイズ、T、レシーバサイズの4文字の名前があります。
//cbw cbtw //cwde cwtl //cwd cwtl //cdq cltd
ここで:
b-バイト
w- word
l-ダブルワード
q-四重ワード
s- 32ビット浮動小数点数
l-64bit浮動小数点数
t- 80ビット浮動小数点数
アセンブラーの最も重要な違いの1つは、プレミアとソースの記録です。dos-asmとは対照的に、Unixでは、ソースオペランドは常に最初の位置に書き込まれます
 //mov ax,bx movw %bx,%ax //imul eax,ecx,16 imull $16,%ecx,%eax
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      アドレス指定のタイプ:前述のように、レジスタオペランドと直接オペランドは、%および$プレフィックスで区別されます。
 //xor ebx,ebx xorl %ebx,%ebx //mov edx,offset qwerty movl $qwerty,%edx
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      間接アドレス指定では、インテリジェントバージョンと同様に、変更されていない変数名が使用されます。
//push dword ptr qwerty 
      
        
        
        
      
     pushl $qwerty
      
      より複雑なアドレス指定方法は、シフト、ベース、およびインデックス付けの操作に基づいて最もよく考慮されます。
//mov eax,base_addr[ebx+edi*4] movl base_addr(%ebx+%edi*4),%eax //lea eax,[eax,eax*4] leal (%eax,%eax*4),%eax //mov ax,word ptr [bp-2] movw -2(%ebp),%ax //mov edx,dword ptr [edi*2] movl (%edi*2),%edx
プログラミングプロセス自体は、libcライブラリを使用するプログラミングと、使用しないプログラミングに分けられます。 システム自体はCで記述されており、多くの関数がこのライブラリにアクセスするため、アセンブラーで記述されたプログラムはこのライブラリにアクセスできます。 ライブラリ関数は、callコマンドを使用して呼び出されます。 ただし、1つの問題があります。すべてのUnixシステムが類似しているわけではないため、一部のシステムでは、ライブラリ関数の前にアンダースコアを付ける必要があります。 有名なフレーズを表示する次のプログラムを検討してください。
 .text .globl main main: pushl $message call puts popl %ebx ret .data message: .string "Hello world!\0"
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      glibcがない場合、プログラムは次のようになります。
 .text .globl _start _start: movl $4,eax xorl %ebx.%ebx incl %ebc movl $message,%ecx movl $mesg_len,%edx int $0x80 xorl %eax,%eax incl %eax xorl %ebx,%ebx int $0x80 hlt .data message: .string "Hello World!\012" mesg_len= .-message
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      この例では、画面への書き込みに2つのシステムコールを使用しました:writeとexitです。 writeの呼び出しは、この関数がシステムコールテーブルに記録される4つの値を%eaxレジスタに配置することに対応します。
この関数は、割り込み$ 0x80を呼び出すことによって呼び出されます。プログラムを終了します。 その完了は、システムコール$ 1に対応します。