【发布时间】:2019-03-25 13:41:22
【问题描述】:
我认为正确的方法如下:
const1: dq 1.2345
...
fld const1
但是,我正在使用 Cheat Engine 对游戏进行逆向工程(这样我可以更好地理解它)。它显示以下错误:
谁能告诉我这里出了什么问题?理想情况下,我希望第二个命令是:
fstp dword [esi+ 3C]
但在我这样做之前,我需要将 93.5 值加载到 st(0) 寄存器中。我怎样才能做到这一点?
【问题讨论】:
-
请查阅作弊引擎文档以了解如何初始化浮点常量。如果所有其他方法都失败并且您知道如何初始化数据字节,那么转换您的值。这实际上可能是最简单的解决方案,您可以只用
mov dword [esi+3C], 0; mov dword [esi+40], 0x40576000替换整个东西。内存中没有常量,fld或fstp需要。不清楚为什么你有两个fstp,因为第一个会从堆栈中弹出值。 -
@Jester 很抱歉有歧义,感谢您提出这个问题!我喜欢您为此使用简单的 mov 语句的想法。第一个内存标签“newmem”是我们代码执行的起点。这包括我写的 3 个新行(val、fld 和 fstp)。此时我们的健康存储在寄存器 st(0) 中,然后执行这 3 条指令(以及 1 个标签 + 2 条指令)。一旦我的代码被执行,我希望在 st(0) 和内存地址中有一个很大的值。这之后的所有内容(标签“代码”)都是预先存在的代码(游戏的原始代码)。
-
如果您想在
st0和内存中使用相同的值,您可以使用fld dword [esi+3C]重新加载它。 -
除了语法错误之外,数据和代码彼此相邻。如果执行跳转到
newmem:,则double93.5的字节将被解码为指令。 -
@Jester 这太棒了!您介意将您的两个观点都添加为答案,以便我可以选择它并完成这个问题吗?
标签: assembly x87 cheat-engine