问题:我写了这样的东西(在proc内部):
.CODE
myProc PROC
vpmovsxbd ymm0, qword ptr [rdx] ; rdx is ptr to array of 8 bytes
vcvtdqps ymm0, ymm0
ret
myProc ENDP
和 masminvalid instruction operands
第一次和syntax error : ymm0
第二次抱怨。我正在使用 VS15 社区版为 x64 编译。
问题:我写了这样的东西(在proc内部):
.CODE
myProc PROC
vpmovsxbd ymm0, qword ptr [rdx] ; rdx is ptr to array of 8 bytes
vcvtdqps ymm0, ymm0
ret
myProc ENDP
和 masminvalid instruction operands
第一次和syntax error : ymm0
第二次抱怨。我正在使用 VS15 社区版为 x64 编译。
第一个错误看起来像是 MASM 中的问题——它只是拒绝接受这种形式的指令(即使英特尔文档说它存在)。
我能找到的最接近的解决方法是:
vmovdqu xmm0, xmmword ptr[rdx]
vpmovsxbd ymm0, xmm0
...但是相比之下,这显然有点笨拙(因为它破坏了一些 xmm 寄存器,并且显然需要解码指令指令等)另一方面,它通常不会对速度产生太大影响(因为在任何情况下,速度通常都取决于内存读取时间)。
作为旁注,MS 编译器似乎有大致相同的问题。使用_mm256_cvtepi8_epi32
内部函数的快速检查(英特尔称应该生成 a vpmovsxbd
)表明 Microsoft 编译器生成它的方式类似于上面的序列 - avmovdqu
后跟 a vpmovsxbd
。
对于第二个,您显然想要vcvtdq2ps
,但忽略了2
. 由于汇编器没有将其识别为指令,因此它对那行应该是什么感到困惑。
如果您真的关心,它可能会尝试将其解析为如下声明:
my_var dd ?
所以,第一部分(the vcvtdqps
)似乎是合法的,但作为一个符号,而不是一个指令。然后它发现ymm0
而不是像db
, dw
, dq
(etc.) 并意识到有一个错误,因为寄存器名称不是一个合法的东西。