ポインタを参照しているアドレスを探す場合、「符号拡張」に注意する必要があります。
たとえば、「ときメモ」の場合、デバッグ文字列は、次のようにテーブルに配置されています。
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-」(共立出版)を参照してください。