表达式AND命令中缺少运算符退出代码1

Jar*_*k N 1 x86 assembly masm avx

我有以下代码和一个简单的汇编程序

.686p
.model flat, stdcall 
.mmx
.xmm


.code 
DataString DB 'AGIJKSZ', 0FFH ;

MyProc1 proc 

    vpbroadcastd ymm0, [4 bytes of JJJJ]
    vpcmpeqb ymm0, ymm0, [DataString] 
    vpmovmskb eax, ymm0 
    tzcnt eax, eax       
    ret        
MyProc1 endp 

end
Run Code Online (Sandbox Code Playgroud)

然而,当我尝试编译它,我得到Missing operator in expressionvpbroadcastd

错误MSB3721命令"ml.exe/c/nologo/Zi /Fo"Debug\JAAsm.obj"/ W3/errorReport:prompt /TaJAAsm.asm"退出,代码为1."

是因为我选择了错误的CPU或者没有包含指令集,或者我的VS2015项目设置中有什么东西?或者代码中可能缺少某些内容?

Mic*_*tch 5

[4 bytes of JJJJ]是有效的语法,似乎有人建议你要创建一个内存操作数,指向每个包含字母的4个字节J.我认为目的是建议做类似的事情:

.686p
.model flat, stdcall 
.mmx
.xmm

.data
DataString DB 'AGIJKSZ', 0FFH
JMask DB 'JJJJ'

.code 
MyProc1 proc
    vpbroadcastd ymm0, dword ptr [JMask]
    vpcmpeqb ymm0, ymm0, [DataString] 
    vpmovmskb eax, ymm0 
    tzcnt eax, eax       
    ret        
MyProc1 endp 

end
Run Code Online (Sandbox Code Playgroud)

我创建了一个4字节的字符串JMask,然后将其用作vpbroadcastd指令的内存操作数.或者,您可以使用此等效代码:

.686p
.model flat, stdcall 
.mmx
.xmm

.data
DataString DB 'AGIJKSZ', 0FFH
JMask DD 'JJJJ'

.code 
MyProc1 proc
    vpbroadcastd ymm0, [JMask]
    vpcmpeqb ymm0, ymm0, [DataString] 
    vpmovmskb eax, ymm0 
    tzcnt eax, eax       
    ret        
MyProc1 endp 

end
Run Code Online (Sandbox Code Playgroud)

此版本创建Jmask为包含4个字节的DWORD JJJJ.这样做的好处是不必dword ptr像程序的第一个版本那样覆盖内存操作数.两个版本生成的指令都是相同的.