一般に、もちろん、ルールから始める価値があります。 そうします。 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に対応します。