- FASM。 Linux用のflatassembler.netバージョンを使用します
- アルド。 ald.sourceforge.netを引き受けます
- 小屋。 shed.sourceforge.netを引き受けます
- ld。 ほとんどのディストリビューションにあります
実際、誰もが自分でツールを選択します。 私は自分でこれらを選びました。
FASMをインストールする
アーカイブをオフからダウンロードした後。 サイトを展開します。
tar zxvf fasm-1.69.11.tgz
      
      このフォルダには、コンパイルに使用できるバイナリfasmファイルがあります。 便宜上、シンボリックリンクを作成できます:
sudo ln -s /home/username/fasm/fasm /usr/local/bin
      
      aldとshedのインストールはこれ以上複雑ではありません。
$ ./configure 
      
        
        
        
      
     $ make 
      
        
        
        
      
     # make install
      
      その結果、アセンブリ言語プログラミングに役立つ3つのツールが用意されます。
システムコール
他のほとんどのオペレーティングシステムと同様に、Linuxはいわゆる API-プログラマーにとって便利な機能のセット。 ほとんどの場合、80h割り込みを使用してシステム関数呼び出しが行われます。 Linuxはfastcallパラメーターの受け渡し規則を使用していることに注意してください。 それによると、パラメーターはレジスターを介して渡されます(たとえば、ウィンドウでは、パラメーターがスタックを介して渡されるstdcallが使用されます)。 呼び出された関数の数はeaxに入れられ、パラメーターはレジスターに入れられます。
パラメータ番号/レジスタ
1 / ebx
2 / ecx
3 / edx
4 / esi
5 / edi
6 / ebp
ご覧のとおり、すべてがそれほど複雑ではありません。 少なくともここで、システム関数の数、その説明、およびパラメーターを調べることができます。 例として
sys_exit
      
      を取り上げます。 このページでわかるように、1つのパラメーターがあります-戻りコードとシリアル番号1。したがって、次のコードで呼び出すことができます。
mov eax, 1 ; 1 -    
      
        
        
        
      
     sub ebx, ebx ;   (   mov ebx, 0) 
      
        
        
        
      
     int 80h ;   80h
      
      すべてが明確であることを願っています。
Hello World!
じゃあ 何も書かない すべてが私たちのために書かれています:)
fasm/examples/elfexe
      
      には、hello.asmファイルがあり、これには次のコードが含まれています。
; fasm demonstration of writing simple ELF executable 
      
        
        
        
      
     
      
        
        
        
      
     format ELF executable 3 
      
        
        
        
      
     entry start 
      
        
        
        
      
     
      
        
        
        
      
     segment readable executable 
      
        
        
        
      
     
      
        
        
        
      
     start: 
      
        
        
        
      
     
      
        
        
        
      
     mov eax,4 
      
        
        
        
      
     mov ebx,1 
      
        
        
        
      
     mov ecx,msg 
      
        
        
        
      
     mov edx,msg_size 
      
        
        
        
      
     int 0x80 
      
        
        
        
      
     
      
        
        
        
      
     mov eax,1 
      
        
        
        
      
     xor ebx,ebx 
      
        
        
        
      
     int 0x80 
      
        
        
        
      
     
      
        
        
        
      
     segment readable writeable 
      
        
        
        
      
     
      
        
        
        
      
     msg db 'Hello world!',0xA 
      
        
        
        
      
     msg_size = $-msg
      
      ご覧のとおり、2つのシステム関数がここで呼び出されます
sys_write
      
      (シリアル番号4)と
sys_exit
      
      です。
sys_write
      
      は、出力ストリーム記述子(1-stdout)、文字列へのポインター、および文字列サイズの3つのパラメーターを受け入れます。 既に述べたように、関数番号自体はeaxに入れなければなりません。 すでに
sys_exit
      
      関数。 この奇跡を
fasm hello.asm
      
      ように
fasm hello.asm
      
      でき
fasm hello.asm
      
      (ただし、ソースと同じ場所にバイナリがあるため、必ずしもそうではありません)。
中身を見てみましょう
バイナリを調べる時が来たと思います。 まず、16進エディターを使用して、取得するものを確認します。 コマンドを実行します:
shed hello
      
       
      プログラム全体、データ、エルフヘッダーが表示されます。 悪くない? 次に、デバッガでプログラムを確認します。 コンソールに入力します:
ald hello
      
      コマンドを入力するという提案のある行で迎えられるべきです。 helpと入力し
help
      
      コマンドのリストを調べるか、help commandと入力して別のコマンドでヘルプを取得できます。
disassemble
      
      コマンド(またはそのエイリアス-"
d
      
      ")を使用してプログラムを逆アセンブルできます。 プログラムの逆アセンブルされたリストが表示されます。 左側は住所、右側はチーム自体、中央はチームのオペコードです。
dump
      
      コマンドを使用してダンプを取得できます(奇妙ですが、
help
      
      コマンドの出力にはありません)。
 
      次に、
next
      
      コマンドを使用してみてください。 それを実行すると、それに応じて、レジスタの値、フラグセット、次に実行されるアドレス、オペコード、逆アセンブルされたコマンドが表示されます。 コマンドを実行し、フラグとレジスタの変更を監視してください。 最初の割り込みが呼び出された後、「Hello world!」が画面に表示されます。
この記事の目的は、一般的なアセンブリ言語プログラミングではなく、Linuxでのアセンブリ言語プログラミングの基本を示すことでした。 ここから何か役に立つことを学んだことを願っています。
PS。 Habrに関する最初の記事。
便利なリンク
asm.sourceforge.net
www.int80h.org