`
deltamaster
  • 浏览: 7876 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

C语言位移运算的编译

阅读更多

  位运算是底层开发中常用的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语言位运算中鲜为人知的事.pdf

    C语言是一种广泛使用的编程语言,特别是在系统编程中,其位运算功能是实现底层操作不可或缺的工具。位运算允许程序员直接在内存中的二进制位级别上进行操作,这为优化程序性能和处理硬件相关的任务提供了极大的灵活...

    c语言实验指导书

    在这个实验中,将指导学生学习C语言的位运算,包括位运算符、位移运算等内容。这将帮助学生掌握C语言的位运算和编程技巧。 实验12:文件 在这个实验中,将指导学生学习C语言的文件操作,包括文件的读写、文件的...

    C语言进阶(嵌入式高级C语言编程)

    这包括位移操作、位逻辑运算(如与、或、异或)以及位字段。 此外,理解预处理器宏和编译时计算也是C语言进阶的一部分。预处理器宏可以用于代码的条件编译,减少代码重复,甚至实现简单的函数式编程。编译时计算则...

    c语言 TC201E c语言 TC201E c语言 TC201E

    8. **位运算**:位移、按位与、按位或、按位异或等操作,用于低级数据处理和位逻辑运算。 9. **预处理**:宏定义、条件编译等预处理指令的应用。 10. **错误处理和调试**:学会使用编译器的错误提示,理解运行时错误...

    C语言中位运算置0操作

    C语言中位运算置0操作 在C语言中,位运算是一种非常重要的操作,经常用于对二进制数据进行操作。在本文中,我们将详细介绍C语言中位运算置0操作的实现方法。 位运算的定义 位运算是指对二进制数据进行操作的...

    C语言课件(C语言基础)

    9. **位运算**:第12章讲述了位运算符,如按位与、按位或、按位异或和位移,这些在底层编程和优化代码时十分关键。 10. **全国计算机等级考试(二级)---C语言程序设计考试大纲及习题**:附录中的PPT提供了考试大纲...

    C语言进阶基础,快速熟悉C语言

    5. **位运算**:C语言支持位级别的操作,如位移、按位与、按位或、按位异或,这对于低级别硬件操作和高效算法实现非常有用。 6. **内存管理**:动态内存分配(malloc、calloc、realloc、free)是C语言的一大特色,...

    c语言—谭浩强C语言关键技术的详细描述

    11. **位运算**:C语言支持位级操作,如位移、按位与、按位或、按位异或等,这对于底层编程和硬件交互至关重要。 12. **标准库函数**:如数学函数、输入/输出函数、字符串处理函数等,是C语言开发中常用的辅助工具...

    C语言试题 历年考试真题及答案合集

    9. **位运算**:理解二进制运算,如位移、按位与、按位或、按位异或等,这些在特定场景下有重要作用。 通过【全国计算机等级考试二级C语言历年试题及答案合集.CHM】,考生可以系统地进行模拟练习,检查自己的薄弱...

    SHA运算-c语言版本

    在C语言环境中实现SHA-512运算,通常涉及到以下几个核心知识点: 1. **散列函数的基本概念**:散列函数是将任意长度的输入(又称预映射或消息)转化为固定长度输出的函数。这种转换的输出值称为散列值或摘要。SHA-...

    c语言经典源代码(C语言学习者必看)

    在C语言中,源代码是由一系列函数、变量定义和控制结构组成的文本文件,这些文件经过编译后生成可执行程序。通过研究经典的C语言源代码,我们可以学到以下关键知识点: 1. **基本语法**:C语言的语法简洁而直接,...

    c语言精品课 c语言精品课

    10. **位运算**:介绍位操作符,如何进行位移、按位与、按位或、按位异或等操作,以及它们在实际问题中的应用。 11. **编程实践**:通过一系列的练习题和项目,让学习者将理论知识转化为实际编程能力,培养解决问题...

    C语言 高级C语言 单片机高级C语言 嵌入式高级C语言

    4. **位运算**:掌握位运算符,如位移、与、或、异或,用于高效地操作硬件寄存器。 5. **预处理器宏**:理解预处理器的作用,学习宏定义和条件编译,以便在不同环境下编写可复用的代码。 6. **错误处理**:学习...

    清华大学C语言PPT

    9. **第九章_预处理命令**:预处理器在编译阶段的角色,如宏定义、条件编译等,这些都是C语言中提高代码可读性和复用性的重要工具。 10. **第十章_指针**:C语言的精髓之一,讲解指针的声明、使用,通过指针操作...

    c语言软件 好用的软件制作

    - C语言支持位级操作,如位移、按位与、按位或、按位异或,这对于底层编程和硬件交互特别有用。 8. **错误处理**: - C语言没有内置的异常处理机制,但通过返回值和全局错误代码,开发者可以自定义错误处理策略。...

    c语言经典汇总

    C语言支持位级操作,如位移、按位与、按位或、按位异或等,这些操作在底层硬件编程和数据编码中非常有用。 九、错误处理 在C语言编程中,错误处理通常是通过检查函数返回值和设置全局变量来实现的,如errno和perror...

    2022年专业二级C语言知识点大盘点经典.doc

    位运算是C语言中的基本概念,包括位移运算和位逻辑运算。位移运算包括左移和右移,位逻辑运算包括与、或、非等。 十、转义字符 转义字符是C语言中的特殊字符,包括换行符、回车符、制表符等。转义字符可以用于格式...

    C语言作业习题 此为C语言有关的习题作业

    9. **位运算**:C语言支持对二进制位进行操作,如位移、按位与、按位或、按位异或等。这在处理硬件接口或低级别编程时非常重要。 10. **标准库函数**:C语言标准库提供了大量功能函数,如数学运算、字符串处理、...

    c语言高级应用程序

    预处理器宏是C语言的特色,它们可以在编译时进行文本替换,实现代码复用和条件编译。头文件用于组织和共享代码,理解如何正确使用#include指令和如何创建自定义头文件对于模块化编程至关重要。 三、函数和递归 ...

    华东交大c语言考试复习试题

    11. **位运算**:C语言支持对整数类型的位进行操作,如位移、按位与、按位或、按位异或等,常用于低级编程和优化。 12. **标准库函数**:如数学函数(sin、cos、exp等)、字符串处理(strcpy、strcat、strcmp等)和...

Global site tag (gtag.js) - Google Analytics