2009年10月11日日曜日

QEMU,GDB,インラインアセンブラ

めもめも.

QEMU <—> GDB

最近QEMUでGDBサーバーとやらを使うとおいしいということを知ったのでメモ.

/* QEMU起動時に-sオプションを付けるとGDBサーバーが起動.-pでポート指定可能.デフォルトは1234. */
>qemu -fda floppy.img -boot a -s
/* gdb起動 */
>gdb file.bin
/* GDBサーバに接続 */
>>target remote localhost:1234

QEMUのオプション

/* QEMUモニタをターミナルに */
>qemu -fda floppy.img -boot a -monitor stdio
/* QEMUをcursesで */
>qemu -fda floppy.img -boot a -curses

GDBのコマンドなど.

n(ext)とs(tep)の違いは,nextが関数呼び出しを1行として扱うのに対し,stepは関数内に入ること.

GCCでもNASMでも-gオプションを付けるとデバッガ用に出力してくれるようだ.

/* GDBで毎回コマンドを打つのがメンドクサイ.ファイルにコマンドを書いておいて読み込む.-xオプション. */
>gdb -x script.gdb file.bin
/* 構造体の内容を表示(16進) */
>>p/x *(&structure[0])
/* メモリの内容を表示 */
>>x/10 &function
/* バックトレース表示 */
>>bt

インラインアセンブラ(GCC・GAS)

NASMを使っていたのでGCCのインラインアセンブラに触ったらエラーを連発してしまった.突っかかったところ,気を付けるところをメモしておく.

  • GAS
    • mov等のソースとデスティネーションが逆
    • 即値には$を付ける
    • レジスタには%を付ける
    • [esp + 4] -> 4(%esp)
    • mov,pop等の後にサイズを表すb,w,lなどが付く
    • global等の前に.が付く
    • 1行コメントは;ではなく#
  • インラインアセンブラ
    • __asm__ __volatile__( ... ); の...に文字列で書く
    • 1行ごとに文字列を書く場合,末尾に\\n\\tを付ける
    • 拡張構文は asm( "実行するアセンブリコード" : "=指定文字列" (出力先変数) : "指定文字列" (入力) : "破壊されるので退避してほしいレジスタ");
    • "実行するアセンブリコード"以外は省略可能.後ろに何も書かないなら:も省略可能(必須?).
    • "実行するアセンブリコード"に%0,%1...と書いたものと,入力に書いた変数等が順に対応する.指示文字列で他の値を指定できる.
    • "実行するアセンブリコード"にレジスタを書きたい場合,%%eaxのように%%を付ける

0 件のコメント:

コメントを投稿