过程调用和数组的分配访问
系列文章
: 深入理解计算机系统笔记
文章目录
- 系列文章
- 3.7 过程
- 3.7.1 运行时栈
- 3.7.2 转移控制
- 3.7.3 数据传送
- 3.7.4 栈上的局部存储
- 3.7.5 寄存器中的局部存储空间
- 3.7.6 递归过程
- 3.8 数组分配和访问
- 3.8.1 基本原则
- 3.8.2 指针运算
- 3.8.3 嵌套的数组
- 3.8.4 定长数组
- 3.8.5 变长数组
3.7 过程
- 过程是软件中一种很重要的抽象。用一组指定的参数和一个可选的返回值实现某种功能,可以在程序的不同的地方调用这个函数。隐藏某个行为的具体实现。过程的形式:函数(function)、方法(method)、子例程(subroutine)、处理函数(handler)等。
- 对过程的机器级支持,假设过程 P 调用过程 Q,Q 执行后返回 P。这些动作包括下面一个或多个机制:
1. 传递控制。进入过程 Q 时,程序计数器被设为 Q 代码的起始地址,在返回时,要将程序计数器设置为 P 中调用 Q 的后面那条指令的地址。
2. 传递数据。P 必须能够向 Q 提供一个参数,Q 必须能够向 P 返回一个值。
3. 分配和释放内存。开始时,Q 可能需要为局部变量分配空间,而在返回前,又必须释放这些存储空间。(栈) - 遵循最低要求策略:只实现上述机制每个过程所必须的那些
3.7.1 运行时栈
- 当Q执行时,P及其上的调用链是被挂起的,需要为Q的局部变量分配存储空间,或设置Q到另一个的过程调用。Q返回时,释放。
- 程序用栈管理过程所需的空间,栈和寄存器存放传递控制,数据和分配内存的信息(被放在栈尾)
- P调用Q时,参数设定后将返回地址压入栈,Q扩展栈的边界,大多数的栈帧是定长的,有些过程需要变长的栈帧
- 过程的栈帧是过程需要的存储空间超过寄存器存放的大小时,才在栈上分配,如果小于等于6个参数,且不调用其他函数(叶子过程)的函数通常不需要栈帧
3.7.2 转移控制
- 将P转移到Q函数只需要将PC设置为Q代码的起始地址。而返回时,处理器需要记录它需要继续P的继续执行的位置。
- call命令:将地址A(紧跟着call的下一条指令)压入栈中,将PC设置为Q代码的起始地址。可以是直接的,也可以是间接的(*)。
- ret命令:从栈中弹出地址A,并将PC设置为A
3.7.3 数据传送
-** 调用一个过程时**,也要将数据作为参数传递,从过程返回可能包含一个返回值,大部分过程间的数据传送是通过寄存器传递的。
六个寄存器传递di,si,dx,cx,8,9,一个寄存器返回ax
- 如果函数传递的参数大于六个整形参数,就需要栈来传递,所有的数据大小向8(字节)的倍数对齐
第七个参数位于栈顶
3.7.4 栈上的局部存储
- 当寄存器不够存放所有的本地数据,或者对一个局部变量使用地址运算符,或者局部变量是数组或者结构时,在栈帧上存放局部变量
3.7.5 寄存器中的局部存储空间
- 寄存器组是唯一被所有过程共享的资源,在给定时刻只有一个过程是活动的,必须确保当一个过程调用另一个过程时,被调用者不会覆盖调用者稍后会使用的寄存器值。
- 被调用者保存寄存器(Callee-saved registers):是指在函数调用过程中,如果被调用的函数需要使用这些寄存器,那么它必须在使用这些寄存器之前将它们的原始值保存起来(通常保存在栈上),在函数返回之前再恢复这些寄存器的值。这样就保证了调用者在调用函数前后,这些寄存器的值保持不变。
3.7.6 递归过程
- 递归调用是函数调用自身的情况,每次递归调用都会创建一个新的栈帧。即使是递归调用,栈帧的分配和释放规则依然适用,确保每次调用都有独立的状态信息。
- 函数调用过程
调用者(caller)保存自身需要保存的寄存器值(调用者保存寄存器)。
调用者将参数传递给被调用者(callee)。
调用者执行 call 指令,将返回地址压入栈。
被调用者创建新的栈帧,保存被调用者保存寄存器的值。
被调用者执行函数体。 - 函数返回过程
被调用者恢复被调用者保存寄存器的值。
被调用者销毁栈帧。
被调用者执行ret 指令,跳转到返回地址。
调用者恢复调用者保存寄存器的值。(第一次是被调用者)
调用者继续执行。
3.8 数组分配和访问
3.8.1 基本原则
- C语言对于数据类型 T 和整型常数 N,声明如下:
T A[N];
起始位置表示为xA(地址)
首先,它在内存中分配一个
L⋅N 字节的连续区域,L 是数据类型 T 的大小(单位为字节)。其次,标识符 A作为指向数组开头的指针,这个指针的值就是 x A。可以用0~N-1 的整数索引来访问该数组元素。第i个数组元素会被存放在地址为 x A+L⋅i 的地方。 - 假设 E 是一个 int 型的数组,而我们想计算 E[i],在此,E 的地址存放在寄存器 %rdx 中,而 i 存放在寄存器 %rcx 中
movl (%rdx,%rcx,4),%eax
3.8.2 指针运算
- C 语言允许对指针进行运算, p 是一个指向类型为 T 的数据的指针,p + i 的值为 xp +L⋅i,这里 L 是数据类型 T 的大小。
- &Expr 是给出该对象地址的一个指针。对于一个表示某个对象地址的表达式 AExpr,*AExpr 给出该地址处的值。因此,表达式 A[i] 等同于表达式 *(A + i),它计算第 i 个数组元素的地址,然后访问这个内存位置。
假设整型数组 E 的起始地址和整数索引 i 分别存放在寄存器 %rdx 和 %rcx 中
3.8.3 嵌套的数组
int A[5][3];
//等价于
typedef int row3_t[3];
row3_t A[5];
- 嵌套的数组在内存中也是连续的
- xA,i,j分别存在%rdi,%rsi,%rdx中。
将A [i] [j] 复制到%eax
leaq (%rsi,%rsi,2), %rax # 计算 3i
leaq (%rdi,%rax,4), %rax # 计算 x_A + 12i
movl (%rax,%rdx,4), %eax # 从 M[x_A + 12i + 4j] 读取数据
3.8.4 定长数组
- C语言编译器能优化定长多维数组,O1时的一些优化
- 去掉整数索引:它将所有的数组引用都转换成了指针间接引用
- 生成指针Aptr:指向数组A的行i中连续的元素
- 生成指针Bptr:指向数组B的列k中连续的元素
- 生成指针Bend:当需要终止循环时,它会等于Bptr的值。Bend的值是假想中B的列k的第(n+1)个元素的地址,由C表达式&B[N][k]给出。
- 例子:
/* Compute i,k of fixed matrix product */
int fix_prod_ele (fix_matrix A, fix_matrix B, long i, long k) {long j;int result = 0;for (j = 0; j < N; j++)result += A[i][j] * B[j][k];return result;
}
//优化后
/* Compute i,k of fixed matrix product */
int fix_prod_ele_opt(fix_matrix A, fix_matrix B, long i, long k) {int *Aptr = &A[i][0]; /* Points to elements in row i of A */int *Bptr = &B[0][k]; /* Points to elements in column k of B */int *Bend = &B[N][k]; /* Marks stopping point for Bptr */int result = 0;do {result += *Aptr * *Bptr; /* Add next product to sum */Aptr++; /* Move Aptr to next column */Bptr += N; /* Move Bptr to next row */} while (Bptr != Bend); /* Test for stopping point */return result;
}
3.8.5 变长数组
- C99的变长数组允许数组的维度是一个表达式,分配时才计算。由于分配时才计算,所以在leap指令前需要需要一次乘法指令(imul),影响性能。循环访问时编译器可以优化,识别步长,避免直接应用乘法。
相关文章:

过程调用和数组的分配访问
系列文章 : 深入理解计算机系统笔记 文章目录 系列文章3.7 过程3.7.1 运行时栈3.7.2 转移控制3.7.3 数据传送3.7.4 栈上的局部存储3.7.5 寄存器中的局部存储空间3.7.6 递归过程 3.8 数组分配和访问3.8.1 基本原则3.8.2 指针运算3.8.3 嵌套的数组3.8.4 定长数组3.8.5 变长数组…...

TeamViewer手机端APP提示:请先验证账户
当你在手机端下载安装了TeamViewerAPP后,需要你先登录个人账号,然后还会要求你验证账户,同时跳转到一个网址中,但是这个网址并没有自动跳转到验证账户的位置。 解决办法: 在手机浏览器中进入下面这个网址:…...
【SpringBoot】分页查询
1. Controller ApiOperation("分页查询")GetMapping("/page")public Result<PageResult> pageResultResult(EmployeePageQueryDTO employeePageQueryDTO) {System.out.println(employeePageQueryDTO.toString());PageResult pageResult employeeSer…...

微软CrowdStrike驱动蓝屏以及内核签名
原因 当Windows操作系统遇到严重错误导致系统崩溃时,屏幕显示为蓝色,通常伴有错误代码和信息,这被称为“蓝屏死机”(Blue Screen of Death,简称BSOD) https://www.thepaper.cn/newsDetail_forward_281262…...

Spring中Bean的循环依赖
目录 定义: 循环依赖的后果: 一:三级缓存 1、大概的思路: 注意: 2、执行过程: A半完成: B完成: A完成: 注: 二:Lazy 定义: …...

Java二十三种设计模式-代理模式模式(8/23)
代理模式:为对象访问提供灵活的控制 引言 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一个代替或占位符,以控制对它的访问。 基础知识,java设计模式总体来说设计模式分为三大类&#…...

Windows 11 家庭中文版 安装 VMWare 报 安装程序检测到主机启用了Hyper-V或Device
1、问题 我的操作系统信息如下: 我在安装 VMWare 的时候,报: 因为我之前安装了 docker 桌面版,所以才报这个提示。 安装程序检测到主机启用了 Hyper-v或 Device/credential Guard。要在启用了Hyper-或 Device/Credential Guard …...

机械学习—零基础学习日志(高数09——函数图形)
零基础为了学人工智能,真的开始复习高数 函数图像,开始新的学习! 幂函数 利用函数的性质,以幂函数为例,因为单调性相同,利用图中的2和3公式,求最值问题,可以直接将式子进行简化。这…...

java迭代集合出现并发修改异常(ConcurrentModificationException)的原因以及解决方案
java迭代集合出现并发修改异常(ConcurrentModificationException)的原因以及解决方案 一. 什么时候会出现并发修改异常? 这里先看需求 : 定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马 很显然要求我们先创建一个集合并进行…...

BGP选路之Local Preference
原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时,BGP协议会对这些BGP路由的属性进行比较,以确定去往该目标网络的最优BGP路由。BGP首先比较的是路由信息的首选值(PrefVal),如果 PrefVal相同,就会比较本…...
WEB渗透信息收集篇--IP和端口信息
WEB渗透信息收集篇--域名信息-CSDN博客 WEB渗透信息收集篇--网站架构和指纹识别-CSDN博客 WEB渗透信息收集篇--人员信息-CSDN博客 WEB渗透信息收集篇--其他信息-CSDN博客 一、ASN ASN Tool - MxToolBox ASN通常指的是"自…...

国内微短剧系统平台抖音微信付费小程序app开发源代码交付
微短剧作为当下热门的内容,结合抖音平台的广泛用户基础,开发微短剧付费小程序APP具有显著的市场潜力,用户对于短剧内容的需求旺盛,特别是在言情、总裁、赘婿等热门题材方面,接下来给大家普及一下微短剧小程序系统。 顺…...

Java语言程序设计基础篇_编程练习题**15.19 (游戏:手眼协调)
**15.19 (游戏:手眼协调) 请编写一个程序,显示一个半径为10像素的实心圆,该圆放置在面板上的随机位置,并填充随机的顔色,如图15-29b所示。单击这个圆时,它会消失,然后在另一个随机的位置显示新的随机颜色的…...

学习记录day16—— 数据结构 双向链表 循环链表
双向链表 1、概念 1)就是从任意一个节点既能存储其前驱节点,又能存储后继节点 2)结构体中增加一个指向前驱节点的指针 //定义数据类型 typedef int datatype;//定义节点类型 typedef struct Node {union {int len;datatype data;};struct Node *prio; …...

Air780EP模块 AT开发-MQTT接入OneNET移动物联网平台应用指南
应用概述 使用AT方式通过MQTT协议连接onenet studio。官网地址:https://open.iot.10086.cn/ 材料准备 Air780EP(V)开发板一套,包括天线SIM卡,USB线。 PC电脑,串口工具 在onenet上创建产品 打开OneNET官网,进入控制…...
HOST处理器预读PCI设备
在PCI(Peripheral Component Interconnect)总线规范中,MRL(Memory Read Line)和MRM(Memory Read Multiple)是两种读取存储器地址空间的总线事务类型。 MRL(Memory Read Line…...

【Ansible】通过role角色部署lnmp架构
目录 一.roles概述 1.roles角色 2.roles的目录层次 2.1.roles 内各目录含义解释 二.实操 1.部署nginx 2.部署MySQL 3.部署php 4.编写测试文件 三.总结 一.roles概述 1.roles角色 可以把playbook剧本里的每个play看作为一个角色,将每个角色要用到的文件、…...
springboot给属性赋值的两种方式(yaml与properties)
一,介绍 在Spring Boot中,配置文件是用来设置应用程序的各种参数和操作模式的重要部分。Spring Boot支持两种主要类型的配置文件:properties文件和YAML 文件。这两种文件都可以用来定义相同的配置,但它们在格式和表达能力上有所不…...

20240725 每日AI必读资讯
🚀最强开源模型来了!Llama3.1以405B参数领先GPT-4o - Llama3.1以405B参数领先GPT-4o和Claude3.5Sonnet,在性能上实现超越。 - Meta大幅优化训练栈,扩展模型算力规模至16000个H100GPU,提高性能。 - Llama3.1具有上下文长度扩展、…...

17_高级进程间通信 UNIX域套接字1
非命名的UNIX域套接字 第1个参数domain,表示协议族,只能为AF_LOCAL或者AF_UNIX; 第2个参数type,表示类型,只能为0。 第3个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...