汇编语言—移位指令

汇编语言—移位指令移位指令是一组经常使用的指令,包括:算数移位、逻辑移位、双精度移位、循环移位、带进位的循环移位;移位指令都有一个指定需要移动的二进制位数的操作数,该操作数可以是立即数,也可以是CL的值;在8086中,该操作数只能是1,但是在其后的CPU中,该立即数可以是定义域[1,31]之内的数;一、算数移位指令:算数移位指令分为:算数左移SAL(ShiftAlgebraicLeft)和算数右移S

大家好,又见面了,我是你们的朋友全栈君。

移位指令是一组经常使用的指令,包括:算数移位、逻辑移位、双精度移位、循环移位、带进位的循环移位;
移位指令都有一个指定需要移动的二进制位数的操作数,该操作数可以是立即数,也可以是CL的值;在8086中,该操作数只能是1,但是在其后的CPU中,该立即数可以是定义域[1,31]之内的数;
一、算数移位指令:
算数移位指令分为:算数左移SAL(Shift Algebraic Left)和算数右移SAR(Shift Algebraic Right);
指令格式: SAL/SAR reg/mem,CL/imm
受影响的标志位:CF,OF,PF,SF,ZF;对AF的影响无定义;
算数左移SAL:把目的操作数的低位部分向高位方向移动CL或imm指定的位数;移位后,空出的低位部分全部用0填充;移出的高位存放在CF中;如果只向左移动1位,那么,空出的最低位填0,移出的最高位存放在CF中;如果向左移动N位,那么,空出的N个低位全部用0填充,移出的N个高位中,只把最后一次移出的那一位存放在CF中,即:CF中只存放最后一次移出的内容;SAL效果如下图所示:

2010年07月16日 - 哥哥 - 哥哥
算数右移SAR:把目的操作数的高位部分向低位方向移动CL或imm指定的位数;移位后,空出的高位部分全部用目的操作数原来的最高位(符号位)填充;如果只是向右移动1位,那么,空出的最高位用目的操作数原来的最高位(符号位)来填充,移出的最低位存放到CF中;如果向右移动N位,那么空出的N个高位全部都用目的操作数原来的最高位(符号位)填充,而移出的N个低位中,只把最后一次移出的那一位放到CF中,即:CF中存放的是最后一次移出的内容;换句话说,算数右移时,空出的高位上移入的是目的操作数原来的最高位的值,即:最高位保持不变,最低位同样移入到CF中;算数右移常用于带符号数的右移;SAR效果如下图所示:

2010年07月16日 - 哥哥 - 哥哥
二、逻辑移位指令:
逻辑移位分为:逻辑左移SHL(Shift Logic Left)和逻辑右移SHR(Shift Logic Right);
指令格式: SHL/SHR reg/mem,CL/imm
受影响的标志位: CF,OF,PF,SF,ZF;对AF的影响无定义;
逻辑左移SHL:把目的操作数的低位部分向高位方向移动CL或imm指定的位数;移位后,空出的低位部分全部填充0,移出的高位存放到CF中;如果向左移动N位,则只把最后一次移出的内容存放到CF中;SHL效果如下图所示:

2010年07月16日 - 哥哥 - 哥哥
逻辑右移SHR:把目的操作数的高位部分向低位方向移动CL或imm指定的位数;移位后,空出的高位部分全部填充0,移出的低位存放到CF中;如果向右移动N位,则只把最后一次移出的内容存放到CF中;SHR效果如下图所示:

2010年07月16日 - 哥哥 - 哥哥
三、双精度移位指令:
分为:双精度左移SHLD(Shift Left Double)和双精度右移SHRD(Shift Right Double);这组指令都有三个操作数;
指令格式: SHLD/SHRD reg/mem,reg,CL/imm
其中,第一操作数reg/mem是一个16位或32位的寄存器或存储单元;第二操作数reg与第一操作数具有相同位数,但它一定是一个寄存器;第三操作数CL/imm指定了移动的位数;
受影响的标志位:CF,OF,PF,SF,ZF;对AF的影响无定义;
在执行双精度左移指令SHLD时,第一操作数向左移动N位,其”空出”的N个低位由第二操作数的高N位来填充,但是第二操作数本身并不移位、不改变;SHLD效果如下图所示:

2010年07月16日 - 哥哥 - 哥哥
在执行双精度右移指令SHRD时,第一操作数向右移动N位,其”空出”的N个高位由第二操作数的低N位来填充,但是第二操作数本身并不移位、不改变;SHRD效果如下图所示:

2010年07月16日 - 哥哥 - 哥哥
四、循环移位:
循环移位指令分为:循环左移ROL(Rotate Left)和循环右移ROR(Rotate Right);
指令格式:

ROL/ROR reg/mem,CL/imm
受影响的标志位只有:CF、OF;
这两条指令不会把进位标志CF纳入循环位中;
循环左移ROL:把操作数的低位部分向高位方向循环移动CL/imm指定的位数,空出的低位部分由移出的高位部分来填充,同时,移出的高位部分仍然会存放在CF中;如果是循环左移N位,那么,就空出N个低位,移出N个高位,然后,把移出的这N个高位按照移出的顺序依次填入空出的N个低位中,同时,CF中只保存最后一次移出的那一位的内容;ROL效果如下图所示:

2010年07月16日 - 哥哥 - 哥哥
循环右移ROR:把操作数的高位部分向低位方向循环移动CL/imm指定的位数,空出的高位部分由移出的低位部分来填充,同时,移出的低位部分仍然会存放在CF中;如果是循环右移N位,那么,就空出N个高位,移出N个低位,然后,把移出的这N个低位按照移出的顺序依次填入空出的N个高位中,同时,CF中只保存最后一次移出的那一位的内容;ROR效果如下图所示:

2010年07月16日 - 哥哥 - 哥哥
五、带进位的循环移位指令:
带进位的循环移位指令分为:带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right Through Carry)
指令格式: RCL/ROR reg/mem,CL/imm
受影响的标志位只有:CF,OF;
这两条指令把进位标志CF纳入了循环位中;
带进位的循环左移指令RCL:把操作数的低位部分向高位方向循环移动CL/imm指定的位数,每向左移动一位,RCL指令都会先把CF的原有值填充到空出的最低位上,再把移出的最高位存放到CF中;这样循环左移N位之后,CF中保存的仍然是最后一次移出的那一位的内容;RCL效果如下图所示:

2010年07月16日 - 哥哥 - 哥哥
带进位的循环右移指令RCR:把操作数的高位部分想低位方向循环移动CL/imm指定的位数,每向右移动一位,RCL指令都会先把CF的原有值填充到空出的最高位上,再把移出的最低位存放到CF中;这样循环右移N位之后,CF中保存的仍然是最后一次移出的那一位的内容;RCR效果如下图所示:

2010年07月16日 - 哥哥 - 哥哥
移位指令中,溢出标志位OF的设置规则为:如果只移动一位,则系统按照操作数的最高符号位在移位前后是否发生改变,来相应地设置溢出标志OF的值:如果移位前操作数的最高符号位与移位后操作数的最高符号位不相同(有变化),则设置OF=1,认为溢出了;否则,设置OF=0,认为没有溢出;但是,如果移位位数大于1,则OF的值不确定;也就是说,溢出标志OF的值只有在移位位数为1时才有意义;
进位标志CF的设置规则:系统按照移入的位来设置进位标志CF,根据移位后的结果影响SF,ZF,PF,而对AF的影响没有定义;

FROM: http://bdxnote.blog.163.com/blog/static/8444235201061610333135/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139679.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java逻辑删除代码_MybatisPlus实现逻辑删除功能

    java逻辑删除代码_MybatisPlus实现逻辑删除功能逻辑删除你有没有见过某些网站进行一些删除操作之后,你看不到记录了但是管理员却能够查看到。这里就运用到了逻辑删除。什么是逻辑删除?逻辑删除的本质是修改操作,所谓的逻辑删除其实并不是真正的删除,而是在表中将对应的是否删除标识(deleted)或者说是状态字段(status)做修改操作。比如0是未删除,1是删除。在逻辑上数据是被删除的,但数据本身依然存在库中。对应的SQL语句:updateusers…

    2022年6月2日
    114
  • 请说明 Iaas Paas 和 Saas 分别提供的服务和特点_一张图看懂系列

    请说明 Iaas Paas 和 Saas 分别提供的服务和特点_一张图看懂系列编译:老夫子原文:https://www.bmc.com/blogs/saas-vs-paas-vs-iaas-whats-the-difference-and-how-to-choose/从小型企业到全球企业,云都是一个非常热门的话题,它是一个非常广泛的概念,涵盖了很多在线领域。无论是应用程序还是基础架构部署,当您开始考虑将业务转移到云时,了解各种云服务的差异和优势比以往任何时候…

    2022年10月21日
    0
  • Python文件名后缀_python 获取文件名 不带后缀

    Python文件名后缀_python 获取文件名 不带后缀原博文2020-05-1510:00−-1.切割字符“`pythonls=”asdada.ad”print(ls[ls.rfind(‘.’)+1:])“`-2.os.path模块“`pythonimportos.pathdeffile_extension(path):return…01007相关推荐2019-09-2821:13−…

    2022年9月22日
    1
  • noip宝藏_拼图寻宝图书馆

    noip宝藏_拼图寻宝图书馆寻宝#include<bits/stdc++.h>usingnamespacestd;constintN=10009,M=109;intn,m,a[N][M],num[N][M],qty[N];intmain(){ scanf(“%d%d”,&n,&m); for(inti=1;i<=n;i++){ for(intj=0;j<m;j++){ scanf(“%d%

    2022年8月22日
    3
  • TCP报文格式详解

    TCP报文是TCP层传输的数据单元,也叫报文段。端口号:用来标识同一台计算机的不同的应用进程。源端口:源端口和IP地址的作用是标识报文的返回地址。目的端口:端口指明接收方计算机上的应用程序接口。TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接。序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。

    2022年4月7日
    46
  • opencv保存图片小bug

    opencv保存图片小bug错误:cv2.error:OpenCV(4.4.0)C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-6sxsq0tp\opencv\modules\imgcodecs\src\loadsave.cpp:667:error:(-2:Unspecifiederror)couldnotfindawriterforthespecifiedextensioninfunction’cv::imwrite_’图片路径不对,

    2022年6月23日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号