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 expression的vpbroadcastd和
错误MSB3721命令"ml.exe/c/nologo/Zi /Fo"Debug\JAAsm.obj"/ W3/errorReport:prompt /TaJAAsm.asm"退出,代码为1."
是因为我选择了错误的CPU或者没有包含指令集,或者我的VS2015项目设置中有什么东西?或者代码中可能缺少某些内容?
[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像程序的第一个版本那样覆盖内存操作数.两个版本生成的指令都是相同的.
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |