汇编——位移指令 基础区分逻辑移位无视符号位空位统一补 0多用于无符号数算术移位保留符号位符号位不变多用于有符号数补码循环移位移出的位绕回另一端数据不丢失部分结合进位标志 CF左移指令 SHL / SALSHL 逻辑左移格式SHL 寄存器/内存,移位次数规则所有位整体左移右侧空位补 0最高位移入CF等效左移 1 位 数值 × 2左移 n 位 数值 × 2n示例mov al, 00001011Bshl al, 1 //结果00010110BCF0shl al, 2 //等价 ×4SAL 算术左移格式SAL 寄存器/内存, 移位次数规则、效果、用法和 SHL 完全一致原因左移时符号位会一同移动算术 / 逻辑无区别有符号数乘 2 优先用 SAL右移指令 SHR / SARSHR 逻辑右移无符号数格式SHR 寄存器/内存, 移位次数规则所有位整体右移左侧空位补 0最低位移入CF等效右移 1 位 数值 ÷ 2取整右移 n 位 数值 ÷ 2n示例mov al, 00001010Bshr al, 1 //结果00000101BCF0SAR 算术右移有符号数补码格式SAR 寄存器/内存, 移位次数规则整体右移左侧空位补原符号位最高位最低位移入CF作用保证正负号不变实现有符号数除以2示例mov al, 10001010B //有符号负数sar al, 1 //高位补1符号不变等价 ÷2关键区别正数SHR 和 SAR 结果一致负数SHR 高位补 0符号错乱SAR 高位补 1符号保留循环移位指令数据循环不丢位ROL 循环左移格式ROL 寄存器/内存, 移位次数规则全体位左移最高位 → 同时送到最低位 和 CF示例mov al, 10000001Brol al, 1 //变为 00000011BCF1ROR 循环右移格式ROR 寄存器/内存, 移位次数规则全体位右移最低位 → 同时送到最高位 和 CF带进位循环移位结合 CF 一起循环RCL 带进位循环左移格式RCL 寄存器/内存, 移位次数规则整体左移左侧空出位用原 CF 值填充移出的最高位更新为新的 CFRCR 带进位循环右移格式RCR 寄存器/内存, 移位次数规则整体右移右侧空出位用原 CF 值填充移出的最低位更新为新的 CF用途多用于超大数移位借助 CF 衔接多段寄存器数据补充规则移位次数80386 及以上可直接写立即数shl eax,2 老式汇编, 把移位位数先存入 CL再写指令 (mov cl, 3 shl eax, cl)标志位所有移位指令都会修改 CF移位后结果为 0 则 ZF1用法速记● 无符号数乘除SHL / SHR● 有符号数乘除SAL / SAR● 数据循环不丢位ROL / ROR● 结合进位做大数移位RCL / RCR