この記事について
linux環境でx86アセンブラを開発するのに必要な道具たちを紹介します.アセンブラはプログラミングをやる人なら誰でも聞いたことあるかと思います.でも、C++やJavaなどの高級言語が主流になっている昨今では必要ないのでは?と思うかもしれません.確かにアセンブラはCPUやOSに著しく依存するため移植性はありません.しかし、アセンブラを使うことでマシンに対する理解が深まります.これにより、組み込みなどx86以外のアーキテクチャ以外での開発にも柔軟に対応できるようになります.また、コンパイラが吐き出すコードの殆どは、実行速度を犠牲にして移植性を向上しています.腕次第でコンパイラよりも速いコードを作れるようになります.
紹介するツール
-
nasm
アセンブリコードからオブジェクトを生成するアセンブラです.
移植性に優れ、Linux、BSD、Windowsのオブジェクトを生成できます. -
gdb
C、C++でも使われるデバッガです.アセンブラでも使えます.
ツールをインストール
Linux上なら簡単インストールできます.
sudo apt-get install nasm build-essential
nasmの使い方
はじめにアセンブリソースを作りませう.お好きなエディタで下のアセンブリ版ハローワールドを書いてtest.asmとして保存しましょう.
section .bss
section .data
MSG: db "Hello World!!", 10
MSG_LEN equ $-MSG
section .text
global main
main:
nop
.spike:
mov eax, 0
add eax, 5
sub eax, 2
.print:
mov eax, 4
mov ebx, 1
mov ecx, MSG
mov edx, MSG_LEN
int 80h;
.final:
mov eax, 0
ret
これをコンパイル・リンクして実行ファイルを生成します.
gcc -o test test.o ```
nasmのオプション```-f elf64```は64bitの指定です.32bitの場合は、```-f elf```を指定してください.
testを実行すると
``` Hello World!! ```
と、ターミナルに表示されます.
# \:large_blue_diamond:gdbの使い方
gdbを使って実行中に何が起きているか見てましょう.
``` gdb -tui test ```
で、gdbを起動しましょう.
``` break main ```
で、mainのところにブレイクポイントを設置します.
``` r ```
で、ブレイクポイントまで実行します.
``` disassemble```
で、アセンブリのデバッグができるよう処理をアセンブリに変換します.
``` layout asm ```
アセンブリコードを表示します.
これでデバッグする準備が出来ました.
下のコマンドを使ってデバッグしましょう.
| コマンド | 意味 |
|:--------|------|
| stepi | 次の命令を実行 |
| i r | すべてのレジスタを表示 |
| p $eax | レジスタeaxの内容を10進数で表示 |
| p/x $eax | レジスタeaxの内容を16進数で表示 |
| p/t $eax | レジスタeaxの内容を2進数で表示 |
| display $eax | レジスタeaxの内容を命令を実行するたびに自動表示 |
| info display | 自動表示する変数を表示 |
| undisplay $eax | レジスタeaxの自動表示を解除 |
| x &msg | メモリmsgの中身を表示 |
| quit | gdbを終了 |
# \:large_blue_diamond:おわりに
簡単なアセンブリでのプログラム作成ツールの紹介でした.私の勉強次第では後々追記するかもしれません.*Have A Happy Hacking*
# 参考文献
* NASM development team site:
http://www.nasm.us/
* GDB: The GNU Project Debugger site:
https://www.gnu.org/software/gdb/
* Assembly Language Step-by-Step: Programming with Linux:
http://www.amazon.co.jp/Assembly-Language-Step---Step-Programming/dp/0470497025/ref=sr_1_1?ie=UTF8&qid=1446704607&sr=8-1&keywords=assembly+language+step+by+step
↓↓\:bowtie:コメントをいただけたら励みになります\:bowtie:↓↓