汇编语言移位和循环移位指令简介
移位指令与前面介绍的按位操作指令一起形成了汇编语言最显著的特点之一。位移动 (bit shifting) 意味着在操作数内向左或向右移动。
x86 处理器在这方面提供了相当丰富的指令集如下表所示,这些指令都会影响溢出标志位和进位标志位。
下图所示为二进制数 1100 1111 逻辑右移一位,得到 OllOOlll。最低位移入进位标志位:
另一种移位的方法是算术移位 (arithmetic shift),空出来的位用原数据的符号位填充:
例如,二进制数 1100 1111,符号位为 1。算术右移一位后,得到 1110 0111:
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: