深入浅出计算机组成原理
徐文浩
bothub 创始人
70432 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
深入浅出计算机组成原理
15
15
1.0x
00:00/00:00
登录|注册

05 | 计算机指令:让我们试试用纸带编程

了解了MIPS指令集和机器码的生成方式
掌握了汇编语言和机器码的关系
理解了CPU的功能和指令集
了解了计算机指令和机器码的生成过程
不同类型的语言最终都转换成CPU可执行的机器码
机器码存储在存储器中,由CPU执行
程序经过编译和汇编转换成机器码
MIPS指令通过操作码和寄存器地址生成机器码
MIPS指令分为R、I和J三种格式
MIPS指令是32位整数,包括操作码、寄存器地址和功能码
机器码是CPU能够理解的一串二进制数字
汇编器将汇编代码翻译成机器码
汇编语言是机器码的助记符,便于程序员理解和记忆
计算机指令分为算术、数据传输、逻辑、条件分支和无条件跳转指令
不同CPU支持不同的指令集,如Intel和ARM CPU
CPU是计算机的中央处理器,执行各种计算机指令
高级语言编写的程序经过编译和汇编转换成机器码
CPU执行计算机指令,即机器语言
早期的计算机程序使用打孔卡,将程序和数据存储在纸带或卡片上
总结
程序执行过程
MIPS指令集
汇编语言和机器码
CPU的功能和指令集
计算机指令和机器码的生成过程
计算机指令和机器码

该思维导图由 AI 生成,仅供参考

你在学写程序的时候,有没有想过,古老年代的计算机程序是怎么写出来的?
上大学的时候,我们系里教 C 语言程序设计的老师说,他们当年学写程序的时候,不像现在这样,都是用一种古老的物理设备,叫作“打孔卡(Punched Card)”。用这种设备写程序,可没法像今天这样,掏出键盘就能打字,而是要先在脑海里或者在纸上写出程序,然后在纸带或者卡片上打洞。这样,要写的程序、要处理的数据,就变成一条条纸带或者一张张卡片,之后再交给当时的计算机去处理。
上世纪60年代晚期或70年代初期,Arnold Reinold拍摄的FORTRAN计算程序的穿孔卡照片
你看这个穿孔纸带是不是有点儿像我们现在考试用的答题卡?那个时候,人们在特定的位置上打洞或者不打洞,来代表“0”或者“1”。
为什么早期的计算机程序要使用打孔卡,而不能像我们现在一样,用 C 或者 Python 这样的高级语言来写呢?原因很简单,因为计算机或者说 CPU 本身,并没有能力理解这些高级语言。即使在 2019 年的今天,我们使用的现代个人计算机,仍然只能处理所谓的“机器码”,也就是一连串的“0”和“1”这样的数字。
那么,我们每天用高级语言的程序,最终是怎么变成一串串“0”和“1”的?这一串串“0”和“1”又是怎么在 CPU 中处理的?今天,我们就来仔细介绍一下,“机器码”和“计算机指令”到底是怎么回事。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了计算机指令的生成和执行过程,从早期计算机使用打孔卡编程的方式到现代计算机指令的生成过程。文章首先介绍了早期计算机程序是如何通过打孔卡来表示指令和数据的,以及为什么计算机需要使用机器码来执行程序。接着,文章解释了CPU作为计算机的大脑,执行各种计算机指令的逻辑机器。然后,文章介绍了不同CPU支持不同的指令集,以及程序指令存储在存储器中的存储程序型计算机。最后,文章详细解释了从高级语言到汇编代码,再到机器码的转换过程,帮助读者了解程序最终是如何变成CPU可以执行的计算机指令。通过本文,读者可以深入了解计算机指令的生成和执行过程,从而更好地理解计算机工作原理。文章内容涵盖了计算机指令的基本概念、指令集的分类和机器码的生成方式,对于对计算机指令感兴趣的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入浅出计算机组成原理》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(135)

  • 最新
  • 精选
  • lzhao
    机器码不是二进制吗?为什么gcc把汇编编译成16进制?

    作者回复: l'hao同学你好,是二进制,16进制只是为了显示方便,毕竟一串0和1在显示上太没有效率了

    2019-05-03
    11
    77
  • 周曙光爱学习
    指令和机器码的关系是?可以理解为cpu指令类似数学公式,我们写的程序在套用这些公式,然后公式+参数生成机器码?

    作者回复: 👍,周曙光爱学习同学你好,这个理解和比喻很形象

    2019-05-09
    51
  • coder
    老师您好,说到指令,让我想起来困惑我本科时期很久的一个问题: 用C或者其他的高级语言可以实现更多的语言,那么这么一直追问下去,就有个类似蛋生鸡的问题,第一个编程语言是怎么来的? 编程语言一般会有"自举"的功能,那么自举是怎么实现的?比如说Go语言就是自己实现自己,那么在没有Go编译器的基础上,怎么做到自己编译自己的?

    作者回复: json同学你好,第一台计算机ENIAC,如果你去计算机历史博物馆看一下真机就会明白,他的各种输入都是一些旋钮,可以认为是类似用机器码在编程,后来才有了汇编、C这样越来越高级的语言。 编程语言是自举的,并不需要第一个编译器就是用自己这个语言来写的。通常是先有了别的语言写好的编译器,然后再用自己来写自己语言的编译器。 更详细的关于鸡蛋问题,可以直接看Wikipedia上,讲了多种这个问题的解决方案 https://en.wikipedia.org/wiki/Bootstrapping_(compilers)

    2019-05-05
    5
    50
  • 我们说过,不同的 CPU 有不同的指令集,也就对应着不同的汇编语言和机器码 这句话中,在不同的指令集中 汇编语言和机器码 的关系是怎么对应的呢? 还有一个问题就是在高级语言转换为机器码的时候 是不是要读取CPU的具体的型号呢? 然后在转换为 对应CPU型号的机器码。 如果是,那么物理机器是不是要维护一个很大的对应关系表???

    作者回复: 一步同学你好, 不同指令集里,对应的汇编代码会对应这个指令集的机器码呀。 大家不要把“汇编语言”当成是像C一样的一门统一编程语言。 “汇编语言”其实可以理解成“机器码”的一种别名或者书写方式,不同的指令集和体系结构的机器会有不同的“机器码” 高级语言在转换成为机器码的时候,是通过编译器进行的,需要编译器指定编译成哪种汇编/机器码。 物理机自己执行的时候只有机器码,并不认识汇编代码。 编译器如果支持编译成不同的体系结构的汇编/机器码,就要维护很多不同的对应关系表,但是这个表并不会太大。以最复杂的Intel X86的指令集为例,也只有2000条不同的指令而已。

    2019-05-04
    5
    32
  • 二星球
    老师您好,我想问一个问题,C语言>汇编语言>机器语言 一般是这样的编译顺序,为什么不是 C语言>机器语言 一步到位这样编译呢?

    作者回复: 杨怀同学你好,其实有一步到位的,就是两个步骤都通过一个命令先后执行,顺序完成,gcc现在就可以一个命令直接变成可执行的binary。 只是为了方便debug,你可以认为通过机器语言我们也可以反推出汇编语言长什么样子。

    2019-05-04
    28
  • Ant
    最后的卡片 02324020 ,为啥不是从最底下或最上面开始, 为啥3 打了俩孔, 为啥4 又 往上了一行

    作者回复: 顺序是根据用什么样的机器读取来的,我们这里假设就是从左往右一列一列读取的。 一列卡片代表一个数,白色代表没有打孔,黑色代表打孔。3换算成二进制就是 0011,也就是上面两个不打孔,下面两个打孔,4就换算成 0100,也就是第二个打孔,其他的不打孔

    2019-05-10
    2
    27
  • 梨子🍐
    没有理解 `0X02324020` 是如何计算出来的?

    作者回复: 梨子同学你好,你把把上一行的二进制,四位四位一读,每四位当成是一个16进制数,就会得到这个结果

    2019-05-03
    7
    19
  • ginger
    看到指令,联想到上一讲的cpu性能和指令数的关系,这里想提问下: 是否可以通过将指令更加细分(功能上的细分,比如指令ab完成a+b,指令abc完成a+b+c) 来实现一个高级语言本身需要对应到10条指令时候,变成了只需要对应7条指令的效果, 我想这个一定是可行的,但应该没什么意义,因为cpu的指令集,发展了这么多年了,应该也是没有优化的空间了吧.

    作者回复: 可以的,这个就是历史上的CISC和RISC的争论。 其实指令集都在不断更新微调。而体系结构最近RISC-V又火起来了。 因为纯粹靠提升频率硬件的方法已经没有什么空间了,所以其实又进入了优化指令集乃至整个体系结构的阶段了。

    2019-05-24
    16
  • 寇云
    有幸去了山景城的计算机历史博物馆,对老师讲的课程非常有感觉

    作者回复: 👍,我也去了,那个地方超棒,我决定明年再去呆一天。

    2019-05-20
    3
    13
  • Nevermore
    老师shell脚本是一步编译成机器码的吗?还是转换成汇编再编译成机器码

    作者回复: 如果在这个映射关系里面,可以认为shell脚本是被bash解释器来运行的,调用对应的编译好的二进制可执行文件相当于bash解释器在做对应的“翻译”动作

    2019-05-12
    12
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部