论文部分内容阅读
摘 要: 移位运算是汇编语言中常见的一种运算形式,左移n位会将输入的内容乘以2的n次幂(2n),右移n位使输入的内容除以2的n次幂(2n)。在学生学习的过程中,对整数的移位操作,做了较详细的讲解。而对于小数的移位操作没有提到,很多学生对此产生了迷惑。通过本文的讲解,学生能更好的掌握移位运算。
关键词: 汇编语言;逻辑移位;算术移位
【中图分类号】 TP301 【文献标识码】 A 【文章编号】 2236-1879(2017)13-0204-02
Abstract:The shift operation is a common form of operation in assembly language. The left shift n bits will multiply the input by 2 of the power of n(2n). The right shift n bits will divide the input by 2 of the power of n. In the process of students, learning ,the shift operation of integer is explained in detail. Because the shift operation of decimal is not mentioned, many students have confused about this. Students can grasp the shift operation skillfully through the article.
Keywords: assembly language; logic shift; arithmetic shift
汇编语言中,移位操作是比较常见的,如乘除运算就可以通过移位指令来完成[1]。移位分为逻辑移位和算术移位,逻辑移位对应的是无符号数,不考虑符号位。对于无符号整数的逻辑左移,最高位移出的是1,则发生溢出,因为计算机内部的有符号整数都是用补码来表述的,所以对于有符号整数的移位操作用采用补码算术移位方式,左移时高位移出,低位补0,如果移出的高位不同于移位后的符号位,即左移前、后符号位不同,则发生溢出,右移时低位溢出,高位补符号[2]。
对于小数,又该如何移位呢?下面,用例子来进行说明:
将无符号数0010 0011.0010B=35.125逻辑左移3位,每左移1位,相当于乘以2,35.125乘以2应等于70.25.按照整数移位的思路试一下是否成立,高位移出,移位补0。
(0010 0011.0010B=35.125)→(左移一位)→(0100 0110.0100B=70.25)
(0100 0110.0100B=70.25)→(左移一位)→(1000 1100.1000B=140.5)
(10001 100.1000B=140.5)→(左移一位)→(0001 1001.0000=25)
10001 100.1000B=140.5乘以2等于281,八位二进制数表示的无符号数范围是0~255,281超出此范围,导致运算结果错误。
从上面的运算结果可以看出,小数的逻辑左移同整数的逻辑左移是一致的,高位移出,低位补0,当移出的最高位为1时,产生溢出,导致结果错误。由于整数的逻辑左移和算术左移一致,因此小数的逻辑左移和算术左移也是一样的。
那么,小数的右移是否和整数相同呢?先将无符号数1101 0001.1000B=209.5进行逻辑右移。
(1101 0001.1000B=209.5)→(右移一位)→(0110 1000.1100B=104.75)
(0110 1000.1100B=104.75)→(右移一位)→(0011 0100.0110B=52.375)
(0011 0100.0110B=52.375)→(右移一位)→(0001 1010.0011B=26.1875)
(0001 1010.0011B=26.1875)→(右移一位)→(0000 1010.0001B=13.0625)
从移位结果可以看出,当移出的位为0时,小数的右移同整数是一致的,而当移出的位为1时,运算结果错误。
如果1101 0001.1000B是有符号数,最高位是符号位,移位过程中,符号位必须保持不变[3],对1101 0001.1000B=-81.5进行算术移位。
(1101 0001.1000B=-81.5)→(右移一位)→(1010 1000.1100B=-40.75)
(1010 1000.1100B=-40.75)→(右移一位)→(1001 0100.0110B=-20.375)
(1001 0100.0110B=-20.375)→(右移一位)→(1000 1010.0011B=-10.1875)
(1000 1010.0011B=-10.1875)→(右移一位)→(1000 0101.0001B=-5.0625)
移出的位是0時,结果正确,移出的位是1時,结果错误。因此,有符号小数的算术右移和整数的算术右移也是一致的。
综上所述,无论是有符号小数还是无符号小数,其逻辑移位和算术移位与整数都是一样的,要想保持结果的准确性,移位前后均需在其所表述的数据范围内进行,若超出了限制,则会产生溢出,导致运算结果错误。
参考文献
[1] 马春燕,段承先,秦文萍.微机原理与接口技术(基于32位)[M].北京:电子工业出版社,2007,1.
[2] 孙程智.浅谈计算机C程序运算涉及[J].科学技术,2016(4):153.
[3] 冯文超.浅谈8086汇编语言中SAL指令的应用研究[J].科技信息(学术研究),2007(20):232-233.
关键词: 汇编语言;逻辑移位;算术移位
【中图分类号】 TP301 【文献标识码】 A 【文章编号】 2236-1879(2017)13-0204-02
Abstract:The shift operation is a common form of operation in assembly language. The left shift n bits will multiply the input by 2 of the power of n(2n). The right shift n bits will divide the input by 2 of the power of n. In the process of students, learning ,the shift operation of integer is explained in detail. Because the shift operation of decimal is not mentioned, many students have confused about this. Students can grasp the shift operation skillfully through the article.
Keywords: assembly language; logic shift; arithmetic shift
汇编语言中,移位操作是比较常见的,如乘除运算就可以通过移位指令来完成[1]。移位分为逻辑移位和算术移位,逻辑移位对应的是无符号数,不考虑符号位。对于无符号整数的逻辑左移,最高位移出的是1,则发生溢出,因为计算机内部的有符号整数都是用补码来表述的,所以对于有符号整数的移位操作用采用补码算术移位方式,左移时高位移出,低位补0,如果移出的高位不同于移位后的符号位,即左移前、后符号位不同,则发生溢出,右移时低位溢出,高位补符号[2]。
对于小数,又该如何移位呢?下面,用例子来进行说明:
将无符号数0010 0011.0010B=35.125逻辑左移3位,每左移1位,相当于乘以2,35.125乘以2应等于70.25.按照整数移位的思路试一下是否成立,高位移出,移位补0。
(0010 0011.0010B=35.125)→(左移一位)→(0100 0110.0100B=70.25)
(0100 0110.0100B=70.25)→(左移一位)→(1000 1100.1000B=140.5)
(10001 100.1000B=140.5)→(左移一位)→(0001 1001.0000=25)
10001 100.1000B=140.5乘以2等于281,八位二进制数表示的无符号数范围是0~255,281超出此范围,导致运算结果错误。
从上面的运算结果可以看出,小数的逻辑左移同整数的逻辑左移是一致的,高位移出,低位补0,当移出的最高位为1时,产生溢出,导致结果错误。由于整数的逻辑左移和算术左移一致,因此小数的逻辑左移和算术左移也是一样的。
那么,小数的右移是否和整数相同呢?先将无符号数1101 0001.1000B=209.5进行逻辑右移。
(1101 0001.1000B=209.5)→(右移一位)→(0110 1000.1100B=104.75)
(0110 1000.1100B=104.75)→(右移一位)→(0011 0100.0110B=52.375)
(0011 0100.0110B=52.375)→(右移一位)→(0001 1010.0011B=26.1875)
(0001 1010.0011B=26.1875)→(右移一位)→(0000 1010.0001B=13.0625)
从移位结果可以看出,当移出的位为0时,小数的右移同整数是一致的,而当移出的位为1时,运算结果错误。
如果1101 0001.1000B是有符号数,最高位是符号位,移位过程中,符号位必须保持不变[3],对1101 0001.1000B=-81.5进行算术移位。
(1101 0001.1000B=-81.5)→(右移一位)→(1010 1000.1100B=-40.75)
(1010 1000.1100B=-40.75)→(右移一位)→(1001 0100.0110B=-20.375)
(1001 0100.0110B=-20.375)→(右移一位)→(1000 1010.0011B=-10.1875)
(1000 1010.0011B=-10.1875)→(右移一位)→(1000 0101.0001B=-5.0625)
移出的位是0時,结果正确,移出的位是1時,结果错误。因此,有符号小数的算术右移和整数的算术右移也是一致的。
综上所述,无论是有符号小数还是无符号小数,其逻辑移位和算术移位与整数都是一样的,要想保持结果的准确性,移位前后均需在其所表述的数据范围内进行,若超出了限制,则会产生溢出,导致运算结果错误。
参考文献
[1] 马春燕,段承先,秦文萍.微机原理与接口技术(基于32位)[M].北京:电子工业出版社,2007,1.
[2] 孙程智.浅谈计算机C程序运算涉及[J].科学技术,2016(4):153.
[3] 冯文超.浅谈8086汇编语言中SAL指令的应用研究[J].科技信息(学术研究),2007(20):232-233.