首页 > 编程知识 正文

移位指令左移一位表示什么,plc编程基本逻辑指令大全

时间:2023-05-05 14:02:47 阅读:57706 作者:3652

移位指令是一组常用的指令,例如:算术移位、逻辑移位、双精度移位、循环移位、进位循环移位等;

移位指令中有指定要移动的位数的操作数。 操作数可以是立即数或CL值。 在8086中只有1个操作数,但在随后的CPU中,即时计数可以是定义域[ 1,31 ]中的计数;

一.算术移位指令:

算术移位命令分为:算术左移sal(shiftalgebraicleft )和算术右移sar (shiftalgebraicright )。

指令格式: 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指定的位数; 移位后,空的高位部分全部用目标操作数的原始的最高位(符号位)填充; 如果仅向右移动一个比特,则空闲的最高有效比特由所需操作数的原始最高有效比特(已编码比特)填充,并且移动的最低有效比特存储在CF中; 向右移动n位时,所有空的n个高位都用所需操作数的原始最高位(符号位)填充,在移动的n个低位中,只有最后移动的位存储在CF中。 也就是说,CF中存储的是最后移动的内容。 换句话说,对于算术右移,用目标操作数的原始最高位值填充空的高位。 也就是说,最高位保持不变,最低位也同样填充到CF中。 算术右移常用于有符号数右移; SAR效果如下图所示,为:

2010年07月16日-哥哥-哥哥

二.逻辑移位指令:

逻辑移位可分为:逻辑左移SHL (移位)和逻辑右移SHR (移位);

指令格式: 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(shiftleftdouble )和双精度右移shrd (shiftrightdouble ); 此命令有三个操作数。

指令格式: 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 (旋转左)和循环右移ROR (旋转右);

指令格式: ROL/ROR reg/mem,CL/imm

受影响的标志位为:CF,仅OF;

这两个指令不在循环位中包括进位标志CF;

循环左移ROL:将操作数的较低部分向上循环移位由CL/imm指定的位数,空的较低部分由移位的较高部分填充,并且移位后的较高部分存储在CF中; 如果要循环地向左移动n位,则空出n个低位,去除n个高位,然后,按照抽出的顺序依次填充空出的n个低位。 同时,在CF中只保存最后输出的比特的内容; ROL效果如下图所示,为:

2010年07月16日-哥哥-哥哥

循环右移位ROR:将操作数的高位部分向下循环移位由CL/imm指定的位数,空闲的高位部分由移位的低位部分填充,同时移位的低位部分存储在CF中; 如果要向循环右边移动n位,则空出前n个,去掉后n个,然后,在空出的n个高位中,按照空出的顺序,依次填入所抽出的n个低位。 同时,在CF中只保存最后输出的位数的内容; 如下图所示,ROR效果为:

2

010年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的影响没有定义;

文中图片已丢失
原文:http://bdxnote.blog.163.com/blog/static/8444235201061610333135/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。