05 | 计算机指令:让我们试试用纸带编程
05 | 计算机指令:让我们试试用纸带编程
讲述:徐文浩
时长14:04大小12.90M
在软硬件接口中,CPU 帮我们做了什么事?
从编译到汇编,代码怎么变成机器码?
解析指令和机器码
总结延伸
推荐阅读
课后思考
赞 97
提建议
精选留言(131)
- ack2019-05-29opcode(6位) 000000 10001 10010 01000 00000 100000 =0000 0010 0011 0010 0100 0000 0010 0000(对应纵向打孔带) =0X02324020共 10 条评论154
- lzhao2019-05-03机器码不是二进制吗?为什么gcc把汇编编译成16进制?
作者回复: l'hao同学你好,是二进制,16进制只是为了显示方便,毕竟一串0和1在显示上太没有效率了
共 10 条评论74 - 郭江伟2019-05-22gjw@gjw:~/csapp/000$ cat simplest.c int main(){ int a=1,b=20; int c=a+b; } 生成的汇编及其具体解释: push %rbp 压栈 ,基址指针 mov %rsp,%rbp 将堆栈寄存器内容移动到基址寄存器 movl $0x1,-0xc(%rbp) 将栈基地址偏移12字节设为1,对应变量a=1 movl $0x14,-0x8(%rbp) 将栈基地址偏移8个字节设为20(16进制14=10进制20),变量b=20 mov -0xc(%rbp),%edx 将栈基地址偏移12字节的数据移动到edx寄存器 mov -0x8(%rbp),%eax 将栈基地址偏移8个字节的数据移动到eax寄存器 add %edx,%eax edx 数据和eax数据相加,结果保存到eax寄存器 mov $0x0,%eax 重置eax寄存器 pop %rbp 弹出栈数据 retq main函数返回并退出展开共 7 条评论74
- coder2019-05-05老师您好,说到指令,让我想起来困惑我本科时期很久的一个问题: 用C或者其他的高级语言可以实现更多的语言,那么这么一直追问下去,就有个类似蛋生鸡的问题,第一个编程语言是怎么来的? 编程语言一般会有"自举"的功能,那么自举是怎么实现的?比如说Go语言就是自己实现自己,那么在没有Go编译器的基础上,怎么做到自己编译自己的?展开
作者回复: json同学你好,第一台计算机ENIAC,如果你去计算机历史博物馆看一下真机就会明白,他的各种输入都是一些旋钮,可以认为是类似用机器码在编程,后来才有了汇编、C这样越来越高级的语言。 编程语言是自举的,并不需要第一个编译器就是用自己这个语言来写的。通常是先有了别的语言写好的编译器,然后再用自己来写自己语言的编译器。 更详细的关于鸡蛋问题,可以直接看Wikipedia上,讲了多种这个问题的解决方案 https://en.wikipedia.org/wiki/Bootstrapping_(compilers)
共 5 条评论48 - 周曙光爱学习2019-05-09指令和机器码的关系是?可以理解为cpu指令类似数学公式,我们写的程序在套用这些公式,然后公式+参数生成机器码?
作者回复: 👍,周曙光爱学习同学你好,这个理解和比喻很形象
45 - 一步2019-05-04我们说过,不同的 CPU 有不同的指令集,也就对应着不同的汇编语言和机器码 这句话中,在不同的指令集中 汇编语言和机器码 的关系是怎么对应的呢? 还有一个问题就是在高级语言转换为机器码的时候 是不是要读取CPU的具体的型号呢? 然后在转换为 对应CPU型号的机器码。 如果是,那么物理机器是不是要维护一个很大的对应关系表???
作者回复: 一步同学你好, 不同指令集里,对应的汇编代码会对应这个指令集的机器码呀。 大家不要把“汇编语言”当成是像C一样的一门统一编程语言。 “汇编语言”其实可以理解成“机器码”的一种别名或者书写方式,不同的指令集和体系结构的机器会有不同的“机器码” 高级语言在转换成为机器码的时候,是通过编译器进行的,需要编译器指定编译成哪种汇编/机器码。 物理机自己执行的时候只有机器码,并不认识汇编代码。 编译器如果支持编译成不同的体系结构的汇编/机器码,就要维护很多不同的对应关系表,但是这个表并不会太大。以最复杂的Intel X86的指令集为例,也只有2000条不同的指令而已。
共 5 条评论30 - 码农桃花源2019-05-12老师请教个问题, 像python这种解释型的语言,需要一行行地编译,那它就不能综合所有的源文件来考虑了,像什么重定向这些怎么实现?或者跳转到某个地址,怎么实现,我担心的是一行一行的解释,看不到程序的全貌,怎么知道我要跳到哪个地址? 谢谢!展开共 3 条评论27
- Ant2019-05-10最后的卡片 02324020 ,为啥不是从最底下或最上面开始, 为啥3 打了俩孔, 为啥4 又 往上了一行
作者回复: 顺序是根据用什么样的机器读取来的,我们这里假设就是从左往右一列一列读取的。 一列卡片代表一个数,白色代表没有打孔,黑色代表打孔。3换算成二进制就是 0011,也就是上面两个不打孔,下面两个打孔,4就换算成 0100,也就是第二个打孔,其他的不打孔
共 2 条评论27 - 二星球2019-05-04老师您好,我想问一个问题,C语言>汇编语言>机器语言 一般是这样的编译顺序,为什么不是 C语言>机器语言 一步到位这样编译呢?
作者回复: 杨怀同学你好,其实有一步到位的,就是两个步骤都通过一个命令先后执行,顺序完成,gcc现在就可以一个命令直接变成可执行的binary。 只是为了方便debug,你可以认为通过机器语言我们也可以反推出汇编语言长什么样子。
26 - 梨子🍐2019-05-03没有理解 `0X02324020` 是如何计算出来的?
作者回复: 梨子同学你好,你把把上一行的二进制,四位四位一读,每四位当成是一个16进制数,就会得到这个结果
共 7 条评论19 - ginger2019-05-24看到指令,联想到上一讲的cpu性能和指令数的关系,这里想提问下: 是否可以通过将指令更加细分(功能上的细分,比如指令ab完成a+b,指令abc完成a+b+c) 来实现一个高级语言本身需要对应到10条指令时候,变成了只需要对应7条指令的效果, 我想这个一定是可行的,但应该没什么意义,因为cpu的指令集,发展了这么多年了,应该也是没有优化的空间了吧.展开
作者回复: 可以的,这个就是历史上的CISC和RISC的争论。 其实指令集都在不断更新微调。而体系结构最近RISC-V又火起来了。 因为纯粹靠提升频率硬件的方法已经没有什么空间了,所以其实又进入了优化指令集乃至整个体系结构的阶段了。
15 - 寇云2019-05-20有幸去了山景城的计算机历史博物馆,对老师讲的课程非常有感觉
作者回复: 👍,我也去了,那个地方超棒,我决定明年再去呆一天。
共 2 条评论12 - 冰激凌的眼泪2019-05-12打孔卡要纵向读,建议Opcode补足6个0,这样好和打孔卡对照 汇编是不是可以看做机器码的助记符?共 2 条评论12
- Nevermore2019-05-12老师shell脚本是一步编译成机器码的吗?还是转换成汇编再编译成机器码
作者回复: 如果在这个映射关系里面,可以认为shell脚本是被bash解释器来运行的,调用对应的编译好的二进制可执行文件相当于bash解释器在做对应的“翻译”动作
12 - Sharongo2019-05-20计算机小白想问一个很蠢的问题:为什么CPU不能放着所有指令,为什么要区分cpu和内存以及其它硬件不可以把功能都放在一个器件上吗?
作者回复: Sharongo同学你好, 因为放不下啊,也放不起啊,而且这样怎么做到前面讲的“可编程”和“可存储”呢?
共 3 条评论9 - Kelly.W2019-05-04老师您好,课程里说汇编代码和机器码是一一对应的,我现在知道在不同平台的机器码是不一样的(linux/windows),那么不同平台也有不同的高级语言->汇编代码的对应规则吗?
作者回复: 机器码的差异不在于操作系统(也就是不在于Linux/Windows)。而是在于体系结构(Intel X86/ARM/MIPS)。 不同平台的汇编语言也是不同的,所以同样的高级语言编译器在不同的平台上编译出来的代码也是不一样的。
共 5 条评论8 - 连边2019-06-15老师你好,通篇看下来,有一个地方没有怎么懂得。 “对应的 MIPS 指令里 opcode 是 0,rs 代表第一个寄存器s1的地址是17,rt代表第二个寄存器s2的地址是18,rd代表目标的临时寄存器t0的地址,是8.”共 4 条评论7
- imicode2019-05-27学习打卡: 1. CPU就是一个执行各种计算机指令的逻辑机器。这里的计算机指令就是CPU能懂的机器语言。不同体系结构的CPU支持不同的计算机指令集。 2. 汇编语言是一种易读和易写的机器代码,可以理解成“机器码”的一种别名或者书写方式。 3. 常见的五大类指令:算术类指令、数据传输类指令、逻辑类指令、条件分支类指令、无条件跳转类指令。展开7
- 子杨2019-05-18徐老师,每一条计算机指令由 CPU 执行的时候,实际上是不是都是电路的连通或关闭?
作者回复: 是啊,我们在讲解CPU的时候,你可以从电路的角度来理解指令是怎么在硬件层面执行的。
共 2 条评论6 - Geek_guo2019-05-04希望老师可以把指令执行后的整个过程在分析下,不然现在还是不理解这个指令对于一条加法有什么作用
作者回复: Geek_guo同学你好,加法在电路层面怎么执行,我们会在加法器里面讲解。 我们的指令运行,怎么和ALU这样的算术逻辑单元串联起来,我们会在CPU里面讲解,尽请期待啊。
6