前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CMU15-213农民工学CSAPP

CMU15-213农民工学CSAPP

作者头像
20岁爱吃必胜客
发布2022-11-13 10:11:10
1780
发布2022-11-13 10:11:10
举报
文章被收录于专栏:进步集

文章目录

Machine-level programming

Basic and Control

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Goto is not a bad habit

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Procedures

ABI- application binary interface 程序二进制接口 all the parts of a system —manage the machine machine level

Windows has his own ABI and MAC os

传参:get communicate And: it located that should get delocated or should be freed up

Procedures

stack structure

Just a bunch of arrays 管理过程调用与返回状态 后进先出 %rsp—栈顶 在高地址 —每次加东西 往低地址走 倒着来—-头在脚下 pushq dest popq dest store value at dest—-must be register

calling conventions

passing control
在这里插入图片描述
在这里插入图片描述

call label ret

passing data
在这里插入图片描述
在这里插入图片描述

神奇的办法,通过地址传递,做到两数相加

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

movl %esi编译器这样做是因为它可以少移动一个四个字节 leaq 来传递指针

最后栈顶回退16个字节-释放栈空间

ret始终会把栈指针指向的地址作为返回地址

所以%rsp在ret前执行 回到该回到的地方

—-

我们会把那些可能被用到的寄存器存在栈帧里面。在要call别的函数之前。

managing local data

illustration of recursion

在这里插入图片描述
在这里插入图片描述

一个神奇方法去计算一个数字有多少1: 巧妙利用返回的 rax

成对出现的push pop rbx 是用来保存 弹出rbx临时值的

可以看出 在return里面 先计算两个表达式的值保存在寄存器然后再去call,我们要知道 call完以后他肯定rax保存了返回值

与此同时在call的时候我明白,在call之前rbx设置为右移后的值,当返回时,我们知道rbx存储了x的最低有效位,

所以我们可以把二者相加

最后的返回值rax就是最后的结果

疑问🤔️如果最后一轮popq rbx 会执行 L6 rep吗

总之rbp不管如何修改,在返回的时候都会是被恢复前面的值 保护现场机制

这就是ABI标准制定的意义

所有被调用函数都有恢复寄存器环境的责任

栈正好可以达到这个效果 被调用者 callee有责任把那些寄存器值保存到自己的栈帧里面

最后做好lab的题目

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • Machine-level programming
    • Basic and Control
      • Procedures
        • Procedures
          • stack structure
          • calling conventions
          • illustration of recursion
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档