Hi
Wer in Assembler mit den SSE Befehlen arbeitet, kommt um die shuffle-Befehle nicht herum.
Damit kann man die Werte im SSE-Register gewissermaßen vertauschen.
Um das gewünschte Resultat zu erhalten, muss man den korrekten Hex-Code angeben - und diesen herauszufinden kostete mich immer etwas Zeit!
Ganz zu schweigen von der Zeit, die ich vertrödelt hab, nachdem ich wegen eines falschen Hexwertes den restlichen ASM-Code nach Fehlern absuchte
Deswegen hab ich mir dieses Helferprogramm geschrieben, welches die Verwendung von pshufd, shufps, shufpd, pshuflw und pshufhw erleichtern und auch grafisch darstellen soll:
Spoiler anzeigen
#include <EditConstants.au3>
#include <GuiComboBoxEx.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
Opt("MustDeclareVars", 1)
Global $iWidth = 1200
Global $iHeight = 500
Global $iYPosXMM = 150
Global $iYPosDst = 420
Global $iYPosDstCB = $iYPosDst + 30
Global $iGfxH = $iYPosDst - $iYPosXMM - 50
Global $hGui = GUICreate("SSE_Shuffle Explorer by Eukalyptus http://www.autoit.de", $iWidth, $iHeight)
GUISetOnEvent(-3, "_Exit")
GUICtrlCreateLabel("ShuffleMode:", 20, 22, 80, 20)
Global $cRB_PSHUFD = GUICtrlCreateRadio("PSHUFD", 110, 20, 100, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetOnEvent(-1, "_SetMode")
Global $cRB_SHUFPS = GUICtrlCreateRadio("SHUFPS", 210, 20, 100, 20)
GUICtrlSetOnEvent(-1, "_SetMode")
Global $cRB_SHUFPD = GUICtrlCreateRadio("SHUFPD", 310, 20, 100, 20)
GUICtrlSetOnEvent(-1, "_SetMode")
Global $cRB_PSHUFLW = GUICtrlCreateRadio("PSHUFLW", 410, 20, 100, 20)
GUICtrlSetOnEvent(-1, "_SetMode")
Global $cRB_PSHUFHW = GUICtrlCreateRadio("PSHUFHW", 510, 20, 100, 20)
GUICtrlSetOnEvent(-1, "_SetMode")
GUICtrlCreateLabel("Bin:", 20, 52, 80, 20)
Global $cIP_Bin = GUICtrlCreateInput("00000000", 110, 50, 100, 20)
GUICtrlCreateLabel("Hex:", 20, 82, 80, 20)
Global $cIP_Hex = GUICtrlCreateInput("0x00", 110, 80, 100, 20)
Global $cGfx = GUICtrlCreateGraphic(0, $iYPosXMM + 25, $iWidth, $iGfxH)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Global $aXmm0[8][3], $aXmm1[8][3], $aDst[8][3], $aDstCB[8], $aInf[4]
[/autoit] [autoit][/autoit] [autoit]$aInf[0] = GUICtrlCreateLabel("Xmm0", 0, 0, 20, 20, BitOR(0x01, 0x0200))
GUICtrlSetBkColor(-1, 0x440000)
GUICtrlSetColor(-1, 0xFFFFFF)
$aInf[1] = GUICtrlCreateLabel("Xmm1", 0, 0, 20, 20, BitOR(0x01, 0x0200))
GUICtrlSetBkColor(-1, 0x004400)
GUICtrlSetColor(-1, 0xFFFFFF)
$aInf[2] = GUICtrlCreateLabel("Xmm0", $iWidth / 2 - (($iWidth - 20) / 4) + 2, $iYPosDst - 20, (($iWidth - 20) / 4) * 2 - 4, 14, BitOR(0x01, 0x0200))
GUICtrlSetBkColor(-1, 0x000044)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlCreateLabel("", $iWidth / 2 - 200, 80, 400, 28)
GUICtrlSetBkColor(-1, 0x004400)
$aInf[3] = GUICtrlCreateLabel("", $iWidth / 2 - 200+1, 80+1, 400-2, 28-2, BitOR(0x01, 0x0200))
GUICtrlSetFont(-1, 16)
GUICtrlSetBkColor(-1, 0xDDEEFF)
GUICtrlSetColor(-1, 0x000044)
For $i = 0 To 7
$aXmm0[$i][0] = GUICtrlCreateLabel("DST_" & $i, 0, 0, 20, 20, BitOR(0x01, 0x0200))
GUICtrlSetBkColor(-1, 0x880000)
GUICtrlSetColor(-1, 0xFFFFFF)
$aXmm1[$i][0] = GUICtrlCreateLabel("SRC_" & $i, 0, 0, 20, 20, BitOR(0x01, 0x0200))
GUICtrlSetBkColor(-1, 0x008800)
GUICtrlSetColor(-1, 0xFFFFFF)
$aDst[$i][0] = GUICtrlCreateLabel($i, 0, 0, 20, 20, BitOR(0x01, 0x0200))
GUICtrlSetBkColor(-1, 0x000088)
GUICtrlSetColor(-1, 0xFFFFFF)
$aDstCB[$i] = GUICtrlCreateCombo("", 0, 0, 20, 20)
GUICtrlSetOnEvent(-1, "_SetSrc")
Next
_SetMode()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
[/autoit] [autoit][/autoit] [autoit]GUISetState()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While Sleep(10)
WEnd
Func _SetSrc()
Local $iOff = 0
If GUICtrlRead($cRB_PSHUFHW) = 1 Then $iOff = 4
For $i = 0 To 3
If @GUI_CtrlId = $aDstCB[$i + $iOff] Then
Local $aRegExp = StringRegExp(GUICtrlRead($aDstCB[$i + $iOff]), "\((\d+)\)", 3)
If Not IsArray($aRegExp) Then ContinueLoop
If GUICtrlRead($cRB_SHUFPD) = 1 Then
Local $iHex = GUICtrlRead($cIP_Hex)
If $aRegExp[0] = "00" Then
If BitAND($iHex, $i + 1) Then $iHex = BitXOR($iHex, $i + 1)
Else
$iHex = BitOR($iHex, $i + 1)
EndIf
GUICtrlSetData($cIP_Hex, "0x" & Hex(BitAND($iHex, 3), 2))
Else
Local $sBin = StringFormat("%08s", GUICtrlRead($cIP_Bin))
Switch $i
Case 0
$sBin = StringLeft($sBin, 6) & $aRegExp[0]
Case 1
$sBin = StringLeft($sBin, 4) & $aRegExp[0] & StringRight($sBin, 2)
Case 2
$sBin = StringLeft($sBin, 2) & $aRegExp[0] & StringRight($sBin, 4)
Case 3
$sBin = $aRegExp[0] & StringRight($sBin, 6)
EndSwitch
GUICtrlSetData($cIP_Bin, $sBin)
EndIf
ExitLoop
EndIf
Next
EndFunc ;==>_SetSrc
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _DrawCon()
GUICtrlDelete($cGfx)
$cGfx = GUICtrlCreateGraphic(0, $iYPosXMM + 25, $iWidth, $iGfxH)
GUICtrlSetGraphic($cGfx, $GUI_GR_PENSIZE, 3)
GUICtrlSetGraphic($cGfx, $GUI_GR_COLOR, 0x000066)
Local $aRegExp
[/autoit] [autoit][/autoit] [autoit]For $i = 0 To 7
If BitAND(GUICtrlGetState($aDstCB[$i]), $GUI_HIDE) Then ContinueLoop
GUICtrlSetGraphic($cGfx, $GUI_GR_MOVE, $aDst[$i][1] + $aDst[$i][2] / 2, $iGfxH)
$aRegExp = StringRegExp(GUICtrlRead($aDstCB[$i]), "\)\h+(\w+)_(\d)", 3)
If UBound($aRegExp) < 2 Then ContinueLoop
Switch $aRegExp[0]
Case "SRC"
GUICtrlSetGraphic($cGfx, $GUI_GR_LINE, $aXmm1[$aRegExp[1]][1] + $aXmm1[$aRegExp[1]][2] / 2, 0)
GUICtrlSetBkColor($aDst[$i][0], 0x008800)
GUICtrlSetData($aDst[$i][0], $aRegExp[0] & "_" & $aRegExp[1])
Case "DST"
GUICtrlSetGraphic($cGfx, $GUI_GR_LINE, $aXmm0[$aRegExp[1]][1] + $aXmm0[$aRegExp[1]][2] / 2, 0)
GUICtrlSetBkColor($aDst[$i][0], 0x880000)
GUICtrlSetData($aDst[$i][0], $aRegExp[0] & "_" & $aRegExp[1])
EndSwitch
Next
GUICtrlSetGraphic($cGfx, $GUI_GR_REFRESH)
EndFunc ;==>_DrawCon
Func _CalcShufle()
Local $iHex = GUICtrlRead($cIP_Hex)
If GUICtrlRead($cRB_SHUFPD) = 1 Then
If BitAND($iHex, 1) Then
_GUICtrlComboBoxEx_SetCurSel(GUICtrlGetHandle($aDstCB[0]), 1)
Else
_GUICtrlComboBoxEx_SetCurSel(GUICtrlGetHandle($aDstCB[0]), 0)
EndIf
If BitAND($iHex, 2) Then
_GUICtrlComboBoxEx_SetCurSel(GUICtrlGetHandle($aDstCB[1]), 1)
Else
_GUICtrlComboBoxEx_SetCurSel(GUICtrlGetHandle($aDstCB[1]), 0)
EndIf
Else
Local $sBin = StringFormat("%08s", GUICtrlRead($cIP_Bin))
Local $aSplit = StringRegExp($sBin, "\d{2}", 3)
If UBound($aSplit) <> 4 Then Return
Local $iOff = 3
If GUICtrlRead($cRB_PSHUFHW) = 1 Then $iOff = 7
For $i = 0 To UBound($aSplit) - 1
_GUICtrlComboBoxEx_SetCurSel(GUICtrlGetHandle($aDstCB[$iOff - $i]), _TranslateBase($aSplit[$i], 2, 10))
Next
EndIf
Select
Case GUICtrlRead($cRB_PSHUFD) = 1
GUICtrlSetData($aInf[3], "pshufd xmm0, xmm1, " & $iHex)
Case GUICtrlRead($cRB_SHUFPS) = 1
GUICtrlSetData($aInf[3], "shufps xmm0, xmm1, " & $iHex)
Case GUICtrlRead($cRB_SHUFPD) = 1
GUICtrlSetData($aInf[3], "shufpd xmm0, xmm1, " & $iHex)
Case GUICtrlRead($cRB_PSHUFLW) = 1
GUICtrlSetData($aInf[3], "pshuflw xmm0, xmm1, " & $iHex)
Case GUICtrlRead($cRB_PSHUFHW) = 1
GUICtrlSetData($aInf[3], "pshufhw xmm0, xmm1, " & $iHex)
EndSelect
_DrawCon()
EndFunc ;==>_CalcShufle
Func _SetMode()
Select
Case (GUICtrlRead($cRB_PSHUFD) = 1) Or (GUICtrlRead($cRB_SHUFPS) = 1)
Local $iSize = ($iWidth - 20) / 8
For $i = 0 To 3
GUICtrlSetState($aDst[$i][0], BitOR($GUI_SHOW, $GUI_ENABLE))
GUICtrlSetState($aDstCB[$i], BitOR($GUI_SHOW, $GUI_ENABLE))
$aDst[$i][1] = $iWidth * 0.5 + $iSize - $i * $iSize
$aDst[$i][2] = $iSize
GUICtrlSetPos($aDst[$i][0], $aDst[$i][1] + 2, $iYPosDst, $aDst[$i][2] - 4, 20)
GUICtrlSetPos($aDstCB[$i], $aDst[$i][1] + 2, $iYPosDstCB, $aDst[$i][2] - 4, 20)
Next
For $i = 4 To 7
GUICtrlSetState($aDst[$i][0], $GUI_HIDE)
GUICtrlSetState($aDstCB[$i], $GUI_HIDE)
Next
Case GUICtrlRead($cRB_SHUFPD) = 1
Local $iSize = ($iWidth - 20) / 4
For $i = 0 To 1
GUICtrlSetState($aDst[$i][0], BitOR($GUI_SHOW, $GUI_ENABLE))
GUICtrlSetState($aDstCB[$i], BitOR($GUI_SHOW, $GUI_ENABLE))
$aDst[$i][1] = $iWidth * 0.5 - $i * $iSize
$aDst[$i][2] = $iSize
GUICtrlSetPos($aDst[$i][0], $aDst[$i][1] + 2, $iYPosDst, $aDst[$i][2] - 4, 20)
GUICtrlSetPos($aDstCB[$i], $aDst[$i][1] + 2, $iYPosDstCB, $aDst[$i][2] - 4, 20)
Next
For $i = 2 To 7
GUICtrlSetState($aDst[$i][0], $GUI_HIDE)
GUICtrlSetState($aDstCB[$i], $GUI_HIDE)
Next
Case (GUICtrlRead($cRB_PSHUFLW) = 1) Or (GUICtrlRead($cRB_PSHUFHW) = 1)
Local $iSize = ($iWidth - 20) / 16
For $i = 0 To 7
GUICtrlSetState($aDst[$i][0], BitOR($GUI_SHOW, $GUI_ENABLE))
GUICtrlSetState($aDstCB[$i], BitOR($GUI_SHOW, $GUI_ENABLE))
$aDst[$i][1] = $iWidth * 0.5 + $iSize * 3 - $i * $iSize
$aDst[$i][2] = $iSize
GUICtrlSetPos($aDst[$i][0], $aDst[$i][1] + 2, $iYPosDst, $aDst[$i][2] - 4, 20)
GUICtrlSetPos($aDstCB[$i], $aDst[$i][1] + 2, $iYPosDstCB, $aDst[$i][2] - 4, 20)
Next
If GUICtrlRead($cRB_PSHUFLW) = 1 Then
For $i = 4 To 7
GUICtrlSetState($aDst[$i][0], $GUI_DISABLE)
GUICtrlSetState($aDstCB[$i], $GUI_DISABLE)
Next
Else
For $i = 0 To 3
GUICtrlSetState($aDst[$i][0], $GUI_DISABLE)
GUICtrlSetState($aDstCB[$i], $GUI_DISABLE)
Next
EndIf
EndSelect
For $i = 0 To 7
GUICtrlSetData($aDstCB[$i], "")
GUICtrlSetBkColor($aDst[$i][0], 0x000088)
GUICtrlSetData($aDst[$i][0], $i)
Next
Select
Case GUICtrlRead($cRB_PSHUFD) = 1
For $i = 0 To 3
GUICtrlSetData($aDstCB[$i], "|(00) SRC_0|(01) SRC_1|(10) SRC_2|(11) SRC_3")
Next
Case GUICtrlRead($cRB_SHUFPS) = 1
For $i = 0 To 1
GUICtrlSetData($aDstCB[$i + 2], "|(00) SRC_0|(01) SRC_1|(10) SRC_2|(11) SRC_3")
GUICtrlSetData($aDstCB[$i], "|(00) DST_0|(01) DST_1|(10) DST_2|(11) DST_3")
Next
Case GUICtrlRead($cRB_SHUFPD) = 1
GUICtrlSetData($aDstCB[1], "|(00) SRC_0|(01) SRC_1")
GUICtrlSetData($aDstCB[0], "|(00) DST_0|(01) DST_1")
Case GUICtrlRead($cRB_PSHUFLW) = 1
For $i = 0 To 3
GUICtrlSetData($aDstCB[$i], "|(00) SRC_0|(01) SRC_1|(10) SRC_2|(11) SRC_3")
GUICtrlSetData($aDstCB[$i + 4], "|(00) SRC_" & $i + 4, "(00) SRC_" & $i + 4)
Next
Case GUICtrlRead($cRB_PSHUFHW) = 1
For $i = 4 To 7
GUICtrlSetData($aDstCB[$i], "|(00) SRC_4|(01) SRC_5|(10) SRC_6|(11) SRC_7")
GUICtrlSetData($aDstCB[$i - 4], "|(00) SRC_" & $i - 4, "(00) SRC_" & $i - 4)
Next
EndSelect
Select
Case GUICtrlRead($cRB_PSHUFD) = 1
Local $iSize = ($iWidth - 20) / 8
For $i = 0 To 3
GUICtrlSetState($aXmm0[$i][0], $GUI_HIDE)
GUICtrlSetState($aXmm1[$i][0], BitOR($GUI_SHOW, $GUI_ENABLE))
$aXmm1[$i][1] = $iWidth * 0.5 + $iSize - $i * $iSize
$aXmm1[$i][2] = $iSize
GUICtrlSetPos($aXmm1[$i][0], $aXmm1[$i][1] + 2, $iYPosXMM, $aXmm1[$i][2] - 4, 20)
Next
For $i = 4 To 7
GUICtrlSetState($aXmm0[$i][0], $GUI_HIDE)
GUICtrlSetState($aXmm1[$i][0], $GUI_HIDE)
Next
Case GUICtrlRead($cRB_SHUFPS) = 1
Local $iSize = ($iWidth - 20) / 8
For $i = 0 To 3
GUICtrlSetState($aXmm0[$i][0], BitOR($GUI_SHOW, $GUI_ENABLE))
$aXmm0[$i][1] = $iWidth * 0.5 - ($i + 1) * $iSize
$aXmm0[$i][2] = $iSize
GUICtrlSetPos($aXmm0[$i][0], $aXmm0[$i][1] + 2, $iYPosXMM, $aXmm0[$i][2] - 4, 20)
GUICtrlSetState($aXmm1[$i][0], BitOR($GUI_SHOW, $GUI_ENABLE))
$aXmm1[$i][1] = $iWidth * 0.5 + $iSize * 3 - $i * $iSize
$aXmm1[$i][2] = $iSize
GUICtrlSetPos($aXmm1[$i][0], $aXmm1[$i][1] + 2, $iYPosXMM, $aXmm1[$i][2] - 4, 20)
Next
For $i = 4 To 7
GUICtrlSetState($aXmm0[$i][0], $GUI_HIDE)
GUICtrlSetState($aXmm1[$i][0], $GUI_HIDE)
Next
Case GUICtrlRead($cRB_SHUFPD) = 1
Local $iSize = ($iWidth - 20) / 4
For $i = 0 To 1
GUICtrlSetState($aXmm0[$i][0], BitOR($GUI_SHOW, $GUI_ENABLE))
$aXmm0[$i][1] = $iWidth * 0.5 - ($i + 1) * $iSize
$aXmm0[$i][2] = $iSize
GUICtrlSetPos($aXmm0[$i][0], $aXmm0[$i][1] + 2, $iYPosXMM, $aXmm0[$i][2] - 4, 20)
GUICtrlSetState($aXmm1[$i][0], BitOR($GUI_SHOW, $GUI_ENABLE))
$aXmm1[$i][1] = $iWidth * 0.5 + $iSize - $i * $iSize
$aXmm1[$i][2] = $iSize
GUICtrlSetPos($aXmm1[$i][0], $aXmm1[$i][1] + 2, $iYPosXMM, $aXmm1[$i][2] - 4, 20)
Next
For $i = 2 To 7
GUICtrlSetState($aXmm0[$i][0], $GUI_HIDE)
GUICtrlSetState($aXmm1[$i][0], $GUI_HIDE)
Next
Case (GUICtrlRead($cRB_PSHUFLW) = 1) Or (GUICtrlRead($cRB_PSHUFHW) = 1)
Local $iSize = ($iWidth - 20) / 16
For $i = 0 To 7
GUICtrlSetState($aXmm0[$i][0], $GUI_HIDE)
GUICtrlSetState($aXmm1[$i][0], BitOR($GUI_SHOW, $GUI_ENABLE))
$aXmm1[$i][1] = $iWidth * 0.5 + $iSize * 3 - $i * $iSize
$aXmm1[$i][2] = $iSize
GUICtrlSetPos($aXmm1[$i][0], $aXmm1[$i][1] + 2, $iYPosXMM, $aXmm1[$i][2] - 4, 20)
Next
If GUICtrlRead($cRB_PSHUFLW) = 1 Then
For $i = 4 To 7
GUICtrlSetState($aXmm1[$i][0], $GUI_DISABLE)
Next
Else
For $i = 0 To 3
GUICtrlSetState($aXmm1[$i][0], $GUI_DISABLE)
Next
EndIf
EndSelect
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Select
Case (GUICtrlRead($cRB_SHUFPS) = 1) Or (GUICtrlRead($cRB_SHUFPD) = 1)
Local $iSize = ($iWidth - 20) / 4
GUICtrlSetState($aInf[0], BitOR($GUI_SHOW, $GUI_ENABLE))
GUICtrlSetState($aInf[1], BitOR($GUI_SHOW, $GUI_ENABLE))
GUICtrlSetPos($aInf[0], $iWidth / 2 - $iSize * 2 + 2, $iYPosXMM - 20, $iSize * 2 - 4, 14)
GUICtrlSetPos($aInf[1], $iWidth / 2 + 2, $iYPosXMM - 20, $iSize * 2 - 4, 14)
Case Else
Local $iSize = ($iWidth - 20) / 4
GUICtrlSetState($aInf[0], $GUI_HIDE)
GUICtrlSetState($aInf[1], BitOR($GUI_SHOW, $GUI_ENABLE))
GUICtrlSetPos($aInf[1], $iWidth / 2 - $iSize + 2, $iYPosXMM - 20, $iSize * 2 - 4, 14)
EndSelect
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]_CalcShufle()
EndFunc ;==>_SetMode
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $iIDFrom = BitAND($wParam, 0xFFFF)
Local $iCode = BitShift($wParam, 16)
Local $sText
[/autoit] [autoit][/autoit] [autoit]If $iCode = $EN_CHANGE Then
Switch $iIDFrom
Case $cIP_Bin
$sText = StringRight(StringRegExpReplace(GUICtrlRead($cIP_Bin), "[^01]", ""),
GUICtrlSetData($cIP_Bin, $sText)
$sText = "0x" & StringFormat("%02s", StringUpper(_TranslateBase($sText, 2, 16)))
GUICtrlSetData($cIP_Hex, $sText)
_CalcShufle()
[/autoit] [autoit][/autoit] [autoit]Case $cIP_Hex
$sText = StringRight(StringUpper(StringRegExpReplace(StringTrimLeft(GUICtrlRead($cIP_Hex), 2), "[^[:xdigit:]]", "")), 2)
GUICtrlSetData($cIP_Hex, "0x" & $sText)
$sText = StringFormat("%08s", _TranslateBase($sText, 16, 2))
GUICtrlSetData($cIP_Bin, $sText)
_CalcShufle()
[/autoit] [autoit][/autoit] [autoit]EndSwitch
EndIf
EndFunc ;==>WM_COMMAND
Func _TranslateBase($sNumber, $iOldBase = 10, $iNewBase = 2)
;by eukalyptus
If $iOldBase < 2 Or $iOldBase > 128 Or $iNewBase < 2 Or $iNewBase > 128 Then Return SetError(1, 1, False)
Local $iNum, $aRes, $tChr = DllStructCreate("char[64];")
If $iOldBase <> 10 Then
$aRes = DllCall("msvcrt.dll", "uint64:cdecl", "_strtoui64", "str", $sNumber, "ptr", 0, "int", $iOldBase)
If @error Then Return SetError(1, 2, False)
$iNum = $aRes[0]
Else
$iNum = Int($sNumber)
EndIf
$aRes = DllCall("msvcrt.dll", "ptr:cdecl", "_i64toa", "int64", $iNum, "ptr", DllStructGetPtr($tChr), "int", $iNewBase)
If @error Then Return SetError(1, 3, False)
Return DllStructGetData($tChr, 1)
EndFunc ;==>_TranslateBase
Func _Exit()
Exit
EndFunc ;==>_Exit
autoit.de/wcf/attachment/22717/
Download: autoit.de/wcf/attachment/22722/
E