我有以下汇编程序,在编译时会出现错误:
.686
.mmx
.model flat,c
.code
MmxAdd proc
push ebp
mov ebp,esp
mov eax, [ebp+24]
cmp eax, AddOpTableCount
jae BadAddOp
movq mm0,[ebp+8]
movq mm1,[ebp+16]
jmp [AddOpTable+eax*4]
MmxPaddb:
paddb mm0,mm1
jmp SaveResult
MmxPaddsb:
paddsb mm0,mm1
jmp SaveResult
MmxPaddusb:
paddusb mm0,mm1
jmp SaveResult
MmxPaddw:
paddw mm0,mm1
jmp SaveResult
MmxPaddsw:
paddsw mm0,mm1
jmp SaveResult
MmxPaddusw:
paddusw mm0,mm1
jmp SaveResult
MmxPaddd:
paddd mm0,mm1
jmp SaveResult
BadAddOp:
pxor mm0,mm0
SaveResult:
movd eax,mm0
pshufw mm2,mm0, 01001110b
movd edx,mm2
emms
pop ebp
ret
align 4
AddOpTable:
dword MmxPaddb, MmxPaddsb, MmxPaddusb
dword MmxPaddw, MmxPaddsw, MmxPaddusw
dword MmxPaddd
AddOpTableCount equ ($-AddOpTable) / size dword
MmxAdd endp
end但是,每次我尝试用JWASM编译它时,我都会得到以下错误:
Mmx_Addition.asm(51):错误A2030:当前CPU模式下不接受的指令或寄存器
这是给我错误的指示:
pshufw mm2,mm0, 01001110b我怎么才能解决这个问题?
发布于 2022-06-19 19:31:58
pshufw被认为是SSE(SSE-1)指令。该指令被认为是MMX (即MMXEXT )的一个扩展,要使用它,您必须使用.xmm指令而不是.mmx来启用SSE。这应该是可行的:
.686
.xmm
.model flat,c
.code.xmm还暗示了.mmx,因此您不需要两者都使用。如果同时使用这两种方法,那么.mmx必须先于.xmm。我不建议两者兼用。
作为带有SSE-1的MMX扩展添加的其他指令是:
PINSRW
将普通寄存器中的16位值插入四个元素中的一个(由即时指定)PEXTRW
将四个元素中的一个(由即时指定)提取到普通寄存器中PMULHU
乘四个16位无符号元素,返回每个元素中最重要的16位。PSHUFW
8位即时掩码控制下16位元件的完全洗牌PMOVMSB
将由字节元素的MSbs组成的8位掩码移到通用寄存器中。PAVGB
字节元素平均值(Di =-(Di+ Si + 1)/2,i= 0…)7)PAVGW
16位元素的平均值(Di =-(Di+ Si + 1)/2,i= 0…)3)PSADBW
16位元素差的绝对值之和(D1,0 =∑i=0…)3\x{e76f}PMINSW
有符号16位元素的最小值PMINUB
无符号字节元素的最小值PMAXSW
有符号16位元素的最大值PMAXUB
无符号字节元素的最大值您必须将.686 (或更高版本)与.xmm for .xmm指令一起使用,才能按预期工作。
https://stackoverflow.com/questions/72678731
复制相似问题