低レイヤを学ぶ
x86_64 では、さきほど見たように、汎用レジスタが16個あった。汎用レジスタは一個8byteあるので、16個あれば、128byteのデータ...... あたりまで
x86-64では、比較はcmp命令を使って行います。スタックから2つの整数を〜 まで
MIPSシュミレーターを使ったアセンブリの学習講座
gdb
GUNデバッガ
マニュアル
同僚に教えてもらった gdb で実行中のプロセスにアタッチして、writeシステムコール発行直前でレジスタのファイルディスクリプタを書換えるというのを試してみた。
アセンブリプログラムのデバッグはgdbによって行うことができる
start : プログラムを開始してmain関数の先頭で処理を止める
info registers : レジスタの値を表示 info r と省略できる
disassemble : 現在実行中の関数に含まれる命令を表示
stepi : 一命令実行する
quit : gdb を終了
print <レジスタ名|即値|計算式>: レジスタ名|即値 の値を表示、または計算式の計算結果を表示 printの後ろに /xを付けると16進数で表示する。 p と省略できる
例
print /x $rax : raxレジスタの値を16進数で表示
print /x $rax - 1 : raxレジスタの値 - 1 の値を16進数で表示
display <$レジスタ名> で、step実行の度に指定したレジスタの値を表示する
例:display $eflags でstep実行の度にフラグレジスタを表示する
x/g 0x<メモリアドレス> で、メモリの中の値を16進数で表示
デバッグ中にレジスタの中身を操作する方法
(gdb) set $eflags &= ~(1 << 6) ← 6ビット目(ZFフラグの場所)を 0 に変更
(gdb) print $eflags
$6 = [ PF IF ] ← ZFフラグが消えてる!
(gdb) set $eflags |= (1 << 6) ← 6ビット目(ZFフラグの場所)を 1 に変更
(gdb) print $eflags
$7 = [ PF ZF IF ] ← ZFフラグが立った!
eflagsには立ってるレジスタだけが表示される