【问题标题】:How can I load a constant value into the floating point register st0?如何将常量值加载到浮点寄存器 st0 中?
【发布时间】: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 替换整个东西。内存中没有常量,fldfstp 需要。不清楚为什么你有两个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


【解决方案1】:

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

"这条指令无法编译" 您将数据放在代码部分中。在 newmem 块之外和单独的内存块内定义变量。您正在尝试使用“val:”定义一个内存块,但您尚未分配该内存。如果不注册符号,您也无法引用它。

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

您要将浮点数推送到 FPU 堆栈的指令是这样编写的: fld dword ptr [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]

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

【讨论】:

  • @PeterCordes 问题顶部的小 sn-p 是一些指南的随机复制和粘贴。我发布的代码是 Cheat Engine 脚本语法。作弊引擎不接受“fldl”,试了一下
  • @PeterCordes 我相信这是一个错字。真实代码没有fldl,如截图所示。很抱歉造成混乱。我现在已经更新了。
  • @Mugen:这就是为什么您总是将代码复制/粘贴到 SO 中以解决调试问题:/ 您的示例仍然缺少方括号或大小说明符。这在 一些 汇编器中可以工作,如 MASM,但在其他如 NASM 或 GAS 中无效,其中声明并不暗示使用它的其他指令的大小。同样,IDK 您的示例是否在屏幕截图之外甚至接近有效的作弊引擎语法。
  • @PeterCordes 我了解您正在尝试提供帮助,但我觉得您已经表达了关于“复制粘贴”的观点。是的,我确实总是执行复制/粘贴。在大多数情况下,我喜欢复制/粘贴。但是,没有可复制/粘贴的代码。如果有的话,我只会复制/粘贴解决方案。我不正确地了解浮点汇编语法,我还在学习它。这个例子的重点是让我了解我想要实现的目标。如果你注意到还有省略号。代码赢了只要省略号也存在,就不会执行,不是吗?它就在那里......
  • ... 将焦点转移到我需要帮助的区域。我发现你的行为接近欺凌。虽然我正在尝试了解浮点汇编语言的基础知识,但您希望我了解 MASM、NASM 和 GAS。我是来学习的,但我当然不欣赏你反复锤击我的方式,因为我不知道我提出问题的那个领域。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
相关资源
最近更新 更多