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

时间:2018-03-13 21:37:14

标签: assembly x86 masm simd 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

然而,当我尝试编译它时,我Missing operator in expression上的vpbroadcastd

  

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

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

1 个答案:

答案 0 :(得分: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

我创建了一个名为JMask的4字节字符串,然后将其用作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

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