01 | 程序的运行过程:从代码到机器运行
01 | 程序的运行过程:从代码到机器运行
讲述:陈晨
时长08:16大小7.56M
一切要从牛人做的牛逼事说起
程序编译过程
程序装载执行
更形象地将 HelloWorld 程序装入原型计算机
图中放的字节数目不等,这是为了方便阅读,不然图要画得很大。
重点回顾
思考题
赞 283
提建议
精选留言(132)
- Kevinlvlc置顶2021-05-18思考题: 首先假设CPU执行指令是顺序执行的,那么程序的调用需要考虑几个问题: 1,call指令要执行的代码在哪?也就是被调用函数的第一条指令所在的内存地址 2,被调用函数执行完之后,返回哪个位置继续执行? 只要解决上面这两个问题,那么函数调用时指令的间的跳转就迎刃而解了。 针对第一个问题,在gcc编译完成之后,函数对应的指令序列所在的位置就已经确定了,因此这是编译阶段需要考虑的问题 至于第二个问题,在执行完call指令的同时,需要将call指令下面一条指令的地址保存到栈内存中,同时更新%rsp寄存器指向的位置,然后就可以开始执行被调函数的指令序列,执行完毕后,由ret指令从rsp中获取栈顶的returnadress地址,然后跳转到call的下一条指令继续执行。 以上答案参考csapp 3.7.2小节的内容,加上自己的理解😁😁展开
作者回复: 你好,你这66666
共 9 条评论193 - hh置顶2021-05-11嗯,第一讲或开篇应该描述一下,我们需要准备什么学习环境
编辑回复: 开始只是让大家热热身。随着课程进展,需要在Ubuntu上使用sudo apt-get install virtualbox-6.1安装一个virtualbox虚拟机软件,敬请期待~
共 4 条评论28 - Fan置顶2021-05-11能不能建个交流群,有问题方便在群中交流。
编辑回复: 同学好,咱们已经有交流群啦。进群方法,找到课程详情页,点击点短链接,然后加群助手,回复“操作系统”进入课程交流群!
共 14 条评论7 - 旺仔的菜置顶2021-08-26讲解思路比较喜欢,知道程序执行的源头及其演变过程,赞一个
编辑回复: 谢谢鼓励,后面更精彩!
- pedro2021-05-10call和ret其实是一对相反指令,调用call时会将当前IP入栈,即push IP,然后执行跳转即jmp,而ret也是将栈中的IP推出写入IP寄存器,即pop IP。
作者回复: 你好,pedro,我看的出你的x86汇编语言的功底深厚
共 2 条评论88 - Jason2021-05-11实验环境补充: 上面没讲到实验环境。可以这样做: 1、安装虚拟机,windows/macos上都可以装vmware虚拟机,具体百度 2、在虚拟机中安装linux发行版系统,如centos或ubuntu,具体百度 3、在linux系统里安装gcc工具 4、写好源代码,然后就能gcc编译它了,编译命令,引用 AIK 同学的: 程序编译过程填坑 源文件生成预处理文件: gcc -E HelloWorld.c -o HelloWorld.i 预处理文件生成编译文件: gcc -S HelloWorld.i -o HelloWorld.s 编译文件生成汇编文件: gcc -c HelloWorld.s -o HelloWorld.o 汇编文件生成可执行文件:gcc HelloWorld.o -o HelloWorld 源文件生成可执行文件:gcc HelloWorld.c -o HelloWorld Linux系统运行可执行文件:./HelloWorld —— 引用自 AIK 同学展开
作者回复: 你好,技术66666啊
共 5 条评论49 - 数学汤家凤2021-05-12王爽汇编的笔记 快速入门,最近在啃 csapp https://blog.csdn.net/u013570834/article/details/108753839
作者回复: 是的 汇编代码很少 却很重要
共 9 条评论23 - thomas2021-05-15call 指令会把当前的 PC(CS:IP) 寄存器里的下一条指令的地址压栈,然后进行JMP跳转指令; ret 指令则把 call 调用时压入的 PC 寄存器里的下一条指令出栈,更新到 PC 寄存器中
作者回复: 你好,回答正确
共 2 条评论20 - 杰良2021-05-18系统四牛人:Ken Thompson、Dennis Ritchie、阿兰图灵、冯诺依曼。 编译四步骤:预处理(gcc -E -o)、编译(gcc -s -c)、汇编(gcc -c)、链接(gcc -o)。
编辑回复: 赞!
共 2 条评论15 - 郑童文2021-05-10老师能否推荐一份快速入门汇编语言的阅读材料,让我们能看懂这些汇编代码
作者回复: 其实汇编代码很少的 王爽的《汇编语言》
13 - wanttocry2021-05-27什么时候可以出书,八九百页那种,贵一点没关系,比较喜欢纸质。
作者回复: 哈哈 刚好用来垫显示器
共 2 条评论11 - 青玉白露2021-05-21思考题:答:“call”即“打电话”,“ret”即”返回某个地方“。要想实现这两个指令,那么首先call需要知道调用的东西在哪,ret需要返回的地方在哪。 对于call,在程序编译完成之后,所有的指令代码都已按顺序存储至计算机中,事先在call 之后附上相应的存储地址即可; 对于ret,其实计算机是使用一种叫做“栈”的结构,简单来说“栈”就好像是一个桶,计算机不停地往里扔东西(压栈),只有拿起上面的东西(出栈),才能拿到下面的东西。ret即是利用栈的结构,来存储自己将要返回的地方。 另外,call与ret是配套使用的。call的时候会将此时运行到的位置压入栈中,ret会从栈中弹出自己将要返回的位置。 彭东老师写的真的不错,后面会把笔记精简一下: https://zhuanlan.zhihu.com/p/373996858展开
作者回复: “栈”就好像是一个桶,计算机不停地往里扔东西(压栈),只有拿起上面的东西(出栈),才能拿到下面的东西。 这个比喻绝了
共 2 条评论9 - 牧牛少年2021-05-10老师请问电脑上需要装什么东西?
编辑回复: 组装一台计算机毕竟成本太高,可以用虚拟机软件的方式建立一台虚拟电脑。为此你需要在Ubuntu上使用sudo apt-get install virtualbox-6.1安装一个virtualbox虚拟机软件,用它建立我们的计算机。不要着急,随课程进展,这个会慢慢展开~
共 5 条评论9 - Fan2021-05-10书跟专栏在内容上有什么区别呢?
作者回复: 你好,Fan,书比较单一,书中是lmosem基于arm920非常古老了。专栏是基于X86-64,每章节在讲解原理并实践后再去和linux对比,自己学会的同时,加深了对linux的理解 ,增加了虚拟化和云相关的内容
共 3 条评论8 - Zexho2021-05-11推荐一本汇编适合入门的书 ,《汇编语言》作者王爽 https://book.douban.com/subject/25726019/
作者回复: 这是好书,我也看过
共 3 条评论7 - wenkin2021-07-191.call和ret指令都是转移指令,它们都修改IP的值,或同时修改CS和IP的值。它们经常共同用语实现子程序的设计。 2.CPU执行ret指令时, (1)(IP)=((ss)*16+(sp)) 得到IP地址,并将IP出栈 (2)(sp)=(sp)+2 将IP更新到 PC 寄存器中 3.CPU执行call指令时,进行两步操作: (1)将当前的IP或CS和IP压入栈中; (2)转移(jmp)到对应的ip或cs执行代码 注释:ss sp就是栈堆的指针,和cs ip 是代码段指针,知道ss,sp求物理地址的公式是 物理地址=ss* 16+ sp,或者物理地址=ss* 10H+ sp 也就是对于2进制来说,ss里的数要加上4个0 再加sp得到物理地址。比如ss存放 1234H sp 存放 2000H ,那么物理地址就是 1234H*10H+2000H=14340H展开
作者回复: 对的
共 2 条评论6 - 石维康2021-05-10call = jump+push eip ret = pop eip
作者回复: 你好,call = 先将eip压 然后再跳转 哈哈
6 - 小肥鲸2021-05-11不懂c需要的我哭晕在厕所
编辑回复: 万事开头难,这次不妨给自己一个尝试的机会呀~
共 2 条评论5 - 阿白2021-07-24最强生产力是老婆回娘家
作者回复: 哈哈
4 - GAC·DU2021-05-11不太了解汇编的知识,读着稍微有点压力,老师能给点意见吗?
作者回复: 不要害怕 汇编代码很少 可以看看王爽的《汇编程序》
共 2 条评论4