めもめも.
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 件のコメント:
コメントを投稿