计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)

本文主要是介绍计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • call指令和ret指令
    • 高级语言的函数调用
    • x86汇编语言的函数调用
    • call ret指令
    • 小结
    • 其他问题
  • 如何访问栈帧
    • 函数调用栈在内存中的位置
    • 标记栈帧范围:EBP ESP寄存器
    • 访问栈帧数据:push pop指令
    • 访问栈帧数据:mov指令
    • 小结
  • 如何切换栈帧
    • 函数返回时,如何切换栈帧
      • ret指令
    • 小结
  • 如何传递参数和返回值
    • 一个栈帧内可能包含哪些内容
    • 汇编代码实战
    • 小结

call指令和ret指令

高级语言的函数调用

x86默认指的是32为如果为64位可以叫x64或x86-64
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

此时caller栈帧中有add函数调用的参数信息
在这里插入图片描述

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

在这里插入图片描述

x86汇编语言的函数调用

在这里插入图片描述

call ret指令

在这里插入图片描述

小结

在这里插入图片描述

其他问题

在这里插入图片描述

如何访问栈帧

函数调用栈在内存中的位置

在这里插入图片描述

标记栈帧范围:EBP ESP寄存器

注意x86系统中默认以4字节位栈的操作单位
在这里插入图片描述
在这里插入图片描述

访问栈帧数据:push pop指令

初始状态在这里插入图片描述
第一条指令执行后
在这里插入图片描述
第二条指令执行后
在这里插入图片描述
第三条指令执行后
在这里插入图片描述
第四条指令执行后
在这里插入图片描述
第五条指令执行后
在这里插入图片描述

访问栈帧数据:mov指令

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

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

小结

在这里插入图片描述

如何切换栈帧

在这里插入图片描述
call没执行之前
在这里插入图片描述
call执行后
在这里插入图片描述
push指令执行后
在这里插入图片描述
mov指令执行后
在这里插入图片描述
在这里插入图片描述

函数返回时,如何切换栈帧

在这里插入图片描述
第一条指令执行后
在这里插入图片描述
在这里插入图片描述

相当于恢复之前使用call之后的状态
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ret指令

在这里插入图片描述

小结

跳转之前都是上一个函数的栈帧
在这里插入图片描述

如何传递参数和返回值

一个栈帧内可能包含哪些内容

如果当前函数不会调用下一个函数,那么该当前函数的栈帧的大小不需要是16字节对齐的
在这里插入图片描述
在这里插入图片描述

汇编代码实战

执行前两天指令后
在这里插入图片描述
执行sub指令后
在这里插入图片描述
再执行两天mov指令
在这里插入图片描述
执行两个mov指令
mov指令不支持两个操作数同时来自主存

在这里插入图片描述
再执行两个mov指令
在这里插入图片描述
执行call指令后
在这里插入图片描述
执行push 和mov指令后

在这里插入图片描述
执行两条mov指令
在这里插入图片描述

执行add指令后
在这里插入图片描述
执行完leave指令
在这里插入图片描述
执行完ret指令
在这里插入图片描述
执行完mov指令后
在这里插入图片描述
再执行下一条mov指令
在这里插入图片描述

小结

如果调用者有其他也使用的寄存器要被被调用者使用时
此时可以将调用者使用的寄存器压栈保存
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这篇关于计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/503092

相关文章

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源