Linuxでx86アセンブラ(道具編)

  • 45
    Like
  • 2
    Comment
More than 1 year has passed since last update.

:large_blue_diamond:この記事について

linux環境でx86アセンブラを開発するのに必要な道具たちを紹介します.アセンブラはプログラミングをやる人なら誰でも聞いたことあるかと思います.でも、C++やJavaなどの高級言語が主流になっている昨今では必要ないのでは?と思うかもしれません.確かにアセンブラはCPUやOSに著しく依存するため移植性はありません.しかし、アセンブラを使うことでマシンに対する理解が深まります.これにより、組み込みなどx86以外のアーキテクチャ以外での開発にも柔軟に対応できるようになります.また、コンパイラが吐き出すコードの殆どは、実行速度を犠牲にして移植性を向上しています.腕次第でコンパイラよりも速いコードを作れるようになります.

:large_blue_diamond:紹介するツール

  • nasm
    アセンブリコードからオブジェクトを生成するアセンブラです.
    移植性に優れ、Linux、BSD、Windowsのオブジェクトを生成できます.

  • gdb
    C、C++でも使われるデバッガです.アセンブラでも使えます.

:large_blue_diamond:ツールをインストール

Linux上なら簡単インストールできます.
sudo apt-get install nasm build-essential

:large_blue_diamond:nasmの使い方

はじめにアセンブリソースを作りませう.お好きなエディタで下のアセンブリ版ハローワールドを書いてtest.asmとして保存しましょう.

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

これをコンパイル・リンクして実行ファイルを生成します.
nasm -g -f elf64 -o test.o test.asm
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

参考文献

↓↓:bowtie:コメントをいただけたら励みになります:bowtie:↓↓