计算机系统基础学习笔记(2)-数据的位运算操作 C语言的位运算操作包括两类,逻辑运算操作和逻辑移位操作。 逻辑运算操作 C语言提供了四种按位逻辑操作符,分别是按位取反,按位与,按位或,按位异或。在编译时,编译器会根据操作数的宽度分别转换为不同的指令。
注意: C语言的逻辑与(&&)、逻辑或(||)、逻辑非(!)并没有对应的机器指令,而是由多条指令联合来实现这些功能,完成以变量为单位的逻辑操作。 下面我们以一个简单的C语言程序test.c来了解逻辑运算操作过程。 利用gcc命令将其进行编译成可执行文件。 利用objdump命令进行反汇编并将其重定向到test.txt文件方便查看。 main函数所对应的汇编指令如下所示。 由以上代码可以看出a,b,c取反的三个操作分别对应以下指令。 其中变量a和变量b的取反指令都是notl,处理的是4字节的变量。而变量c的取反指令执行的是notw,执行的是2字节的变量。这也就说明了编译器会根据操作数的宽度分别转换为不同的指令。 下表给出C语言基本数据和类型和IA-32操作数类型的对应关系
仍然以下面这样一个简单的C语言程序来理解逻辑与(&&)、逻辑或(||)、逻辑非(!)和按位逻辑操作符的区别。 利用gcc命令将其进行编译,objdump命令进行反汇编之后,main函数所对应的汇编指令如下所示。 机器指令逻辑非(!)实现的操作解释,以a = !a这个作为例子: 首先将变量a与常数0进行比较,如果相等就置寄存器al为1,不等则置为0,然后再把寄存器al的值扩展0扩展送到eax寄存器中,再从寄存器eax中送回到变量a的地址当中。 机器指令逻辑与(&&)实现的操作解释,以d = a&&b来解释。 首先将变量a与0进行相比,如果变量a等于0,就跳到554这个位置,也就是执行指令,就是把0送到寄存器eax里面,再送到变量d当中。如果变量a不等于0,就用变量b与0相比,如果b等于0,也是跳转到554这个位置去将最终的结果设置为0,如果变量b也不等于0,就把1送到寄存器eax当中,将最终的结果设置为1。 机器指令逻辑或(||)实现的操作解释,以d = a||b来解释 首先将变量a与0进行相比,如果变量a不等于0,就跳转到558这个位置,也就是执行指令,把1送到寄存器eax里面,无条件转到574这个位置,并将eax的值送到变量d当中。如果变量a等于0,就将变量b与0比较,如果b等于0,就跳转到56f这个位置,去将最终的结果设置为0。 逻辑移位操作 C语言的移位操作包括逻辑左移,算术左移,逻辑右移,算术右移等四种。
注意:IA-32中的其他移位指令没有对应的C语言操作,如想实现循环移位指令,需要编写多条语句来实现。 逻辑移位和算术移位的C语言操作符相同,编译器会根据操作数的不同来选择不同的指令。。 我们仍然以一个简单的C语言指令来为大家介绍逻辑移位操作的汇编指令。 利用gcc命令将其进行编译,objdump命令进行反汇编之后,main函数所对应的汇编指令如下所示 从这条指令可以清楚的看到当执行a右移4位的操作时,因为a是有符号数,所以执行的就是算术右移,对应的汇编指令sarl。而执行b右移时,因为b是无符号数,所以执行的是逻辑右移指令,对应汇编指令shrl。 由这8条指令可以看出,在执行a=c的时候,执行的是符号扩展指令,z=d时执行的是零扩展指令,b=c时执行的是符号扩展指令,b=d时执行的是零扩展指令。因此我们可以看出,。 位运算的作用 可实现特定的功能:取特定位、保留特定位周期短速度快:左移、右移可用于实现快速的整数乘、除法可实现其他功能:原位交换 PS:交换变量a和变量b的值 普通方法 位操作交换法 位操作法原理: 以上内容就是本次我给大家分享的计算机系统基础学习的笔记-数据的位运算操作,小编也是初次入门,有什么地方写的不对的,还请多多指教。觉得还不错的点个赞支持一下小编,你的肯定就是小编前进的动力。另外如果想了解更多计算机专业的知识和技巧的,献上我的个人博客北徯,另外需要各种资料的童鞋,可以我的北徯,免费的PPT模板,各种资料等你来领。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/40844.html