Posted at

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

More than 3 years have 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:↓↓