• Kevinlvlc
    置顶
    2021-05-18
    思考题: 首先假设CPU执行指令是顺序执行的,那么程序的调用需要考虑几个问题: 1,call指令要执行的代码在哪?也就是被调用函数的第一条指令所在的内存地址 2,被调用函数执行完之后,返回哪个位置继续执行? 只要解决上面这两个问题,那么函数调用时指令的间的跳转就迎刃而解了。 针对第一个问题,在gcc编译完成之后,函数对应的指令序列所在的位置就已经确定了,因此这是编译阶段需要考虑的问题 至于第二个问题,在执行完call指令的同时,需要将call指令下面一条指令的地址保存到栈内存中,同时更新%rsp寄存器指向的位置,然后就可以开始执行被调函数的指令序列,执行完毕后,由ret指令从rsp中获取栈顶的returnadress地址,然后跳转到call的下一条指令继续执行。 以上答案参考csapp 3.7.2小节的内容,加上自己的理解😁😁
    展开

    作者回复: 你好,你这66666

    共 6 条评论
    134
  • hh
    置顶
    2021-05-11
    嗯,第一讲或开篇应该描述一下,我们需要准备什么学习环境

    编辑回复: 开始只是让大家热热身。随着课程进展,需要在Ubuntu上使用sudo apt-get install virtualbox-6.1安装一个virtualbox虚拟机软件,敬请期待~

    共 4 条评论
    21
  • Fan
    置顶
    2021-05-11
    能不能建个交流群,有问题方便在群中交流。

    编辑回复: 同学好,咱们已经有交流群啦。进群方法,找到课程详情页,点击点短链接,然后加群助手,回复“操作系统”进入课程交流群!

    共 13 条评论
    6
  • 旺仔的菜
    置顶
    2021-08-26
    讲解思路比较喜欢,知道程序执行的源头及其演变过程,赞一个

    编辑回复: 谢谢鼓励,后面更精彩!

    
    
  • pedro
    2021-05-10
    call和ret其实是一对相反指令,调用call时会将当前IP入栈,即push IP,然后执行跳转即jmp,而ret也是将栈中的IP推出写入IP寄存器,即pop IP。

    作者回复: 你好,pedro,我看的出你的x86汇编语言的功底深厚

    共 2 条评论
    71
  • Jason
    2021-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 条评论
    37
  • 数学汤家凤
    2021-05-12
    王爽汇编的笔记 快速入门,最近在啃 csapp https://blog.csdn.net/u013570834/article/details/108753839
    展开

    作者回复: 是的 汇编代码很少 却很重要

    共 5 条评论
    16
  • thomas
    2021-05-15
    call 指令会把当前的 PC(CS:IP) 寄存器里的下一条指令的地址压栈,然后进行JMP跳转指令; ret 指令则把 call 调用时压入的 PC 寄存器里的下一条指令出栈,更新到 PC 寄存器中
    展开

    作者回复: 你好,回答正确

    
    15
  • wanttocry
    2021-05-27
    什么时候可以出书,八九百页那种,贵一点没关系,比较喜欢纸质。

    作者回复: 哈哈 刚好用来垫显示器

    
    9
  • 杰良
    2021-05-18
    系统四牛人:Ken Thompson、Dennis Ritchie、阿兰图灵、冯诺依曼。 编译四步骤:预处理(gcc -E -o)、编译(gcc -s -c)、汇编(gcc -c)、链接(gcc -o)。
    展开

    编辑回复: 赞!

    
    9
  • 郑童文
    2021-05-10
    老师能否推荐一份快速入门汇编语言的阅读材料,让我们能看懂这些汇编代码

    作者回复: 其实汇编代码很少的 王爽的《汇编语言》

    
    9
  • Fan
    2021-05-10
    书跟专栏在内容上有什么区别呢?

    作者回复: 你好,Fan,书比较单一,书中是lmosem基于arm920非常古老了。专栏是基于X86-64,每章节在讲解原理并实践后再去和linux对比,自己学会的同时,加深了对linux的理解 ,增加了虚拟化和云相关的内容

    共 3 条评论
    8
  • 牧牛少年
    2021-05-10
    老师请问电脑上需要装什么东西?

    编辑回复: 组装一台计算机毕竟成本太高,可以用虚拟机软件的方式建立一台虚拟电脑。为此你需要在Ubuntu上使用sudo apt-get install virtualbox-6.1安装一个virtualbox虚拟机软件,用它建立我们的计算机。不要着急,随课程进展,这个会慢慢展开~

    共 5 条评论
    7
  • 青玉白露
    2021-05-21
    思考题:答:“call”即“打电话”,“ret”即”返回某个地方“。要想实现这两个指令,那么首先call需要知道调用的东西在哪,ret需要返回的地方在哪。 对于call,在程序编译完成之后,所有的指令代码都已按顺序存储至计算机中,事先在call 之后附上相应的存储地址即可; 对于ret,其实计算机是使用一种叫做“栈”的结构,简单来说“栈”就好像是一个桶,计算机不停地往里扔东西(压栈),只有拿起上面的东西(出栈),才能拿到下面的东西。ret即是利用栈的结构,来存储自己将要返回的地方。 另外,call与ret是配套使用的。call的时候会将此时运行到的位置压入栈中,ret会从栈中弹出自己将要返回的位置。 彭东老师写的真的不错,后面会把笔记精简一下: https://zhuanlan.zhihu.com/p/373996858
    展开

    作者回复: “栈”就好像是一个桶,计算机不停地往里扔东西(压栈),只有拿起上面的东西(出栈),才能拿到下面的东西。 这个比喻绝了

    共 2 条评论
    6
  • 小肥鲸
    2021-05-11
    不懂c需要的我哭晕在厕所

    编辑回复: 万事开头难,这次不妨给自己一个尝试的机会呀~

    共 2 条评论
    5
  • Zexho
    2021-05-11
    推荐一本汇编适合入门的书 ,《汇编语言》作者王爽 https://book.douban.com/subject/25726019/
    展开

    作者回复: 这是好书,我也看过

    共 2 条评论
    5
  • 石维康
    2021-05-10
    call = jump+push eip ret = pop eip
    展开

    作者回复: 你好,call = 先将eip压 然后再跳转 哈哈

    
    5
  • GAC·DU
    2021-05-11
    不太了解汇编的知识,读着稍微有点压力,老师能给点意见吗?

    作者回复: 不要害怕 汇编代码很少 可以看看王爽的《汇编程序》

    共 2 条评论
    4
  • wenkin
    2021-07-19
    1.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 条评论
    3
  • 张传峰
    2021-05-23
    有个疑问 gcc编译成一个可执行的二进制文件是怎么样的?是只有HelloWorld.dump的前面两列吗?

    作者回复: 你好,只有第二列

    共 2 条评论
    3