有没有办法将整数转换为字节,知道这些整数在字节范围内。使用上交所?

tho*_*412 3 assembly sse x86-64 masm sse4

在 xmm 寄存器中,我有 3 个整数,其值小于 256。我想将它们转换为字节,并将它们保存到内存中。我不知道如何处理它。
我正在考虑从 获取这些数字xmm1并将它们保存到eax,然后将最低字节移动到内存,但我不确定如何从 xmm 寄存器获取整数。我只能获取第 0 个位置的元素,但如何移动其余的元素?
存在一个适合我的完美指令VPMOVDB,但我无法在我的处理器上使用它。有其他选择吗?

fuz*_*fuz 6

最简单的方法可能是使用pshufb排列字节,然后movd存储数据:

        ; convert dwords in xmm0 into bytes and store into dest
        pshufb  xmm0, xmmword ptr mask
        movd    dword ptr dest, xmm0

        ...
        align   16
mask    db      0, 4, 8, 12, 12 dup (-1)
Run Code Online (Sandbox Code Playgroud)

它存储 4 个字节而不是 3 个字节,因此请确保您的代码可以处理它。仅存储 3 个字节也是可能的,但需要更多工作:

        ; convert dwords in xmm0 into bytes and store into dest
        pshufb  xmm0, xmmword ptr mask
        movd    eax, xmm0
        mov     word ptr dest, ax
        bswap   eax
        mov     byte ptr dest+2, ah

        ...
        align   16
mask    db      0, 4, 8, 12, 12 dup (-1)
Run Code Online (Sandbox Code Playgroud)

如果这种情况发生多次,您可以提前加载蒙版,以避免重复加载的损失。

  • 另一种存储三个字节的方法是 `movd`/​​`mov ax` + `pextrb` 到内存,因为我们可以使用 SSE4.1。在现代 Intel 上读取 AH 会产生额外的延迟,因此您可以只使用 `shr eax, 24` 并存储 AL 来代替 bswap,只需要额外的 1 个字节的代码大小。 (4认同)