大家好,又见面了,我是你们的朋友全栈君。
移位指令
移位指令对操作数按某种方式左移或右移,移位位数可以由立即数直接给出,或由CL间接给出。移位指令分一般移位指令和循环移位指令。
1 一般移位指令
(1) 算术/逻辑左移指令。
格式:SAL DEST,OPRD
SHL DEST,OPRD
功能:按照操作数OPRD规定的移位位数,对目的操作数进行左移操作,最高位移入CF中。每移动一位,右边补一位0。如图3 12(a)所示。目的操作数可以为通用寄存器或存储器操作数。
SAL,SHL指令影响标志位OF,SF,ZF,PF,CF。
当操作数为有符号数时,如果左移的结果没有溢出(符号位没变),那么有符号数左移1位后具有乘2的功能。比如:-1(11111111)左移1位后,结果为-2(11111110);+6(00000110)左移1位后,结果为+12(00001100)。
由于受字长位数(8位、16位或32位)的限制,正数左移1位的结果不一定是正数,负数左移1位的结果也不一定是负数。例如,正数01000000左移1位后,结果为10000000,是负数;而负数10000000左移1位后,结果为00000000,是正数。不难看出,如果将操作数的位数扩展到16位,上面两个数左移的结果也相当于乘2。所以,算术左移指令SAL的操作规则与逻辑左移指令SHL的一样。实际上,一个数乘2相当于这个数自身相加。有符号数和无符号数的加法运算用同一套指令。所以,它们的左移操作也应该是完全一样的。所以不能像右移指令那样,规定符号位保持不变。
如果左移1位(最低位添0,最高位移到CF)后,最高位与CF位不同,则OF=1,表示有符号数溢出;如果CF=1,表示无符号数“溢出”。
图 3.12 移位指令示意图
例 3.48
SHL BYTE PTR [DI],2
SAL BX,CL
(2) 算术右移指令。
格式:SAR DEST,OPRD
功能:按照操作数OPRD规定的移位次数,对目的操作数进行右移操作,最低位移至CF中,最高位(即符号位)保持不变。如图3 12(b)所示。目的操作数可以为通用寄存器或存储器操作数。
SAR指令影响标志位OF,SF,ZF,PF,CF。
例 3.49
SAR AL,5
SAR WORD PTR \[ECX\],CL
(3) 逻辑右移指令。
格式:SHR DEST,SRC
功能:按照操作数OPRD规定的移位位数,对目的操作数进行右移操作,最低位移至CF中。每移动一位,左边补一位0。如图3 12(c)所示,目的操作数可以为通用寄存器或存储器操作数。
SHR指令影响标志位OF,SF,ZF,PF,CF。例 3.50
SHR BYTE PTR [SI],3
SHR EDX,CL
算术/逻辑左移,只要结果未超出目的操作数所能表达的范围,每左移一次相当于原数乘2。算术右移只要无溢出,每右移一次相当于原数除以2。
2 循环移位指令
格式:ROL DEST,OPRD
ROR DEST,OPRD
RCL DEST,OPRD
RCR DEST,OPRD
功能:循环左移指令ROL,见图3 13(a)所示,目的操作数左移,每移位一次,其最高位移入最低位,同时最高位也移入进位标志CF。循环右移指令 ROR见图3 13(b)所示,目的操作数右移,每移位一次,其最低位移入最高位,同时最低位也移入进位标志CF。
带进位循环左移指令RCL,见图3 13(c)所示,目的操作数左移,每移动一次,其最高位移入进位标志CF,CF移入最低位。带进位循环右移指令RCR,见图3 13(d)所示,目的操作数右移,每移动一次,其最低位移入进位标志CF,CF移入最高位。
图 3.13 循环移位指令
目的操作数可以为通用寄存器或存储器操作数。循环移位指令影响标志位CF,OF。其它标志位无定义。
例 3.51
ROL AL,CL
ROR BX,5
RCL ECX,3
RCR BYTE PTR [SI],CL例 3.52 将一个2位数压缩的BCD码转换成二进制数。
·MODEL SMALL
·DATA
BCD DB 01011001B
BIN DB?
CODE
·START UP
MOV AL,BCD
MOV BL,AL
AND BL,0FH
AND AL,0F0H
MOV CL,4
ROR AL,CL
MOV BH,0AH
MUL BH
ADD AL,BL
MOV BIN,AL
·EXIT
END
3 双精度移位指令
格式:SHLD DEST,SRC,OPRD
SHRD DEST,SRC,OPRD
功能:对于由目的操作数DEST和源操作数SRC构成的双精度数,按照操作数OPRD给出的移位位数,进行移位。SHLD是对目的操作数进行左移,如 图3 14(a)所示,SHRD是对目的操作数进行右移,如图3 14(b)所示。先移出位送标志位CF,另一端空出位由SRC移入DEST中,而SRC 内容保持不变。目的操作数可以是16位或32位通用寄存器或存储器操作数。源操作数SRC允许为16位或32位通用寄存器。操作数OPRD可以为立即数或 CL。目的操作数和源操作数SRC数据类型必须一致。
图 3.14 双精度移位指令
SHLD,SHRD指令常用于位串的快速移位、嵌入和删除等操作,影响标志位为SF,ZF,PF,CF,其它标志位无定义。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130866.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...