VCVTSD2USI在 16位模式下的反汇编:它能写入一个16位寄存器吗?
英特尔指令 VCVTSD2USI(以及一些类似的带有GPR的 AVG512指令)被编码为
EVEX.LLIG.F2.0F.W0 79 /r VCVTSD2USI r32, xmm1/m64{er},
例如 VCVTSD2USI EAX,XMM0 会被组装为 62 F1 7F 08 79 C0。
EVEX.Wide位指定通用寄存器的宽度为32位或64位(EAX或 RAX)。
我想知道在 16位模式(代码段中D 位为0 的情况下)将使用哪个GPR。是EAX还是AX?
英特尔的文档表示同时支持64/32位模式,但对16位模式并没有涉及。我正在编写一个反汇编器,需要它能同时应对这三种模式。
NDISASM 2.15在 16位模式下将 62 F4 7F 08 79 C0 反汇编为 vcvtsd2usi eax,xmm0,但NetWide反汇编器存在许多错误,因此不可信。我本来想写一个测试示例来通过实测验证,但我没有可用的AVX512F硬件。
解决方案
我拼凑了一个小测试来看看到底是哪一个。
Bochs将 62 F1 7F 08 79 C0 解析为 VCVTSD2USI EAX, XMM0,并据此进行模拟。我也用 qemu-system-i386 -enable-kvm -cpu max 进行了验证,希望能够在我的物理Ryzen CPU上得到相同的结果。因此包括文档在内的一切都表示它是 EAX。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。