将 `movss xmm0, cs:dword_5B27420` 替换为 `movss xmm0, immediate`
Replace `movss xmm0, cs:dword_5B27420` with `movss xmm0, immediate`
我在 Ida Pro 中有一个 linux.so 文件,我有以下指令:
movss xmm0, cs:dword_5B27420
是否可以使用与该指令相同或更少的字节数将固定值移动到 xmm0
?
指令字节为:
F3 0F 10 05 C8 BB A 00
我想做类似的事情:
movss xmm0, 0.3
字节数不多;如果这里没有空间,则必须跳到其他地方然后返回,或者只是更改 RIP-relative 地址以从其他地方加载不同的常量。 (例如,从两个函数之间进行填充,或者在 .rodata 或 .data 中保留 space,如果有的话。)
XMM 寄存器没有 mov-immediate,mov eax, __?float32?__(0.3)
(5 字节)/movd xmm0, eax
(4 字节)将占用更多字节。 (整数值 是给定 FP 常量的 bit-pattern。某些汇编程序可能允许 mov eax, 0.3
,以防万一。)
除立即数以外的构造 FP 常量的方法包括 pcmpeqd xmm0,xmm0
(4 个字节),然后使用 all-ones 位模式进行移位或做其他事情(如 pabsd
)。但这至少是 2 条指令,除非你想要一个 NaN。 (参见 Agner Fog's optimizing asm guide, and )
0.3f
不是一个简单的常量,您甚至可以在 0xffffffff
的 3 条指令中实现左右移位,这与 1.0f
不同。 (但这仍然是三个指令,每个 4 和 5 个字节来构造 set1(1.0f))
cmpps
是 SSE1 non-scalar,所以它的操作码比 pcmpeqd
小(没有强制性前缀,只有 0f c2
),但总体上并没有更小,因为比较谓词需要立即数。
我在 Ida Pro 中有一个 linux.so 文件,我有以下指令:
movss xmm0, cs:dword_5B27420
是否可以使用与该指令相同或更少的字节数将固定值移动到 xmm0
?
指令字节为:
F3 0F 10 05 C8 BB A 00
我想做类似的事情:
movss xmm0, 0.3
字节数不多;如果这里没有空间,则必须跳到其他地方然后返回,或者只是更改 RIP-relative 地址以从其他地方加载不同的常量。 (例如,从两个函数之间进行填充,或者在 .rodata 或 .data 中保留 space,如果有的话。)
XMM 寄存器没有 mov-immediate,mov eax, __?float32?__(0.3)
(5 字节)/movd xmm0, eax
(4 字节)将占用更多字节。 (整数值 mov eax, 0.3
,以防万一。)
除立即数以外的构造 FP 常量的方法包括 pcmpeqd xmm0,xmm0
(4 个字节),然后使用 all-ones 位模式进行移位或做其他事情(如 pabsd
)。但这至少是 2 条指令,除非你想要一个 NaN。 (参见 Agner Fog's optimizing asm guide, and
0.3f
不是一个简单的常量,您甚至可以在 0xffffffff
的 3 条指令中实现左右移位,这与 1.0f
不同。 (但这仍然是三个指令,每个 4 和 5 个字节来构造 set1(1.0f))
cmpps
是 SSE1 non-scalar,所以它的操作码比 pcmpeqd
小(没有强制性前缀,只有 0f c2
),但总体上并没有更小,因为比较谓词需要立即数。