我有以下代码和一个简单的汇编程序
.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项目设置中有什么东西?或者代码中可能缺少某些内容?
答案 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
覆盖内存操作数。两个版本的生成说明都是相同的。