再次得到指点后重新试了一下,这次果然成功找到精神所在的ROM地址了。其实在银河大指点之前,本人已经通过其它方法找到相关的数据了,虽然结果有了,但必竟不是用逆向追踪的方法实现的,对进一步了解Snes9x Debug的操作与熟悉65816的运行机制没有多大帮助,算是另一种形式的“歪门邪道”吧。
这次成功通过Debug手段找到精神地址,说起来突破口居然是主楼最后那个关于如何分辨8位、16位的题外话,真是太让本人想不到了。仅就这一点而言,不得不让人承认,不管在哪个群体中,总有一些人在想法等各方面总是要异于常人的,而类似这种“天份”的东西很可能是后天努力也难以追上的。
经过这次的事件后,本人可谓是收获良多,也有动力与信心继续深入研究下去了,真是非常感谢银河大的提醒。在此还想就之前找精神地址过程中所遇到的几个小问题继续请教一下:
断下来的代码中,P寄存器里显示的内容,如:P:envMXdizC,这里的字母大小写应该分别表示1和0吧(例如M大写则表示16位,小写表示8位)?点击“Edit Registers”按钮后,各项Flags又该怎么看?不钩表示0,钩选表示1?再有就是,点击此按钮所显示的内容是基于当时的断点吗?
此外,在逆向追踪时,总要不断的查看当前断点地址上面的代码,在Snes9x这个调试器中,除了点击“Disassemble”反汇编按钮来获得外,还有没有更好的方法呢?不知为何,在本人的电脑上,使用此按钮来获取代码时经常会失去响应。与上一条有些关联的是,所获取代码中显示的寄存器或内存地址的值是可以参考的吗?
最后一点同样是在获取反汇编代码后,要某些需要计算地址的地方,调试器会贴心的附上结果。比如:LDA [$20],y[$CB:C233],而最右边这个中括号里的内容该如何正确理解呢?除了知道[7E:XXXX]与[7F:XXXX]是查看RAM,[CX:XXXX]是查看ROM外,其它像[00:000X]、[80:XXXX]、[82:XXXX]与没有前缀只有4位数值的[XXXX]又该怎么理解以及到调试器中查看呢?
最后一条可能与65816的寻址方式有关,而这方面正是本人很大一块短板,曾经努力研究了很长一段时间,就像前说的,天资所限,总是没办法很好的融会贯通,希望这次能在银河大的指点下,弥补这方面的遗憾吧。这里顺便附上几种8086的寻址方式,这是本人以前为了更好地了解65816的寻址方式所列出来的,也算是一点心得吧。
8086的六种寻址方式:
1.立即寻址
mov eax,65h
作用:通常用于赋值。
2.直接寻址
mov eax,[12346578H]
作用:通常用于处理变量。
3.寄存器寻址
mov eax,[ecx]
作用:地址在寄存器中。
4.寄存器相对寻址
mov eax,[ecx+34H]
作用:常用于访问数组或结构。
5.基址加变址寻址
mov eax,[ebp+esi] //注意EBP与ESI寄存器的定义及原始作用。
作用:常用于访问数组。
6.相对基址加变址寻址
mov eax,[ebx+edi-10H]
作用:常用于访问结构。