Unix上のASM

もちろん、Unix用のアセンブラーは、DOSやWindows用のアセンブラーとは異なります。 これらのオペレーティングシステムのASMでは、型強制(byte ptr、word ptr、dword ptr)で解決されるさまざまなあいまいさ(必要に応じてあいまいさ)に満ちた知性によって課された構文が使用されましたが、NyxのASMではAT&TおよびSysVを使用しました/386。コマンドの解釈のあいまいさを排除するために特別に開発されました。 もちろん、NASMなどのインテリジェントな構文を持つUnix用のアセンブラーもありますが、この記事では、このプラットフォームの標準的なアセンブラーの構文について説明します。



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



All Articles