Machine-Level Programming III:Procedure

Machine-Level Programming III:Procedure

Today

  • Procedures
    • Mechanisms(机制)
    • Stack Structure
    • Calling Conventions(调用规则)
      • Passing control(传递控制)
      • Passing data(传递数据)
      • Managing local data
    • Illustration of Recursion(递归说明)

补充术语:
Program 程序员写的一个完整程序代码
Procedure 就是程序中一段完成一定功能的代码
Process 就是一个完整的程序加载到内存中运行的形式,是正在运行的处于动态的program

Mechanisms in Procedures(总体机制学习)

  • passing control
    • To beignning of procedure code
    • Back to return point
  • passing data
    • Procedure arguments
    • Return value
  • Memory management
    • Allocate during procedure excution
    • Deallocate upon return
  • Mechanisms all implemented with machine instructions
  • x86-64 implementation of a procedure uses only those mechanisms required

解读:
程序机制包括:传递控制、传递数据和内存分配三个部分。
这些机制都是由机器指令实现的,x86-64在程序中使用的机制只有以上这些。

调用控制: 开始时跳转到代码段开头+结束后跳转回调用位置
调用数据: 代码段使用到的参数+返回值、
内存安排: 代码段执行过程中分配内存+返回时解除分配
三个机制分别各由一半在调用开始时,一半在调用结束返回时。

Machine instructions implement the mechanisms, but the choices are determined by designers. These choices make up the Application Binary Interface(ABI)

Stack Structure(调用中要使用的存储方式)

Region of memory managed with stack discipline(规则)
There are two points. Firstly, Memory viewed as array of bytes. Secondly, Different regions have different purpose.(Like ABI, a policy decision)

栈向小地址生长。

相关指令

pushq Src
//从Src获取操作数,栈顶(%rsp)自减,操作数写入栈顶
popq Dest
//从栈顶读数据,存到Dest,栈顶自增

作为存储

Calling Coventrol

Passing control

Ues stack to support procesure call and return

Procedure call: call lable
//返回地址(调用位置的下一条指令)压栈,跳转到标签处
Procedure return: ret
//弹出返回地址,跳转到返回地址
//过程中通过修改%rip的值实现跳转!!!

Procedure Data Flow(Passing data)

寄存器的使用:
前六个参数:%rdi %rsi %rdx %rcx %r8 %r9
返回值:%rax
Stack: 向小地址生长。参数7到参数n存入栈中,7最靠近栈底。(Only allocate stack space when needed)

Managing local data

Languages that support recursion(递归) must be “Reentrant”(可重入):multiple simultaneous instantiations of single procedure(单个过程的多个实例化)
Need some place to store state of each instantiation from when called to when return

  • Arguments
  • Local variables
  • Return pointer
    stack allcoated in Frames(按帧分配的堆栈)state for single procedure instantiation

Stack Frames

Contents:

  • Return information
  • Local storage (if needed)
  • Temporary space (if needed)

Management is done by “call” and “ret”
Frame Pointer: %rbp (Optional)
Stack Pointer: %rsp

栈帧解读:(有很多理解关键点)
在这里插入图片描述

Whenever we enter a new procedure, we have to deal with two Frames: Current Stack Frame and Caller Stack Frame.
notes1:此次call的参数的构建是在调用者帧里完成的。
notes2:被调用者的参数是可选项,当它是叶函数(不调用其它函数的函数)时,不需要存储参数构建和当前栈帧指针(%rbp),当

在这里插入图片描述

解读:对于过程(procedure)的使用,需要进行实例化(instantiations)。
为每个实例分配的内存包含三个部分(参数、本地变量、返回指针,前两者需要时才会分配),此时堆栈是按照帧分配的。

thinking

Why push %rbx

在这里插入图片描述

Why mov $rdx %rbx

在这里插入图片描述

What is done by call instruction

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/142132.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring后端HttpClient实现微信小程序登录

这是微信官方提供的时序图。我们需要关注的是前后端的交互,以及服务端如何收发网络请求。 小程序端 封装基本网络请求 我们先封装一个基本的网络请求。 const baseUrl"localhost:8080" export default{sendRequsetAsync } /* e url:目标页…

【ARM Trace32(劳特巴赫) 使用介绍 4 - Trace32 Discovery 详细介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 1.1 SYS.Detect1.2 AHBAPn/AXIAPnAPBAPn.Base1.1 SYS.Detect 在 TRACE32 中, SYS.Detect 是一个用来检测目标系统配置的命令。 当你执行 SYS.Detect DAP 命令时,TRACE32 将自动检测和识别目标系统上的 ARM De…

python爬虫代理ip关于设置proxies的问题

目录 前言 一、什么是代理IP? 二、为什么需要设置代理IP? 三、如何设置代理IP? 四、完整代码 总结 前言 在进行Python爬虫开发时,经常会遇到被封IP或者频繁访问同一网站被限制访问等问题,这时,使用代理IP就可以避免这些问题&#x…

CSS特效008:鼠标悬浮文字跳动动画效果

总第 010 篇文章, 查看专栏目录 本专栏记录的是经常使用的CSS示例与技巧,主要包含CSS布局,CSS特效,CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点,CSS特效主要是一些动画示例,CSS花…

【算法与数据结构】78、90、LeetCode子集I, II

文章目录 一、题目二、78.子集三、90.子集II三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、78.子集 思路分析:【算法与数据结构】77、LeetCode组合。本题可以参考77题的组合问题代码&#xff0…

路由器的结构以及工作原理

目录 路由器的结构 交换结构三种常用的交换方式 1.通过存储器 2.通过总线 3.通过纵横交换结构(crossbar switch fabric) 路由器的结构 路由器结构可划分为两大部分:路由选择部分,分组转发部分 路由选择部分也叫做控制部分&…

java高并发系列-第2天:并发级别

这是java高并发系列第2篇文章,一个月,咱们一起啃下java高并发,欢迎留言打卡,一起坚持一个月,拿下java高并发。 由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,我们可以把…

P6入门:项目初始化7-项目详情之代码/分类码Code

前言 使用项目详细信息查看和编辑有关所选项目的详细信息,在项目创建完成后,初始化项目是一项非常重要的工作,涉及需要设置的内容包括项目名,ID,责任人,日历,预算,资金,分类码等等&…

排序算法之-快速

算法原理 丛待排序的数列中选择一个基准值,通过遍历数列,将数列分成两个子数列:小于基准值数列、大于基准值数列,准确来说还有个子数列:等于基准值即: 算法图解 选出基准元素pivot(可以选择…

P36[11-1]SPI通信协议

SPI相比于IIC的优缺点: 1.SPI传输速度快(IIC高电平驱动能力较弱,因此无法高速传输) 2.使用简单 3.通信线多 SCK(SCLK,CK,CLK):串行时钟线 MOSI(DO):主机输出,从机输入 MISO(DI): 主机输入,从机输出 SS(NSS,CS):从机选择(有多少个从机,主机就要用几根SS分别与从机连接…

Windows环境下ADB调试——安装adb

一、下载 Windows版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zipMac版本:https://dl.google.com/android/repository/platform-tools-latest-darwin.zipLinux版本:https://dl.google.com/android/reposit…

HTTP服务器——tomcat的安装和使用

文章目录 前言下载tomcattomcat 文件bin 文件夹conf 文件lib 文件log 文件temp 文件webapps 文件work 目录 如何使用 tomcat 前言 前面我们已经学习了应用层协议 HTTP 协议和 HTTP 的改进版——HTTPS,这些协议是我们在写与服务器相关的代码的时候息息相关的&#x…

专访|OpenTiny 社区 Mr 栋:结合兴趣,明确定位,在开源中给自己一些技术性挑战

前言 OpenTiny 开源之夏项目终于迎来了圆满的结局。借此机会,我们采访了 TinyReact 的共建者 Mr 栋同学。 Mr 栋同学是一位热衷于前端技术的开发者,对前端开发充满了激情和热爱。同时他也是一位即将毕业的大四在校生。在 OpenTiny 开源项目中&#xff0…

Java18新增特性

前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16、Java17 的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java…

做一个Sprngboot文件上传-阿里云

概述 这个模块是用来上传头像以及文章封面的,图片的值是一个地址字符串,一般存放在本地或阿里云服务中 1、本地文件上传 我们将文件保存在一个本地的文件夹下,由于可能两个人上传不同图片但是却同名的图片,那么就会一个人的图片就…

Mac 本地部署thinkphp8【部署环境以及下载thinkphp】

PHP的安装以及环境变量配置 1 PHP安装:在终端输入brew install php 这里是PHP下载的最新的 如果提示‘brew’找不到,自己搜索安装吧, 不是特别难 2 环境变量配置 终端输入vim ~/.bash_profile 输入export PATH"/usr/local/Cellar/php/8.…

ubuntu18.04安装google浏览器

下载google安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb 安装google浏览器 sudo dpkg -i google-chrome-stable_current_amd64.deb 执行安装 sudo apt-get -f install 启动浏览器 在应用程序中找到google图标点击运行

安全区域边界(设备和技术注解)

网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1边界防护 1.1应保证跨…

Spark数据倾斜优化

1 数据倾斜现象 1、现象 绝大多数task任务运行速度很快,但是就是有那么几个task任务运行极其缓慢,慢慢的可能就接着报内存溢出的问题。 2、原因 数据倾斜一般是发生在shuffle类的算子,比如distinct、groupByKey、reduceByKey、aggregateByKey…

vue脚手架初始化项目搭建后配置路由【小白易学】

首先这里你已经创建好项目了,这是跑起来的效果 首先第一步,需要下载路由router npm install vue-router4下载好了之后找到main.js页面,加入router import { createApp } from vue; import App from ./App.vue; import router from ./routercreateApp(A…