作者:在路上的老兵 | 来源:互联网 | 2022-12-19 20:51
我在xmm1
寄存器中加载了一些内容,让我们说它可以被视为
xmm1 = | bgra | bgra | bgra | bgra | (each one a dw)
现在,我希望每个双字在逻辑上向右移1个字节,所以它最终会像这样:
xmm1 = | 0bgr | 0bgr | 0bgr | 0bgr | (each one a dw)
我在intel doc上发现我可能正在寻找函数"psrld":
然而,它起初并没有像我预期的那样发挥xmm1
作用
xmm1 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x37, 0x51, 0x9e, 0x0, 0x3e, 0x58, 0xa5, 0x0, 0x3e, 0x5a, 0xa7, 0x0, 0x4a, 0x66, 0xb3, 0x0}, v8_int16 = {0x5137, 0x9e, 0x583e, 0xa5, 0x5a3e, 0xa7, 0x664a, 0xb3}, v4_int32 = {0x9e5137, 0xa5583e, 0xa75a3e, 0xb3664a}, v2_int64 = {0xa5583e009e5137, 0xb3664a00a75a3e}, uint128 = 0x00b3664a00a75a3e00a5583e009e5137}
然后,在应用之后psrld xmm1, 1
,xmm1的值为
xmm1 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0}, v16_int8 = {0x9b, 0x28, 0x4f, 0x0, 0x1f, 0xac, 0x52, 0x0, 0x1f, 0xad, 0x53, 0x0, 0x25, 0xb3, 0x59, 0x0}, v8_int16 = {0x289b, 0x4f, 0xac1f, 0x52, 0xad1f, 0x53, 0xb325, 0x59}, v4_int32 = {0x4f289b, 0x52ac1f, 0x53ad1f, 0x59b325}, v2_int64 = {0x52ac1f004f289b, 0x59b3250053ad1f}, uint128 = 0x0059b3250053ad1f0052ac1f004f289b}
这不是我想要做的.我哪里错了?完成此任务的正确方法是什么?
1> zx485..:
您的示例的输出是正确的,因此,例如,第一个v4_int32
是0x9e5137 =
100111100101000100110111
之后psrld xmm1, 1
是0x4f289b =
010011110010100010011011
所以每一个uint32
都向右移动了一下.
你正在尝试的是正确的 - 除了一点:
你正在向右移动一个位而不是你想要的一个字节.所以使用
psrld xmm1, 8 ; shift right by one byte
代替
psrld xmm1, 1 ; shift right by one bit
应该解决你的问题.