汇编语言—移位指令

汇编语言—移位指令移位指令是一组经常使用的指令,包括:算数移位、逻辑移位、双精度移位、循环移位、带进位的循环移位;移位指令都有一个指定需要移动的二进制位数的操作数,该操作数可以是立即数,也可以是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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 流程追踪高亮图详细实现__activiti版本和flowable版本(支持驳回等)

    流程追踪高亮图详细实现__activiti版本和flowable版本(支持驳回等)在使用流程引擎的过程。如果有一张图示,可以展示流程具体到哪个环节,哪些环节已经执行过了,哪些环节没有执行过,这样子就会显得非常直观,可谓一图胜千言,流程追踪高亮图就是其中一种。一、效果展示二、源码获取activiti版本:https://github.com/wellzhi/springboot-activiti/tree/master/src/main/java/com/dapeng…

    2022年5月21日
    37
  • App的宣传方式?

    ##1.线上渠道各大下载市场、应用商店、大平台、下载站的覆盖,线上推广的第一步是要上线,这是最基础的。无需砸钱,只需最大范围的覆盖,具体有:运营商渠道推广、第三方商店、手机厂商商店、积分墙推广、刷榜推广、社交平台推广、广告平台、换量推广等等很多方式。##2.线下推广主要是手机厂商预装、水货刷机、行货店面刷机、地推、线下活动推广等。##3.是线上宣传PR传播、事件营

    2022年4月5日
    42
  • mac svn使用教程(linux 终端命令)

    使用Homebrew下载svnbrewinstallsvn查询svn下载路径并测试svn安装whichsvnsvn-version检出项目:先进入要检出的项目目录svncheckoutsvn地址

    2022年4月15日
    106
  • SQL 游标使用示例

    SQL 游标使用示例SQL游标(cursor)详细说明及内部循环使用示例定义    游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。    游标是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据。一般复杂的存储过程,都会有游标的出现,他的用处主

    2022年7月12日
    12
  • C语言——冒泡排序[通俗易懂]

    C语言——冒泡排序[通俗易懂]冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。代码如下#include<stdio.h>voidBBsort(intarr[],intsize){ intj,i,tem; for(i=0;i..

    2025年8月9日
    2
  • 集合和数组的相互转换

    集合和数组的相互转换集合和数组相互转换很多时候API的方法只支持集合或数组,比如适配器类中的数据只支持集合,这时候我们就要把数组转换集合。

    2022年6月16日
    28

发表回复

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

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