<?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; アセンブラ</title>
	<atom:link href="http://www.game-create.com/archives/tag/%e3%82%a2%e3%82%bb%e3%83%b3%e3%83%96%e3%83%a9/feed" rel="self" type="application/rss+xml" />
	<link>http://www.game-create.com</link>
	<description>文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ</description>
	<lastBuildDate>Tue, 08 Jun 2010 01:28:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>strcmp() の戻り値が分かりづらい</title>
		<link>http://www.game-create.com/archives/2333</link>
		<comments>http://www.game-create.com/archives/2333#comments</comments>
		<pubDate>Thu, 15 Oct 2009 08:06:43 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[アセンブラ]]></category>
		<category><![CDATA[ポーランド記法]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=2333</guid>
		<description><![CDATA[strcmp(str1, str2) としたとき、もし str1 < str2 の場合は負数が返りますが、この関数もたまに使うだけなので覚えられません。

アセンブラで大小の比較をする際、引き算をする（ A &#8211 [...]]]></description>
			<content:encoded><![CDATA[<p>strcmp(str1, str2) としたとき、もし str1 < str2 の場合は負数が返りますが、この関数もたまに使うだけなので覚えられません。</p>
<p><span id="more-2333"></span></p>
<p>アセンブラで大小の比較をする際、引き算をする（ A &#8211; B で結果がマイナスなら B の方が大きい、ゼロなら同じ、それ以外なら A の方が大きい）のですが、そのポリシーでもって戻り値としているのでしょうか。ちなみに x86 系の CPU なら cmp 命令とかそんな感じだったと思います。</p>
<p>それとも、「逆ポーランド記法っぽく見えなくもないだろ？」というデザインなのか…</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-inlinetags">&lt;?php
</span><span class="hl-reserved">if </span><span class="hl-brackets">(</span><span class="hl-identifier">strcmp</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">9.0.4</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">detectFlashVersion</span><span class="hl-brackets">())</span><span class="hl-code"> &gt;= </span><span class="hl-number">0</span><span class="hl-brackets">) { </span><span class="hl-comment">// → ( 9.0.4 detectFlashVersion() &gt;= ) っぽい？
  </span><span class="hl-reserved">die</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">Flash プレイヤーは 9.0.4.x 以降を使ってほしいの</span><span class="hl-quotes">&quot;</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}
</span><span class="hl-inlinetags">?&gt;</span></pre></div></div>
<p>どっちも考えにくい。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/2333/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>オブジェクトファイルからオブジェクトコード（機械語）を表示する</title>
		<link>http://www.game-create.com/archives/1262</link>
		<comments>http://www.game-create.com/archives/1262#comments</comments>
		<pubDate>Wed, 28 Jan 2009 16:01:35 +0000</pubDate>
		<dc:creator>Byerkut</dc:creator>
				<category><![CDATA[ゲームプログラミング]]></category>
		<category><![CDATA[アセンブラ]]></category>
		<category><![CDATA[オブジェクトコード]]></category>
		<category><![CDATA[オブジェクトファイル]]></category>
		<category><![CDATA[ネームマングリング]]></category>

		<guid isPermaLink="false">http://www.game-create.com/?p=1262</guid>
		<description><![CDATA[オブジェクトファイルからオブジェクトコード（機械語）を表示するためには dumpbin コマンドを使います。

dumpbin コマンドを使うと、オブジェクトファイルに格納されているオブジェクトコード（機械語）を出力する [...]]]></description>
			<content:encoded><![CDATA[<p>オブジェクトファイルからオブジェクトコード（機械語）を表示するためには dumpbin コマンドを使います。</p>
<p><span id="more-1262"></span></p>
<p>dumpbin コマンドを使うと、オブジェクトファイルに格納されているオブジェクトコード（機械語）を出力することができるようになります。具体的には x86 アセンブラのニーモニックとオペランドが出力されます。</p>
<p>たとえば次のようなソースコードがあったとき…</p>
<div class="hl-surround" ><div class="hl-main"><pre><span class="hl-prepro">#include </span><span class="hl-quotes">&lt;</span><span class="hl-string">cstdio</span><span class="hl-quotes">&gt;</span><span class="hl-prepro">

</span><span class="hl-types">int </span><span class="hl-identifier">someFunction</span><span class="hl-brackets">(</span><span class="hl-types">int </span><span class="hl-identifier">value</span><span class="hl-brackets">)
{
  </span><span class="hl-reserved">return </span><span class="hl-identifier">value</span><span class="hl-code"> + </span><span class="hl-number">10</span><span class="hl-code">;
</span><span class="hl-brackets">}

</span><span class="hl-types">int </span><span class="hl-identifier">main</span><span class="hl-brackets">(</span><span class="hl-types">int </span><span class="hl-identifier">argc</span><span class="hl-code">, </span><span class="hl-types">char</span><span class="hl-code">* </span><span class="hl-identifier">argv</span><span class="hl-brackets">[])
{
  </span><span class="hl-identifier">std</span><span class="hl-code">::</span><span class="hl-identifier">printf</span><span class="hl-brackets">(</span><span class="hl-quotes">&quot;</span><span class="hl-string">Results is [%d]</span><span class="hl-special">\</span><span class="hl-string">n</span><span class="hl-quotes">&quot;</span><span class="hl-code">, </span><span class="hl-identifier">someFunction</span><span class="hl-brackets">(</span><span class="hl-number">123</span><span class="hl-brackets">))</span><span class="hl-code">;

  </span><span class="hl-reserved">return </span><span class="hl-number">0</span><span class="hl-code">;
</span><span class="hl-brackets">}</span></pre></div></div>
<p>以下のように実行すると…</p>
<div class="hl-surround" ><div class="hl-main"><pre>cl /c source.cpp
dumpbin /disasm source.obj</pre></div></div>
<p>結果は以下のようになります。</p>
<div class="hl-surround" style="height:280px;"><div class="hl-main"><pre>Dump of file source.obj

File Type: COFF OBJECT

?someFunction@@YAHH@Z (int __cdecl someFunction(int)):
  00000000: 55                 push        ebp
  00000001: 8B EC              mov         ebp,esp
  00000003: 8B 45 08           mov         eax,dword ptr [ebp+8]
  00000006: 83 C0 0A           add         eax,0Ah
  00000009: 5D                 pop         ebp
  0000000A: C3                 ret
  0000000B: CC                 int         3
  0000000C: CC                 int         3
  0000000D: CC                 int         3
  0000000E: CC                 int         3
  0000000F: CC                 int         3
_main:
  00000010: 55                 push        ebp
  00000011: 8B EC              mov         ebp,esp
  00000013: 6A 7B              push        7Bh
  00000015: E8 00 00 00 00     call        ?someFunction@@YAHH@Z
  0000001A: 83 C4 04           add         esp,4
  0000001D: 50                 push        eax
  0000001E: 68 00 00 00 00     push        offset $SG3907
  00000023: E8 00 00 00 00     call        _printf
  00000028: 83 C4 08           add         esp,8
  0000002B: 33 C0              xor         eax,eax
  0000002D: 5D                 pop         ebp
  0000002E: C3                 ret

  Summary

          84 .debug$S
          45 .drectve
          11 .rdata
          2F .text</pre></div></div>
<p>someFunction() という関数がネームマングリングによって ?someFunction@@YAHH@Z になっていたり、関数の後ろにパディングがあったりしていることが見て取れます。 printf() 関数のフォーマット部は $SG3907 に定数として配置されているようです。</p>
<p>最適化によって自分が作ったコードがどう変化するのか知りたいときなどには思い出してみてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.game-create.com/archives/1262/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

