汇编语言移位和循环移位指令简介

移位指令与前面介绍的按位操作指令一起形成了汇编语言最显著的特点之一。位移动 (bit shifting) 意味着在操作数内向左或向右移动。

x86 处理器在这方面提供了相当丰富的指令集如下表所示,这些指令都会影响溢出标志位和进位标志位。

SHL 左移 ROR 循环右移
SHR 右移 RCL 带进位的循环左移
SAL 算术左移 RCR  带进位的循环右移
SAR 算术右移 SHLD 双精度左移
ROL 循环左移 SHRD 双精度右移

逻辑移位和算术移位

移动操作数的位有两种方法。第一种是逻辑移位 (logic shift),空出来的位用 0 填充。如下图所示,一个字节的数据向右移动一位。也就是说,每一位都被移动到其旁边的低位上。注意,位 7 被填充为 0:


下图所示为二进制数 1100 1111 逻辑右移一位,得到 OllOOlll。最低位移入进位标志位:


另一种移位的方法是算术移位 (arithmetic shift),空出来的位用原数据的符号位填充:


例如,二进制数 1100 1111,符号位为 1。算术右移一位后,得到 1110 0111: