如何使用 MULSS 将 SSE 浮点数与硬编码值相乘?

逆向工程 部件 漂浮
2021-06-15 23:54:50

我在游戏中有以下代码行:

movss xmm0,[eax+000000F0]

它基本上将当前速度类别的浮点速度加载到 XMM0 寄存器中。我已经跳转到一个空代码部分以获得更多空间,因为我现在想在加载后将此速度乘以硬编码值 2。可悲的是,像这样简单的想法是行不通的:

movss xmm0,[eax+000000F0]
mulss xmm0,2

我不能简单地将 XMM 寄存器与整数或浮点立即数相乘。我读到我只能与另一个 XMM 寄存器相乘。但话又说回来,我无法将现有的 XMM 寄存器推送和弹出到堆栈中,以暂时滥用它进行该操作。

我将如何创建这样一个简单的乘法运算?

1个回答

尽管您确实不能mulss像您指出的那样使用立即数,但您可以将 32 位偏移量作为mulss第二个操作数传递

将源操作数(第二个操作数)中的低位单精度浮点值乘以目标操作数(第一个操作数)中的低位单精度浮点值,并将单精度浮点结果存储到目标中操作数。源操作数可以是 XMM 寄存器或 32 位内存位置。目标操作数是 XMM 寄存器。目的操作数的三个高位双字保持不变。

如果代码未重新定位,则您可以只指向您控制的任何偏移量。如果是,您可以在 64 位模式下简单地使用 'lea' 或call $+5 / pop在 x86 中执行此操作

我会假设 x86,因为它使它有点复杂。该补丁应如下所示(未经测试):

    push edx
    call next
next:
    pop edx
    movss xmm0,[eax+000000F0]
    mulss xmm0,[edx+float-next]
    pop edx
    <return to previous location>

float:
    <float as 32bit data>

可能有更好的解决方案,但我没有任何反应。