计算机基础实战课
彭东
网名 LMOS,Intel 傲腾项目关键开发者
19719 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
计算机基础实战课
15
15
1.0x
00:00/00:00
登录|注册

14|走进C语言:高级语言怎样抽象执行逻辑?

你好,我是 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
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • LockedX
    RISC-V Support,RISCV汇编高亮显示 RISC-V Venus Simulator,RISCV汇编仿真调试 要调试RISCV汇编的话,VSCode要安装这两个插件才行

    作者回复: 看的出来 你成功了

    2022-08-27归属地:湖北
    3
    13
  • Liu Zheng
    老师您好。想问一下,vscode里面我调试C语言代码可以加断点,但是跑汇编代码加不了断点,怎么解决呢?用riscv64-unknown-elf-gcc编译了直接在命令行里用qemu-risc32 main.elf跑是没有问题的。但是用vscode调试没法加断点。 谢谢老师

    作者回复: 加不了 断点 是vscode中加不上吗

    2022-08-28归属地:湖北
    5
    2
  • 熊悟空的凶
    安装好插件后 进行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归属地:四川
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部