首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言移位运算的编译

2012-10-07 
C语言位移运算的编译  位运算是底层开发中常用的C语言运算,移位运算是相当有用的一种运算。举例说明:?main:

C语言位移运算的编译

  位运算是底层开发中常用的C语言运算,移位运算是相当有用的一种运算。举例说明:

?

main:.LFB0:.cfi_startprocpushl%ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl%esp, %ebp.cfi_def_cfa_register 5andl$-8, %esp //内存对齐(由于存在64位长度的栈数据)subl$32, %espmovl28(%esp), %eax //变量a读入寄存器eax,时钟周期数4sall$16, %eax //一条位移指令就解决了位移,$16是立即数,时钟周期数3movl%eax, 24(%esp) //写回变量b,时钟周期数2movl16(%esp), %eax //这里是变量c的低32位,时钟周期数4movl20(%esp), %edx //这里是变量c的高32位,时钟周期数4shldl$16, %eax, %edx //双精度位移,时钟周期数3sall$16, %eax //普通位移,时钟周期数3movl%eax, 8(%esp) //写回变量d低32位,时钟周期数2movl%edx, 12(%esp) //写回变量d高32位,时钟周期数2movl$0, %eaxleave.cfi_restore 5.cfi_def_cfa 4, 4ret.cfi_endproc

?

  这里有一个比较特殊的指令shld,是双精度位移指令,这条指令会将低32位与高32位同时进行左移操作,低32位移出的部分会自动填充到高32位中去,完成以后低32位会被还原为移位以前的状态。因此在完成双精度位移以后,还需要再对低32位进行一次位移才能够满足要求。

?

  在x86体系下,完成C语言64位数据位移的时钟周期数恰好是32位数据位移的时钟周期数的两倍。

?

?

热点排行