汇编语言SAL(算术左移)和SAR(算术右移)指令:将操作数左/右移一位

SAL(算术左移)指令的操作与《SHL指令》一节中的 SHL 指令一样。每次移动时,SAL 都将目的操作数中的每一位移动到下一个最高位上。最低位用 0 填充;最高位移入进位标志位,该标志位原来的值被丢弃:


如,二进制数 1100 1111 算术左移一位,得到 1001 1110:


SAR(算术右移)指令将目的操作数进行算术右移:


SAL 与 SAR 指令的操作数类型与 SHL 和 SHR 指令完全相同。移位可以重复执行,其次数由第二个操作数给出的计数器决定:

SAR destination, count

下面的例子展示了 SAR 是如何复制符号位的。执行指令前 AL 的符号位为负,执行指令后该位移动到右边的位上:

mov al, 0F0h ; AL = 11110000b (-16)
sar al, 1     ; AL = 11111000b (-8) , CF = 0

有符号数除法

使用 SAR 指令,就可以将有符号操作数除以 2 的幂。下例执行的是 -128 除以2³,商为 -16:

mov dl, -128 ; DL = 10000000b
sar dl, 3     ; DL = 11110000b

AX 符号扩展到 EAX

设 AX 中为有符号数,现将其符号位扩展到 EAX。首先把 EAX 左移 16 位,再将其算术右移 16 位:

mov ax, -128 ; EAX = ????FF80h
shl eax, 16     ; EAX = FF800000h
sar eax, 16     ; EAX = FFFFFF80h