14|走进C语言:高级语言怎样抽象执行逻辑?
LMOS
你好,我是 LMOS。
前面我们设计了迷你 CPU,相信你已经对 CPU 如何执行指令有了一定的了解。
而 CPU 执行的指令,正是由工程师敲出来的高级编程语言产生的,比如我们熟知的 C、C++、Java 等。
平时我们做编程的时候,底层 CPU 如何执行指令已经被封装好了,因此你很少会想到把底层和语言编译联系在一起。但从我自己学习各种编程语言的经历看,从这样一个全新视角重新剖析 C 语言,有助于加深你对它的理解。
这节课我们首先要了解 CPU 执行指令的过程,然后再来分析 C 语言的编译过程,掌握 C 语言的重要组成,最后我们再重点学习 C 语言如何对程序以及程序中的指令和数据进行抽象,变成更易于人类理解的语言(代码从这里下载)。
CPU 执行指令的过程
通过之前的学习,我们已经知道了 CPU 执行一条特定指令的详细过程,它们是取指、译码,执行、访存、回写。这是一个非常详细的硬件底层细节,我们现在再迈一个台阶,站高一点,从软件逻辑的角度看看 CPU 执行多条指令的过程。
这个过程描述起来很简单,就是一个循环。为了让你分清每个步骤,我分点列一下:
1. 以 PC 寄存器中值为内存地址 A,读取内存地址 A 中的数据 ;
2.CPU 把内存地址 A 中的数据作为指令执行,具体执行过程为取指、译码,执行、访存、写回 ;
3. 将 PC 寄存器中的值更新为内存地址 A+(一条指令占用的字节数);
4. 回到第一步。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了CPU执行指令的逻辑过程以及C语言的编译过程。首先,文章详细解释了CPU执行指令的过程,包括取指、译码、执行、访存、回写等步骤,并通过示例代码和调试过程展示了内存和寄存器的变化。接着,文章介绍了C语言的编译过程,从C源代码到二进制机器指令数据的转化过程,并强调了C语言的重要组成部分,包括声明和定义。此外,文章还对声明和定义进行了详细解释,并通过代码验证了声明和定义的使用。最后,文章指出编译器的语法分析过程是层层递归推导,最终构建出语法树,从而检查语言是否正确无误。整体而言,本文通过深入浅出的方式,帮助读者了解了CPU执行指令的逻辑过程以及C语言的编译过程,为读者提供了对C语言的全新视角和深入理解的机会。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《计算机基础实战课》,新⼈⾸单¥68
《计算机基础实战课》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- LockedXRISC-V Support,RISCV汇编高亮显示 RISC-V Venus Simulator,RISCV汇编仿真调试 要调试RISCV汇编的话,VSCode要安装这两个插件才行
作者回复: 看的出来 你成功了
2022-08-27归属地:湖北313 - Liu Zheng老师您好。想问一下,vscode里面我调试C语言代码可以加断点,但是跑汇编代码加不了断点,怎么解决呢?用riscv64-unknown-elf-gcc编译了直接在命令行里用qemu-risc32 main.elf跑是没有问题的。但是用vscode调试没法加断点。 谢谢老师
作者回复: 加不了 断点 是vscode中加不上吗
2022-08-28归属地:湖北52 - 熊悟空的凶安装好插件后 进行debug的 提示一下信息 CC -[M] 正在构建... main.S CC -[M] 正在构建... declaration.c CC -[M] 正在构建... definition.c /usr/lib/riscv64-unknown-elf/bin/ld: cannot find crt0.o: No such file or directory /usr/lib/riscv64-unknown-elf/bin/ld: cannot find -lc /usr/lib/riscv64-unknown-elf/bin/ld: cannot find -lgloss collect2: error: ld returned 1 exit status make: *** [Makefile:37: main.elf] Error 1 * The terminal process "/usr/bin/bash '-c', 'make'" failed to launch (exit code: 2). * Terminal will be reused by tasks, press any key to close it. echo "export LIBRARY_PATH=/usr/lib/aarch64-linux-gnu" >> ~/.bashrc source ~/.bashrc
作者回复: 请使用环境课程中搭建的环境
2022-08-31归属地:湖北1 - 青玉白露编译原理mark
作者回复: 哈哈
2022-10-16归属地:湖北 - Geek_d47998第一行代码是不是有问题.globl main而不是.global main
作者回复: 都 可以的 这两个关键字 gcc 都支持的
2022-09-12归属地:湖北 - Geek_d47998除了需要安装那两个插件,代码还需要再重新放在一个目录下运行,我把十四课代码直接放在十三课目录下(新建了一个lesson14的目录)就无法运行了,应该重新创建一个独立的环境lesson14然后把.vscode和Makefile都扔进去
作者回复: 是的
2022-09-12归属地:湖北 - 苏流郁宓流程控制?c语言代码不一定需要所有的都在cpu上跑一遍,还有main函数是入口,如果按照程序等于算法加数据结构来说,就是赋予不同函数不同的权重(如main为入口,如float与int的存储方式不同),来模拟更直观更抽象的人的思维(毕竟,汇编语言是快,但是数据结构越复杂,那么人对它的理解难度上升) 简而言之,c语言是通过增加抽象层,来实现更接近人的思维,流程控制的好处是降低cpu工作量(不是所有代码都要执行),提升c语言到汇编语言的转化效率!也可以理解为通过优化下的算法加数据结构,来对接汇编语言 操纵cpu的啊!
作者回复: 这么理解 也好
2022-08-26归属地:湖北 - xavier代码反应的是程序员的思想,流程控制对应的就是思想逻辑。 对了,数据类型里面似乎漏了一个 enum。2023-06-20归属地:四川
收起评论