0

想象一下,我们有一个通常的指令,比如这个

mov [eax], ebx

eax 包含一些我们想要写入的地址。

这个想法是编写一个 ac 程序,告诉你哪个地址包含指令,如果我们已经知道它将写入的地址。

真正的问题:使用免费的索尼 pspsdk 编写 ac 程序来完成同样的事情。

psp 使用 MIPS III / IV,指令看起来像

sw a0 $00(t0)
##which literally spells out store register a0 at offset t0 + 0 bytes. where t0 would
## contain something like 0x08800000

免责声明:知道如何在 Windows 上执行此操作仍然很有用,因此如果有人只知道如何在 Windows 甚至 osx 上执行此操作,那仍然会受到赞赏,因为它可以提供有关类似编程实践的相关信息来完成此特定任务.

4

1 回答 1

1

拦截写入特定地址的指令不是程序中的正常活动。

这是一些调试器提供的功能。调试器至少可以通过三种方式做到这一点:

  • 调试器可以检查程序代码并找到特定指令写入特定地址的位置。这实际上是一个非常复杂的活动,需要解释指令。通常,调试器不能完全做到这一点。因为一般来说这样做相当于完全按照计算机处理器的方式解释和执行程序,而在软件中这样做是很慢的。相反,调试器可能会计划部分程序执行并放入断点在无法轻松继续的地方,例如在取决于调试器不准备计算的值的分支指令处。断点是中断程序执行的特殊指令,在这种情况下,会导致操作系统将控制权转移给调试器。此时,调试器删除断点,请求单步指令(处理器执行单条指令,然后立即中断程序执行),检查结果,然后继续。
  • 调试器可以将包含所需地址的内存页标记为不可访问。然后,每当程序访问该内存时,硬件就会中断程序执行,操作系统会将控制权转移给调试器。调试器检查导致中断的指令。如果指令正在访问目标地址,则调试器会对其进行操作。如果不是,则调试器将内存保护更改为允许访问,请求指令单步执行,将内存保护更改为禁止访问,并恢复程序等待下一次中断。(调试器可能只是模拟它,而不是单步执行指令,因为这可能会避免两次更改内存保护,这可能会很昂贵。)
  • 某些计算机处理器型号具有支持此类调试功能的功能。调试器可以请求监视内存的一部分,以便硬件在访问特定地址时中断程序执行,而不是在访问整个内存页面的任何部分时。

我无法与您使用的 Sony 平台通话。您必须检查其文档或询问其他人有关此类功能的可用性。由于这是调试器最常使用的功能,因此调查有关调试的文档可能是确定系统是否支持此类功能的一种方式。

于 2020-01-23T12:30:56.083 回答