その時々

その時々で違うんです。特に決まっていないんです。

アセンブラプログラムをデバッグする

アセンブラプログラムをデバッグするにはgdbを使用します。

こういったソースがあるとします。

.data
msg:    .ascii    "hello world\n"
msgend:    .equ    len, msgend - msg

.global main
main:
    movl $4,    %eax
    movl $1,    %ebx
    movl $msg,    %ecx
    movl $len,    %edx
    int $0x80
    ret

これをgccコンパイルします。

gcc helloworld.s -o hw

そうするとhwという実行ファイルが出来るのでデバッグしてみます。

gdb hw

(gdb) break main
Breakpoint 1 at 0x804a01c
(gdb) run
Starting program: /home/hirosandesu/hw

Breakpoint 1, 0x0804a01c in msgend ()

(gdb) disassemble
Dump of assembler code for function msgend:
0x0804a01c <msgend+0>:    mov    $0x4,%eax
0x0804a021 <msgend+5>:    mov    $0x1,%ebx
0x0804a026 <msgend+10>:    mov    $0x804a010,%ecx
0x0804a02b <msgend+15>:    mov    $0xc,%edx
0x0804a030 <msgend+20>:    int    $0x80
0x0804a032 <msgend+22>:    ret   
0x0804a033 <msgend+23>:    add    %al,(%eax)
End of assembler dump.

(gdb) i r
eax            0xbffff494    -1073744748
ecx            0xd0951f80    -795533440
edx            0x1    1
ebx            0x27eff4    2617332
esp            0xbffff3ec    0xbffff3ec
ebp            0xbffff468    0xbffff468
esi            0x0    0
edi            0x0    0
eip            0x804a01c    0x804a01c <msgend>
eflags         0x200246    [ PF ZF IF ID ]
cs             0x73    115
ss             0x7b    123
ds             0x7b    123
es             0x7b    123
fs             0x0    0
gs             0x33    51

(gdb) p/x $eax
$1 = 0xbffff494
(gdb) stepi
0x0804a021 in msgend ()
(gdb) p/x $eax
$2 = 0x4
(gdb) stepi
0x0804a021 in msgend ()
(gdb) x/s 0xbffff3ec
0xbffff3ec:     "VK\025"
(gdb) stepi
0x0804a030 in msgend ()
(gdb)
hello world
(gdb) c
Continuing.

Program exited with code 014.
(gdb) q

こんな感じです。
簡単に説明すると
gdb 実行ファイルで起動
break mainでmainにブレークポイントをセット
runで実行
disassembleでアセンブラを表示
i r(info register)でレジスタ情報の表示
p/x $eaxでeaxレジスタを16進数で表示
x/s アドレスでアドレス位置の文字列を表示
c(continue)で続行
qで終了

といった感じです。
楽しいですね。