位运算是底层开发中常用的C语言运算,移位运算是相当有用的一种运算。举例说明:
int main() {
long a;
long b = a << 16;
long long c;
long long d = c << 16;
return 0;
}
在这里写了两种位移运算,是比较典型的,一种是32位长度数据的位移,另一种是64位长度数据的位移。由于x86架构的计算机寄存器长度为32,因此64位的数据位移操作怎样在32位长的寄存器上完成呢?
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-8, %esp //内存对齐(由于存在64位长度的栈数据)
subl $32, %esp
movl 28(%esp), %eax //变量a读入寄存器eax,时钟周期数4
sall $16, %eax //一条位移指令就解决了位移,$16是立即数,时钟周期数3
movl %eax, 24(%esp) //写回变量b,时钟周期数2
movl 16(%esp), %eax //这里是变量c的低32位,时钟周期数4
movl 20(%esp), %edx //这里是变量c的高32位,时钟周期数4
shldl $16, %eax, %edx //双精度位移,时钟周期数3
sall $16, %eax //普通位移,时钟周期数3
movl %eax, 8(%esp) //写回变量d低32位,时钟周期数2
movl %edx, 12(%esp) //写回变量d高32位,时钟周期数2
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
这里有一个比较特殊的指令shld,是双精度位移指令,这条指令会将低32位与高32位同时进行左移操作,低32位移出的部分会自动填充到高32位中去,完成以后低32位会被还原为移位以前的状态。因此在完成双精度位移以后,还需要再对低32位进行一次位移才能够满足要求。
在x86体系下,完成C语言64位数据位移的时钟周期数恰好是32位数据位移的时钟周期数的两倍。
分享到:
相关推荐
c语言位运算c语言位运算c语言位运算c语言位运算c语言位运算
一个c语言 位运算 的程序一个c语言 位运算 的程序一个c语言 位运算 的程序
这是C语言相关的位运算技巧的总结文档资料,对巩固C语言位运算的知识大有裨益。
课程设计的内容及要求: (一)主要内容 1.任务描述 编制一个能够演示执行集合操作的程序: ① 能够实现集合的并、交、差运算; ② 实现集合的元素判定和子集判定运算; ③ 求集合的补集。
C语言逻辑运算和判断 把792分钟换算成小时和分钟表示
用于矩阵运算的调用,可以是卡尔曼滤波或者其他应用等等
C语言位运算 C语言位运算 C语言位运算 C语言位运算 C语言位运算
调用matrix_test();即可测试如下函数, // 创建矩阵 返回矩阵指针 // 创建多个矩阵 返回矩阵指针 // 创建零矩阵 返回矩阵指针 // 创建单位矩阵 返回矩阵指针 // 创建对角矩阵 // 矩阵转变为均匀随机矩阵 ...
工作学习上都需要用到C语言裸机下运算矩阵,找了一些库不是很理想; 浏览了上述博客中博主的程序,发现他 @shuoyueqishilove 写得很清晰, 简明易懂;不过原程序无法直接达到我想在stm32上运行的需求,安全性 也有很...
C语言程序专用编译软件2.0版本RAR压缩文件无须解压密码
C语言 大数运算(无限大小)头文件 支持 + , - , * , / , % ,> , ,>=,,==.流输入>>,流输出<<.
C语言小子集编译程序,实现,词法分析,语法分析,语义分析,目标代码生成
C语言数值运算经典源码 c的基础数值运算,对初学者有点用
c语言中常见编译错误信息详解 解决一些觉的错误
该程序实现了C语言小子集的编译,含词法分析、语法分析、语法检查、四元式的生成。
C语言笔试之编译相关试题 C语言 教材 经典 笔试 面试
介绍c语言中条件编译相关的预编译指令
单片机基础c语言之条件编译,基础的。可以作为入门的了解知识。
c语言预编译教程,比较详细,好不好看后便知,免费分享