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

通用计算机指令,计算机移位指令[通俗易懂]移位指令移位指令对操作数按某种方式左移或右移,移位位数可以由立即数直接给出,或由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,其它标志位无定义。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • vue 加载页面时触发时间_Vue 刷新页面时会触发事件吗「建议收藏」

    vue 加载页面时触发时间_Vue 刷新页面时会触发事件吗「建议收藏」使用localstorage做本地存储,然后我想在刷新页面或者离开页面的调用localstorage方法1、页面刷新使用localstorage,也就是当vue被实例化之后有如下几个可以供你使用:exportdefault{beforecreate(){//创建前状态}created(){//创建完毕状态}beforeMount(){//挂载前状态}mounted(){//…

  • 详解卡尔曼滤波原理[通俗易懂]

    详解卡尔曼滤波原理[通俗易懂]详解卡尔曼滤波原理  在网上看了不少与卡尔曼滤波相关的博客、论文,要么是只谈理论、缺乏感性,或者有感性认识,缺乏理论推导。能兼顾二者的少之又少,直到我看到了国外的一篇博文,真的惊艳到我了,不得不佩服作者这种细致入微的精神,翻译过来跟大家分享一下,

  • C#编写OPC客户端读取OPC服务器的数据(最高效简洁版)「建议收藏」

    C#编写OPC客户端读取OPC服务器的数据(最高效简洁版)「建议收藏」想要了解更多,可以添加扣扣群143440558,免费交流,免费下载以上文件,免费了解更多编写OPC客户端,网上的资料一般是一上来就要求找OPCDAAuto.dll,其实我想说,用VS,那都是多此一举,当然,如果你是在需要,我也可以提供给您最新版OPCDAAuto.dll(v2.2.5.30)(https://download.csdn.net/download/wanghuaihu/11…

  • Python的pywifi模块

    Python的pywifi模块想蹭❤️小姐姐的热点❤️被拒后,我用❤️Python来暴力激活成功教程了WiFi的密码❤️文章目录想蹭❤️小姐姐的热点❤️被拒后,我用❤️Python来暴力激活成功教程了WiFi的密码❤️一、起因背景二、需求分析三、代码实现1、生成密码本2、利用密码本进行自动化的测试3、结果展示四、后续总结一、起因背景这天博主和曾经的一个小姐姐同学凑巧同时坐在了同一辆长途客车上,恰谈之后才了解到原来这位小姐姐家里挺富裕的,居然,开通了无限的流量使用权限,博主心想,既然是老同学了,借用一下这个无限的流量应该是没什么问题吧,反正是

  • WebPack_钢铁雄心4toolpack

    WebPack_钢铁雄心4toolpack关于Devtool该选项控制是否以及如何生成源映射。官网上给出的可选值有:其中一些值适合开发,一些用于生产。对于开发,您通常需要快速的SourceMaps,以bundle的大小为代价,但是对于生产,您需要独立的SourceMaps,这是精确的,并且支持最小化。选择一种源映射样式,以增强调试过程。这些值可以显著地影响构建和重建速度。而不是使用devtool选项还可以使用Sourc…

  • mysql 客户端_推荐一个好用的mysql的客户端工具?

    MySQL作为一个非常流行的关系型数据库,客户端软件其实非常多,下面我简单介绍几个,感兴趣的朋友可以尝试一下:Navicat这是一个比较常用的MySQL客户端软件,界面简洁、功能强大,可以直接查看数据库目录结构,建库建表也非常容易,支持SQL脚本导入导出、数据备份恢复及建模设计等,对于日常管理和维护MySQL数据库来说,是一个非常不错的工具:DBeaver这是一个非常有名的通用数据库管理…

发表回复

您的电子邮箱地址不会被公开。

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