15|C与汇编:揭秘C语言编译器的“搬砖”日常
LMOS
你好,我是 LMOS。
通过上一节课的学习,我们已经清楚了 C 语言可以把程序抽象成一个函数,这样的函数又抽象成表达式和流程控制,表达式又能进一步抽象成各种类型的变量和各种运算符。并且我们还搞懂了变量就是数据,运算符就是操作,而变量的运算结合起来就能对数据施加操作。这样拆分下来,是不是 C 语言就没那么神秘了?
此外,我还会带你了解函数间的调用规范,这能让我们在以后写代码时,清楚自己的每行代码都会被编译器转化为什么样的机器指令。
C 变量
现在,我们从最基本的 C 语言的变量开始说起。
C 语言是如何把各种类型的变量转换成对应的汇编语言呢?高级语言更容易被工程师理解,而汇编语言这样的低级语言,则更容易被机器解读。这是因为汇编语言里的大部分内容都跟机器语言一一对应,你可以这样理解,汇编语言就是把机器语言符号化。
我举个例子让你加深理解,机器对应的加法指令是一段很长的二进制数据,在汇编语言中,这个指令就对应着“add”这个指令。无论是机器指令还是寄存器,经过汇编语言“翻译”出来都是符号。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
C语言编译器的“搬砖日常”:深入探析C语言转化为汇编语言的过程 本文深入探讨了C语言编译器的日常工作,重点解析了C语言变量转换成对应的汇编语言的过程。文章首先介绍了C语言的基本概念,然后详细讨论了C语言变量如何转换成对应的汇编语言。通过示例说明了汇编语言和机器语言的对应关系,以及汇编器生成的二进制程序文件的结构和内容。通过对生成的临时文件和二进制文件的分析,读者可以清晰地了解C语言转化成汇编语言的过程。此外,文章还介绍了C语言函数和表达式、流程控制的转换成汇编语言的过程,为读者提供了全面的技术知识。另外,文章还探讨了C语言调用规范,包括寄存器的用途、保存和恢复规则,以及函数参数传递和返回值的规范。通过实例验证了C语言函数的参数传递和返回值的规范。整体而言,本文以清晰的语言和详细的示例,帮助读者深入理解了C语言编译器的工作原理,以及C语言调用规范。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《计算机基础实战课》,新⼈⾸单¥68
《计算机基础实战课》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(3)
- 最新
- 精选
- LockedX结构体要根据是否指针传递来判断传参方式: 1. 值传递 这种情况下,会把结构体里面的变量当作参数来传递,有多少个参数就会使用多少个参数寄存器,和多参数函数传参一样 2. 指针传递 这个时候用a0寄存器传递指针就可以完成结构体参数传递 所以尽量用指针传递结构体参数(只利用了一个寄存器)能提高性能
作者回复: 是的
2022-09-02归属地:湖北3 - TableBear根据C变量那一节的内容,结构体的存储格式是一块整齐的连续内存,里面聚合了各种类型的变量。所以C语言函数传递结构体类型参数时,应该是将整个结构体拆散,然后每种类型的字段按照对应的传参方式进行传递。
作者回复: 有很多种方法 你说的算一种
2022-08-30归属地:湖北2 - 苏流郁宓请问 C 语言函数如何传递结构体类型的参数呢? 建立栈模型?(一类先进后出的数据类型),但栈是加载到内存上,也就是加到cpu内部,就是一组组数据指令,实际上,cpu运算器90%以上的时间是和寄存器与cache打交道,毕竟从内存直接取数据效率过低! 纵然如此,cpu的浪费也是惊人的(意味着,仍然有很多资源没有充分利用好,就比如维护数据一致性导致的浪费) 俺有个不懂的问题。由于内存到cpu的时间效率低于cpu内部效率,那能不能优化数据结构,把命中率高的数据在cpu运算时,加载到cache上?(这个加不加载到cache上应该是硬件工程师考虑的吧),方便及时取数据!
作者回复: 你说对 ,但也是软件工程师该考虑优化的点 这需要软硬结合
2022-08-29归属地:湖北1
收起评论