- 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