Assembly 如何将常量值加载到浮点寄存器st0中?

Assembly 如何将常量值加载到浮点寄存器st0中?,assembly,x87,cheat-engine,Assembly,X87,Cheat Engine,我认为正确的方法是: const1: dq 1.2345 ... fld const1 然而,我正在使用作弊引擎对游戏进行反向工程(这样我就能更好地理解它)。并显示以下错误: 谁能告诉我这里怎么了?理想情况下,我希望第二个命令是: fstp dword [esi+ 3C] 但在此之前,我需要将93.5的值加载到st(0)寄存器中。如何实现这一点?有一系列与语法相关的错误导致了您的问题 “无法编译此指令” 您正在将数据放入代码部分。在newmem块外部和单独内存块内

我认为正确的方法是:

const1:     dq  1.2345
...
     fld    const1
然而,我正在使用作弊引擎对游戏进行反向工程(这样我就能更好地理解它)。并显示以下错误:

谁能告诉我这里怎么了?理想情况下,我希望第二个命令是:

fstp dword [esi+ 3C]

但在此之前,我需要将93.5的值加载到st(0)寄存器中。如何实现这一点?

有一系列与语法相关的错误导致了您的问题

“无法编译此指令” 您正在将数据放入代码部分。在newmem块外部和单独内存块内部定义变量。您试图用“val:”定义内存块,但尚未分配该内存。如果不注册符号,也不能引用它

要定义一个常规浮点,您需要使用一个4字节的变量,而不是一个8字节的变量,因此您需要使用“dd”而不是“dq”,其次,您需要将它“强制转换”为浮点

要将浮点值推送到FPU堆栈上的指令如下所示: 德沃德飞行试验室[val]

如前所述创建注入模板,然后在顶部插入此代码并继续您所做的工作,它包含了我在答案中指出的所有内容,并且我测试了它的工作:

alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)

alloc(val,8)

val:
dd (float)93.5

registersymbol(val)

newmem:
fld dword ptr [val]

请记住,您将需要使用生成的模板的其余部分,这只是修复问题中出现的错误的代码。

有一系列与语法相关的错误导致您的问题

“无法编译此指令” 您正在将数据放入代码部分。在newmem块外部和单独内存块内部定义变量。您试图用“val:”定义内存块,但尚未分配该内存。如果不注册符号,也不能引用它

要定义一个常规浮点,您需要使用一个4字节的变量,而不是一个8字节的变量,因此您需要使用“dd”而不是“dq”,其次,您需要将它“强制转换”为浮点

要将浮点值推送到FPU堆栈上的指令如下所示: 德沃德飞行试验室[val]

如前所述创建注入模板,然后在顶部插入此代码并继续您所做的工作,它包含了我在答案中指出的所有内容,并且我测试了它的工作:

alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)

alloc(val,8)

val:
dd (float)93.5

registersymbol(val)

newmem:
fld dword ptr [val]

请记住,您将需要使用生成的模板的其余部分,这只是修复问题中出现的错误的代码。

有关如何初始化浮点常量的信息,请参阅作弊引擎文档。如果所有其他操作都失败,并且您知道如何初始化数据字节,那么请转换您的值。事实上,这可能是最简单的解决方案,你可以用
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:
,则
double
93.5的字节将被解码为指令。@Jester这太棒了!您是否介意添加两个点作为答案,以便我可以选择它并完成此问题?请参阅有关如何初始化浮点常量的作弊引擎文档。如果所有其他操作都失败,并且您知道如何初始化数据字节,那么请转换您的值。事实上,这可能是最简单的解决方案,你可以用
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:
,则
double
93.5的字节将被解码为指令。@Jester这太棒了!你介意把你的两个观点都加上作为答案,这样我就可以选择它并完成这个问题吗?@PeterCordes问题顶部的那个小片段是某个指南的随机复制和粘贴。我发布的代码是作弊引擎脚本语法。作弊引擎不接受“fldl”,只是尝试了一下it@PeterCordes我相信那是个打字错误。真正的代码没有fldl,如屏幕截图所示。很抱歉搞混了。我现在已经更新了。@Mugen:这就是为什么您总是将代码复制/粘贴到SO中以解决调试问题的原因:/您的示例仍然缺少方括号或大小说明符