CODE SQUARE -ゲーム改造コード-

たぶん更新しないゲーム改造コードのページ - 改造コードの置き場 -



アクセスアップ・SEO対策・検索エンジン登録

« ジャンプテーブルを使った分岐 | メイン | デバッグモードサーチ法 フラグ型編 »

符号拡張

ポインタを参照しているアドレスを探す場合、「符号拡張」に注意する必要があります。
 たとえば、「ときメモ」の場合、デバッグ文字列は、次のようにテーブルに配置されています。

 8013e740 00 00 00 00 14 cd 13 80 1c cd 13 80 24 cd 13 80 ・・・・・ヘ・?・ヘ・?$ヘ・?
 8013e750 28 cd 13 80 30 cd 13 80 34 cd 13 80 3c cd 13 80 (ヘ・?0ヘ・?4ヘ・?<ヘ・?
 8013e760 40 cd 13 80 44 cd 13 80 4c cd 13 80 54 cd 13 80 @ヘ・?Dヘ・?Lヘ・?Tヘ・?
 8013e770 58 cd 13 80 60 cd 13 80 68 cd 13 80 74 cd 13 80 Xヘ・?`ヘ・?hヘ・?tヘ・?
 8013e780 7c cd 13 80 ac cd 13 80 b8 cd 13 80 c0 cd 13 80 |ヘ・?ャヘ・?クヘ・?タヘ・?

 このテーブルのポインタを参照しているところをサーチみると、次のルーチンがサーチできます。

 8013a824 or a0,zero,zero
 8013a828 lui s2,#$8014
 8013a82c addiu s2,s2,#$e744
 8013a830 addiu s1,zero,#$ffa0
 8013a834 lw a0,$0000(s2)
 8013a838 addiu a1,zero,#$ffe0
 8013a83c jal $8004b338

 逆アセンブルのソースを見ると、ポインタのアドレスは「8014e777」になります。

 メモリダンプのポインタのアドレスとは、「+10000H」のズレがあるので、違うルーチンであると判断しがちですが、実際には、このルーチンがポインタのロードしているルーチンです。

 さて、なぜ「+1000H」のズレがあるかというと、下位16ビットの値が「負」(8000h以上)になっているためです。

 16ビットの値は、内部的に32ビット値として扱われます。addiuなどの命令では、演算時に「符号拡張」がという処理が行われます。

 たとえば、「addiu s2,s2,#$e744」という命令の場合、演算時に「e744H」は符号拡張されるので、内部的には「s2=s2+ffffe74h(-6332)」と処理されます。結果、S2は「8013e744h」となるわけです。

 単純に、下位16ビットが負になった場合、上位16ビットに1を加えて、上位アドレスを「補正」すると覚えると良いでしょう。

※「符号拡張」の詳しい内容については、「mips RISCアーキテクチャ-R2000/R3000-」(共立出版)を参照してください。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Contact Us | ©2006 G'sSQUARE-G-Poket.com | Powered byMovable Type 3.21-ja