kurodakazumichi / issues

0 stars 0 forks source link

アセンブリの勉強 #15

Open kurodakazumichi opened 6 years ago

kurodakazumichi commented 6 years ago

開発環境

Mac OSX + vagrant + VIrtualBoxで仮想環境を構築。

vagrant setup

vagrant box add hashicorp/precise # 16.04.4 LTS
vagrant init hashicorp/precise64
vagrant up
vagrant ssh # ubuntuに接続

Initial Setup

# rootにパスワード設定(初期状態だとrootにパスワードが設定されておらず、su -でrootになれなかったので)
sudo su -
passwd # 適当なパスワードを設定

Install nasm

アセンブリ言語のコンパイラ

### root
apt-get install nasm build-essential

Create Hello World

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

Execute Hello World

nasm -g -f elf64 -o test.o test.asm
gcc -o test test.o
./test
kurodakazumichi commented 6 years ago

デバッグツール gdbのインストール

sudo apt-get update # updateしないとinstall gdbでこけた
sudo apt-get install gdb

gdbの基本的な使い方

デバッグの準備

gdb -tui test # gdbを起動(コンパイルしたtestを指定)
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を終了