<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ものぐさ備忘録 &#187; assembly</title>
	<atom:link href="http://www.ginriki.net/wd/category/assembly/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ginriki.net/wd</link>
	<description>ソフトウェア関係の話を中心とした備忘録的日記</description>
	<lastBuildDate>Sun, 16 Jan 2011 20:07:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>IA-32のjmp, call命令でTrapするGDBスクリプト</title>
		<link>http://www.ginriki.net/wd/2008/12/03/48/</link>
		<comments>http://www.ginriki.net/wd/2008/12/03/48/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 12:30:05 +0000</pubDate>
		<dc:creator>ginriki</dc:creator>
				<category><![CDATA[GDB]]></category>
		<category><![CDATA[assembly]]></category>
		<category><![CDATA[debugger]]></category>
		<category><![CDATA[gdbscript]]></category>

		<guid isPermaLink="false">http://www.gikogeek.net/wd/?p=48</guid>
		<description><![CDATA[jmp/call命令の実行直前までプログラムを進めるGDBスクリプトです。
こういう用途に使えるGDBコマンドがないようなので、自分で作りました。
必要な方はご自由に使ってください。
- script.gdb
使い方は以 [...]]]></description>
			<content:encoded><![CDATA[<p>jmp/call命令の実行直前までプログラムを進めるGDBスクリプトです。<br />
こういう用途に使えるGDBコマンドがないようなので、自分で作りました。<br />
必要な方はご自由に使ってください。<br />
- <a href="http://www.ginriki.net/wd/wp-content/uploads/2008/12/script.gdb">script.gdb</a></p>
<p>使い方は以下の通り、</p>
<pre>$ gdb a.out
(gdb) source script.gdb
(gdb) break main
(gdb) run
＃ main関数でbreak

(gdb) run_until_call_jmp
＃ main関数内のcall or jmp命令直前で停止</pre>
<h4>jmp,call命令のop codeの調べ方</h4>
<p>IA-32命令セットにおける、JMP, CALLのオペコードは下記の通りになりますIA-32 インテル アーキテクチャ・ソフトウェア・ディベロッパーズ・マニュアル 中巻より抜粋。<a href="http://www.intel.com/jp/download/index.htm">http://www.intel.com/jp/download/index.htm</a></p>
<p><a href="http://www.gikogeek.net/wd/wp-content/uploads/2008/12/jmp_op.png"><img class="aligncenter size-full wp-image-49" title="jmp_op" src="http://www.gikogeek.net/wd/wp-content/uploads/2008/12/jmp_op.png" alt="JMP命令のオペコード" width="500" height="154" /></a><br />
<a href="http://www.gikogeek.net/wd/wp-content/uploads/2008/12/call_op1.png"><img class="aligncenter size-full wp-image-51" title="call_op1" src="http://www.gikogeek.net/wd/wp-content/uploads/2008/12/call_op1.png" alt="callオペコード" width="499" height="140" /></a></p>
<p>cb、cw、cd、cpは、オペコードの後に続く1,2,4,6バイトの値です。<br />
jmpやcall命令では、jmp/call先のアドレス値を表しています。</p>
<p>/2とか/3とかっていうのは、ModR/Mバイトのdigit(＝ op codeの一部) 上記マニュアルの2章（特に2.4～2.6)参照を表してます。<br />
op codeの一部なので、当然、命令を判定する際にdigitのチェックが必要です。</p>
<p>digitは/0～/7まであり、ModR/Mバイトの下位3bitに対応します。</p>
<p>例えば32bitの絶対間接nearジャンプのオペコードは下記になります。</p>
<pre>16進表記:  FF /4
2進表記 :  11111111 xxxxx100</pre>
<p>xxxxxの部分の値によって、ジャンプ先のアドレス値として参照するレジスタ/メモリアドレスが変化します。<br />
例えば、eaxレジスタに格納されたアドレス値へジャンプする場合は、xxxxx=11000 です。</p>
<p>こんな感じで命令のop codeを調べて実装したのが上記のGDBスクリプトです。<br />
スクリプトを改造する時の参考にしてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ginriki.net/wd/2008/12/03/48/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

