通用计算机指令,计算机移位指令[通俗易懂]

通用计算机指令,计算机移位指令[通俗易懂]移位指令移位指令对操作数按某种方式左移或右移,移位位数可以由立即数直接给出,或由CL间接给出。移位指令分一般移位指令和循环移位指令。1一般移位指令(1)算术/逻辑左移指令。格式:SALDEST,OPRDSHLDEST,OPRD功能:按照操作数OPRD规定的移位位数,对目的操作数进行左移操作,最高位移入CF中。每移动一位,右边补一位0。如图312(a)所示。目的操作数可以为通用寄存器或存储…

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

移位指令

移位指令对操作数按某种方式左移或右移,移位位数可以由立即数直接给出,或由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,表示无符号数“溢出”。

t3.12.jpg

图 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移入最高位。

t3.13.jpg

图 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数据类型必须一致。

t3.14.jpg

图 3.14  双精度移位指令

SHLD,SHRD指令常用于位串的快速移位、嵌入和删除等操作,影响标志位为SF,ZF,PF,CF,其它标志位无定义。

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

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

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


相关推荐

  • spring事件监听(eventListener)

    spring事件监听(eventListener)原理:观察者模式#spring的事件监听有三个部分组成,事件(ApplicationEvent)、监听器(ApplicationListener)和事件发布操作。事件#事件类需要继承ApplicationEvent,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12…

    2025年6月11日
    0
  • Parallel.ForEach() 并行循环[通俗易懂]

    Parallel.ForEach() 并行循环[通俗易懂]现在的电脑几乎都是多核的,但在软件中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很好的发挥多核的优势。微软的并行运算平台(Microsoft’sParallelComputingPlatform(PCP))提供了这样一个工具,让软件开发人员可以有效的使用多核提供的性能。Parallel.ForEach()和Parallel.For()就是微软并发类的成员。今天做了一个简…

    2022年7月19日
    16
  • winrar3.7-winrar4.0的注冊码[通俗易懂]

    winrar3.7-winrar4.0的注冊码[通俗易懂]首先新建记事本文件(txt文件),把下面红色代码复制进去,然后将文件另存为以rarreg.key为文件名称的文件(当然因为设置的不同,可能出现你保存后的文件为rarreg.key.txt没关系

    2022年7月3日
    43
  • QQ分享 QQ空间分享 API链接:

    QQ分享 QQ空间分享 API链接:

    2021年10月29日
    49
  • Eclipse 导入项目乱码问题(中文乱码)

    Eclipse 导入项目乱码问题(中文乱码)1.修改项目编码格式:鼠标移到项目名,右键->Properties->Resource->TextfileenCoding->更改编码(GBK、UTF-8等)->Apply->OK>退出2.修改整个Eclipse工作空间的编码Window->Preferences->General->Workspace-&gt…

    2022年5月26日
    46
  • GridLayout平均分配空间

    GridLayout平均分配空间GridLayout平均分配空间始末:在使用Gridlayout时,想要做一个横向平均分配的布局,像这样的:都知道,设置一个columnCount配合上app:layout_columnWeight=”1″即可可是当某一个的文字过长时,就会出现下面的情况:解决方案:将所有的TextView加上一个属性:android:layout_width=”0dp”即可。源码:<?…

    2022年6月4日
    116

发表回复

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

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