自己做网站怎么连接外网/小程序开发公司前十名
系列文章
: 深入理解计算机系统笔记
文章目录
- 系列文章
- 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…...

大型语言模型的生物医学知识图优化提示生成
大型语言模型的生物医学知识图优化提示生成 https://arxiv.org/abs/2311.17330 https://github.com/BaranziniLab/KG_RAG 大型语言模型的生物医学知识图优化提示生成 摘要 KG-RAG框架,较好的结合了生物医学知识图谱SPOKE和LLM的优势。SPOKE是一个开放知识图谱&…...

winform datagrid 全部勾选
如果我们想要进行全选或全部取消,在数据较多的情况下,这种方法显然特别繁琐。怎么办呢? 当然是加以一个全选按钮了,选中全选按钮则全选,否则取消。笔者本想在红色圆圈位置添加全选复选框的,那样看起来更加…...

从 NextJS SSRF 漏洞看 Host 头滥用所带来的危害
前言 本篇博文主要内容是通过代码审计以及场景复现一个 NextJS 的安全漏洞(CVE-2024-34351)来讲述滥用 Host 头的危害。 严正声明:本博文所讨论的技术仅用于研究学习,旨在增强读者的信息安全意识,提高信息安全防护技能…...

LC617-合并二叉树
文章目录 1 题目描述2 思路优化代码完整输入输出 参考 1 题目描述 https://leetcode.cn/problems/merge-two-binary-trees/description/ 给你两棵二叉树: root1 和 root2 。 将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另…...

深入解析:端到端目标检测模型的奥秘
深入解析:端到端目标检测模型的奥秘 在人工智能领域,计算机视觉任务一直是研究的热点之一。目标检测作为计算机视觉中的核心问题,其重要性不言而喻。端到端的目标检测模型,以其高效的性能和简洁的架构,逐渐成为研究和…...

xmind--如何快速将Excel表中多列数据,复制到XMind分成多级主题
每次要将表格中的数据分成多级时,只能复制粘贴吗 快来试试这个简易的方法吧 这个是原始的表格,分成了4级 步骤: 1、我们可以先按照这个层级设置下空列(后买你会用到这个空列) 二级不用加、三级前面加一列、四级前面加…...

在 Android 上实现语音命令识别:详细指南
在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…...

怎么理解FPGA的查找表与CPLD的乘积项
怎么理解 fpga的查找表 与cpld的乘积项 FPGA(现场可编程门阵列)和CPLD(复杂可编程逻辑器件)是两种常见的数字逻辑器件,它们在内部架构和工作原理上有着一些显著的区别。理解FPGA的查找表(LUT,L…...

51.2T 800G 以太网交换机,赋能AI开放生态
IB与以太之争 以太网替代IB趋势明显。据相关报告:2024年TOP500的超算中,采用以太网方案占比48.5%,InfiniBand占比为39.2%,其中排名前6的超算中已有5个使用以太网互联。 开放系统战胜封闭系统仅是时间问题。我们已经看到…...

【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏
最终效果 【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏 前言 今天用unity制作一个简单的爬坡2d赛车小游戏 素材 https://www.spriters-resource.com/mobile/hillclimbracing/ 拼装车素材 车身添加碰撞体,摩檫力0 轮胎添加碰撞体和刚体࿰…...