ASM SSE shuffle explorer (pshufd shufps ...)

  • 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
    [autoit]

    #include <EditConstants.au3>
    #include <GuiComboBoxEx.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)
    Opt("MustDeclareVars", 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $iWidth = 1200
    Global $iHeight = 500

    [/autoit] [autoit][/autoit] [autoit]

    Global $iYPosXMM = 150
    Global $iYPosDst = 420
    Global $iYPosDstCB = $iYPosDst + 30
    Global $iGfxH = $iYPosDst - $iYPosXMM - 50

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate("SSE_Shuffle Explorer by Eukalyptus http://www.autoit.de", $iWidth, $iHeight)
    GUISetOnEvent(-3, "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    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")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 7
    $aXmm0[$i][0] = GUICtrlCreateLabel("DST_" & $i, 0, 0, 20, 20, BitOR(0x01, 0x0200))
    GUICtrlSetBkColor(-1, 0x880000)
    GUICtrlSetColor(-1, 0xFFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    $aXmm1[$i][0] = GUICtrlCreateLabel("SRC_" & $i, 0, 0, 20, 20, BitOR(0x01, 0x0200))
    GUICtrlSetBkColor(-1, 0x008800)
    GUICtrlSetColor(-1, 0xFFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    $aDst[$i][0] = GUICtrlCreateLabel($i, 0, 0, 20, 20, BitOR(0x01, 0x0200))
    GUICtrlSetBkColor(-1, 0x000088)
    GUICtrlSetColor(-1, 0xFFFFFF)

    [/autoit] [autoit][/autoit] [autoit]

    $aDstCB[$i] = GUICtrlCreateCombo("", 0, 0, 20, 20)
    GUICtrlSetOnEvent(-1, "_SetSrc")
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _SetSrc()
    Local $iOff = 0
    If GUICtrlRead($cRB_PSHUFHW) = 1 Then $iOff = 4

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($cIP_Hex, "0x" & Hex(BitAND($iHex, 3), 2))
    Else
    Local $sBin = StringFormat("%08s", GUICtrlRead($cIP_Bin))

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($cIP_Bin, $sBin)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ExitLoop
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    $aRegExp = StringRegExp(GUICtrlRead($aDstCB[$i]), "\)\h+(\w+)_(\d)", 3)
    If UBound($aRegExp) < 2 Then ContinueLoop

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetGraphic($cGfx, $GUI_GR_REFRESH)
    EndFunc ;==>_DrawCon

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CalcShufle()
    Local $iHex = GUICtrlRead($cIP_Hex)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    _DrawCon()
    EndFunc ;==>_CalcShufle

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To 7
    GUICtrlSetData($aDstCB[$i], "")
    GUICtrlSetBkColor($aDst[$i][0], 0x000088)
    GUICtrlSetData($aDst[$i][0], $i)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    Case GUICtrlRead($cRB_SHUFPD) = 1
    GUICtrlSetData($aDstCB[1], "|(00) SRC_0|(01) SRC_1")
    GUICtrlSetData($aDstCB[0], "|(00) DST_0|(01) DST_1")

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Select
    Case GUICtrlRead($cRB_PSHUFD) = 1
    Local $iSize = ($iWidth - 20) / 8
    For $i = 0 To 3
    GUICtrlSetState($aXmm0[$i][0], $GUI_HIDE)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 4 To 7
    GUICtrlSetState($aXmm0[$i][0], $GUI_HIDE)
    GUICtrlSetState($aXmm1[$i][0], $GUI_HIDE)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 4 To 7
    GUICtrlSetState($aXmm0[$i][0], $GUI_HIDE)
    GUICtrlSetState($aXmm1[$i][0], $GUI_HIDE)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 2 To 7
    GUICtrlSetState($aXmm0[$i][0], $GUI_HIDE)
    GUICtrlSetState($aXmm1[$i][0], $GUI_HIDE)
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    EndSelect

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _CalcShufle()
    EndFunc ;==>_SetMode

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Local $iIDFrom = BitAND($wParam, 0xFFFF)
    Local $iCode = BitShift($wParam, 16)

    [/autoit] [autoit][/autoit] [autoit]

    Local $sText

    [/autoit] [autoit][/autoit] [autoit]

    If $iCode = $EN_CHANGE Then
    Switch $iIDFrom
    Case $cIP_Bin
    $sText = StringRight(StringRegExpReplace(GUICtrlRead($cIP_Bin), "[^01]", ""), 8)
    GUICtrlSetData($cIP_Bin, $sText)

    [/autoit] [autoit][/autoit] [autoit]

    $sText = "0x" & StringFormat("%02s", StringUpper(_TranslateBase($sText, 2, 16)))
    GUICtrlSetData($cIP_Hex, $sText)

    [/autoit] [autoit][/autoit] [autoit]

    _CalcShufle()

    [/autoit] [autoit][/autoit] [autoit]

    Case $cIP_Hex
    $sText = StringRight(StringUpper(StringRegExpReplace(StringTrimLeft(GUICtrlRead($cIP_Hex), 2), "[^[:xdigit:]]", "")), 2)
    GUICtrlSetData($cIP_Hex, "0x" & $sText)

    [/autoit] [autoit][/autoit] [autoit]

    $sText = StringFormat("%08s", _TranslateBase($sText, 16, 2))
    GUICtrlSetData($cIP_Bin, $sText)

    [/autoit] [autoit][/autoit] [autoit]

    _CalcShufle()

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    EndIf
    EndFunc ;==>WM_COMMAND

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    autoit.de/wcf/attachment/22717/


    Download: autoit.de/wcf/attachment/22722/

    E

  • Hi,
    sehr schön, gehört sicher in Zukunft zum festen Repertoire :thumbup:

    Zitat

    Ganz zu schweigen von der Zeit, die ich vertrödelt hab, nachdem ich wegen eines falschen Hexwertes den restlichen ASM-Code nach Fehlern absuchte

    ....der Debugger in AssembleIt() stellt die SSE-Register richtig dar, gerade beim "shuffeln" hilft mir das immer...wobei ich zugeben muss, dass die GUI des Debuggers nicht wirklich schön ist.
    Gerade die SSE-Register haben wesentlich mehr Platz verdient zur Darstellung der div. Werte (4xfloat, 2x double, 8xword, 4xdword, 128 Bit usw usf...)

    Leider habe ich nicht mal ansatzweise Zeit, den Debugger in AssembleIt2() zu integrieren....


    /EDIT wie wärs damit, Register mit sich selbst zu shuffeln bspw. shufps xmm0,xmm0,0xC8

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (26. Juli 2013 um 19:20)

  • Ich muss gestehen, dass ich den Debugger nur am Anfang ein paarmal verwendet hab :whistling:
    Da ich ja auch viel in Freebasic mach, musste ich lernen ohne auszukommen :D

    wie wärs damit, Register mit sich selbst zu shuffeln bspw. shufps xmm0,xmm0,0xC8


    Das macht doch eigentlich keinen Unterschied, oder!?
    Nur die Farben wären alle Rot...

    Bei der nächsten Version werd ich mir das dann ansehen!
    Und evtl auch PSHUFB einbauen

    E

  • Zitat

    Das macht doch eigentlich keinen Unterschied, oder!?

    natürlich nicht...hast Recht, und ICH komme ja sowieso damit klar :D

  • Die Idee ist sehr gut. Da man mit den Kürzeln nur bedingt was anfangen kann und die Hexcodes auch ohne Aussagekraft sind, ist so eine Darstellung schon was schönes :)
    Werde ich auf jeden Fall benutzen !

    lg
    Mars