我有以下匯編程式在編譯時給我一個錯誤:
.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
我該如何解決這個問題?
uj5u.com熱心網友回復:
pshufw被認為是SSE(SSE-1) 指令。該指令被認為是 MMX aka MMXEXT的擴展,要使用它,您必須使用該.xmm指令而不是.mmx. 這應該有效:
.686
.xmm
.model flat,c
.code
.xmm也意味著.mmx你不需要兩者。如果您同時使用兩者,則.mmx必須先來.xmm。我不建議同時使用兩者。
作為 SSE-1 的 MMX 擴展添加的其他指令是:
PINSRW將通用暫存器中的 16 位值插入四個元素之一(由立即數指定)
PEXTRW將四個元素之一(由立即數指定)提取到通用暫存器
PMULHU將四個 16 位無符號元素相乘,回傳每個元素的最高有效 16 位
PSHUFW在 8 位立即掩碼的控制下完全洗牌 16 位元素
PMOVMSB將由位元組元素的 MSb 組成的 8 位掩碼移動到通用暫存器
PAVGB位元組元素的平均值 (Di = –(Di Si 1)/2, i = 0…7)
PAVGW16 位元素的平均值 (Di = –(Di Si 1)/2, i = 0…3)
PSADBW16 位元素的差值絕對值之和 (D1,0 = ∑i=0…3 |Di – Si|)
PMINSW最少有符號的 16 位元素
PMINUB最小無符號位元組元素
PMAXSW有符號 16 位元素的最大值
PMAXUB最大無符號位元組元素
您必須.686同時使用(或更高版本).xmmfor.xmm指令才能按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495930.html
下一篇:SUB指令在匯編AVR中如何作業
