基于调试案例解析VPSLLVD、VPSRAVD指令的工作原理
VPSLLVD与VPSRAVD指令工作机制详解(结合调试实例)
这两条都是AVX2指令,核心特点是按32位双字(dword)并行处理:256位YMM寄存器被拆分为8个独立的32位dword,每个dword使用第二个源寄存器(YMM1)中对应位置的dword作为移位计数,独立执行移位操作。
一、VPSLLVD:按dword并行逻辑左移
指令规则
对每个32位dword执行逻辑左移:
- 若移位计数
<32:将dword左移对应位数,超出32位的部分丢弃,左侧补0 - 若移位计数
≥32:结果直接置为00000000
调试数据拆分(按32位dword)
将调试器显示的YMM寄存器拆分为8个dword(dword0为最低32位,dword7为最高32位):
- YMM0的8个操作数:
dword0:0003672C| dword1:000204E3| dword2:00000001| dword3:00001164
dword4:FFFE9BB8| dword5:FFFFDC80| dword6:000000E9| dword7:000011C8 - YMM1的8个移位计数:
count0:00000BB8(十进制3000) | count1:00001E81(十进制7809) | count2:0000000A(十进制10) | count3:00000005(十进制5)
count4:00000064(十进制100) | count5:00000057(十进制87) | count6:00000384(十进制900) | count7:000008AE(十进制2222)
逐dword计算过程
- dword0:计数3000≥32 → 结果
00000000 - dword1:计数7809≥32 → 结果
00000000 - dword2:
00000001左移10位 →0x1 << 10 = 0x400→00000400 - dword3:
00001164左移5位 →0x1164 << 5 = 0x22C80→00022C80 - dword4:计数100≥32 → 结果
00000000 - dword5:计数87≥32 → 结果
00000000 - dword6:计数900≥32 → 结果
00000000 - dword7:计数2222≥32 → 结果
00000000
将结果按高位到低位组合,就得到调试中的YMM5值:0000000000000000-0000000000000000-00022C8000000400-0000000000000000
二、VPSRAVD:按dword并行算术右移
指令规则
对每个32位dword执行算术右移,核心是符号位扩展:
- 若dword为正数(最高位0):右移后左侧补0
- 若dword为负数(最高位1):右移后左侧补1
- 若移位计数
≥32:正数结果为00000000,负数结果为FFFFFFFF(符号位全扩展)
逐dword计算过程(复用上述拆分的寄存器数据)
- dword0:
0003672C(正数),计数3000≥32 → 结果00000000 - dword1:
000204E3(正数),计数7809≥32 → 结果00000000 - dword2:
00000001(正数),右移10位 →0x1 >>10 = 0→00000000 - dword3:
00001164(正数),右移5位 →0x1164 >>5 = 0x8B→0000008B - dword4:
FFFE9BB8(负数),计数100≥32 → 符号位全扩展 →FFFFFFFF - dword5:
FFFFDC80(负数),计数87≥32 → 符号位全扩展 →FFFFFFFF - dword6:
000000E9(正数),计数900≥32 → 结果00000000 - dword7:
000011C8(正数),计数2222≥32 → 结果00000000
将结果按高位到低位组合,就得到调试中的YMM6值:0000000000000000-FFFFFFFFFFFFFFFF-0000008B00000000-0000000000000000
内容的提问来源于stack exchange,提问作者HappyLuck99
相关产品推荐
相关产品推荐

