计算机组成原理-函数调用的汇编表示(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

相关文章

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小