计算机系统基础(三)

news2024/10/7 18:27:44

1.程序转换概述

机器指令和汇编指令

机器指令与汇编指令意义对应,都是机器级指令

汇编指令

如:M[R[bx]+R[di]-6]←R[cl]

R:寄存器内容

M:存储单元内容

机器指令

高级语言转换为机器代码的过程

根据计算机系统基础(一),我们知道预处理,编译,汇编,链接四个步骤。

接下来讲讲反汇编,即将机器代码反汇编为汇编代码

2.IA-32指令系统

IA-32的定点寄存器组织

8个通用寄存器,2个专用寄存器和6个段寄存器(本图未表现)

其中EAX,EBX,ECX,EDX主要用来存放操作数

IA-32的寻址方式

操作数的寻址方式

各变量采用基址+位移的方式

如a[i]=104+i×4

IA-32常用指令类型

从高地址向低地址增长

例如我现在将AL来push进去,则AL就应该在栈顶,也就是低地址

传送指令

乘法指令

mulb是无符号乘,imulb是带符号乘

注意:带符号乘,如果积只取低n位,则和无符号相同;若取2n位,则采用“布斯”乘法

让我们来看一个例子

指令:imull $-16, (%eax,%ebx,4), %eax

功能:R[eax]←(-16)×M[R[eax]+R[ebx]×4] 

按位运算

salw   $2, %ax 1111 1111 1000 0000<<2

sarw   $1, %ax 1111 1101 1000 0000>>1=1111 1110 1100 0000

sal和saw都是算术移位

通用寄存器的编号

3.C语言程序的机器级表示

过程调用的机器级表示

现场:通用寄存器的内容;为何保存现场:因为所有过程共享一套通用寄存器

  • P将入口参数(实参)放到Q能访问到的地方;
  • P保存返回地址,然后将控制转移到Q;
  • Q保存P的现场,并为自己的非静态局部变量分配空间;
  • 执行Q的过程体(函数体)
  • Q恢复P的现场,释放局部变量空间;
  • Q取出返回地址,将控制转移到P

调用者保存寄存器: EAX、EDX、ECX

        当过程P调用过程Q时,Q可以直接使用这三个寄存器。如果P在从Q返回后还要用这三个寄存器的话,P应在转到Q之前先保存,并在从Q返回后先恢复它们的值再使用

被调用者保存寄存器:EBX、ESI、EDI

        Q必须先将它们的值保存到栈中再使用它们,并在返回P之前恢复它们的值。

接下来我们根据实际例子,来一步一步分析过程调用的情况

这是一段汇编代码

首先把ebp(栈底指针)压入栈中,再将esp(栈顶指针)指向ebp所在位置,然后esp=esp-24达到栈顶位置,再将ebp-12的位置放入125,同样ebp-8的位置放入80,将ebp-8的内容赋给eax也就是80,eax又把值放在esp+4的位置中,然后ebp-12的内容赋给eax也就是125,eax又把值放在esp的位置中。

这个时候调用add函数(此时返回参数存放在eax中),将eax的值给ebp-4(add返回值送给sum),再将ebp-4赋给eax(把sum作为caller的返回值)

call指令:保存返回地址并转被调用函数(返回地址是call指令的下一条指令)

退栈:leave指令 或 pop指令

取返回地址返回:ret指令

  • 参数的地址总比局部变量的地址大
  • 总是最右边参数的地址最大,因为参数入栈顺序为:右→左

递归函数

每次递归调用都会增加一个栈帧,每一个栈帧至少16个字节

选择语句的机器级表示

选择语句的机器表示,让我们看一个例子就理解了

4.复杂数据类型的分配和访问

数组的分配和访问

一个指针数组可以实现一个二维数组,每个元素都是一个指向int型数据的指针

接下来我们还是看一个例子

指令:s[i]+=*pn[i]++; i 在ECX,s[i]在AX

反汇编代码

movl   pn(,%ecx,4), %edx
addw  (%edx), %ax
addl   $2, pn(, %ecx, 4)

先将pn+ecx*4放入edx,这里是pn[i]放在edx(这里是4的原因是因为存的是地址,地址大小是4字节)

再将edx的值放入ax也就是s[i]

最后,pn[i]+”1”→pn[i],2是因为是short类型

结构体数据的分配和访问

当结构体作为入口参数,应该按地址传递(按值传递,加时间开销又增加空间开销,且更新后的数据无法在调用过程使用)

联合体数据的分配和访问

联合体各成员共享存储空间,按最大长度成员所需空间大小为目标

IA-32中编译时,long和int长度一样,union一共只能用四字节

通常用于特殊场合,如,当事先知道某种数据结构中的不同字段的使用时间是互斥的

数据的对齐

CPU访问主存时只能一次读取或写入若干特定位,按边界对齐可使读写数据位于8i~8i+7(i=0,1,2,…) 单元内

short型为2字节边界对齐,其他的如int、double、long double和指针等类型都是4字节边界对齐(即为4的倍数)

边界不对齐虽节省了空间,但增加了访存次数 

5.越界访问和缓冲区溢出

越界访问

  • 当i=0或1,OK
  • 当i=2, d3~d0=0x40000000   低位部分(尾数)被改变
  • 当i=3, d7~d3=0x40000000 高位部分被改变
  • 当i=4, EBP被改变,虽然能返回3.14,但是返回到调用过程后,在调用过程中使用ebp作为基址寄存器访问数据时,访问的是0x4000 0000附近的单元,本例中0x4000 0000附近的单元属于没有内容的空洞页面,对空洞页面的访问会导致发生存储保护错

C语言中的数组元素可使用指针来访问,因而对数组的引用没有边界约束,也即程序中对数组的访问可能会有意或无意地超越数组存储区范围而无法发现

C标准规定, 数组越界访问属于未定义行为, 访问结果是不可预知的

缓冲区溢出

数组存储区可看成是一个缓冲区,超越数组存储区范围的写入操作称为缓冲区溢出

造成缓冲区溢出的原因是没有对栈中作为缓冲区的数组的访问进行越界检查 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KEYSIGHT是德科技 E5063A ENA 系列网络分析仪

E5063A ENA 矢量网络分析仪 18GHz 2端口 降低无源射频元器件的测试成本 Keysight E5063A ENA 是一款经济适用的台式矢量网络分析仪&#xff0c;可用于测试简单的无源元器件&#xff0c;例如频率最高达到 18 GHz 的天线、滤波器、电缆或连接器。 作为业界闻名的 ENA 系列…

MLLM QLoRA微调实战:基于最新的袖珍Mini-InternVL模型

引言 大型语言模型&#xff08;LLM&#xff09;的世界正在不断发展&#xff0c;新的进步正在迅速出现。一个令人兴奋的领域是多模态LLM&#xff08;MLLMs&#xff09;的发展&#xff0c;这种模型既能够理解文本又能够理解图像&#xff0c;并与之进行交互。因此&#xff0c;这种…

ATG-2032:功率信号源的类型及应用领域简介

功率信号源是一种产生稳定、精确且可调节的电力信号的仪器&#xff0c;其主要作用是为测试和校准各种电子设备提供标准信号&#xff0c;以确保设备的精度和稳定性。 图&#xff1a;ATG-2000系列功率信号源 以下是功率信号源的主要类型和作用&#xff1a; 直流功率信号源 直流功…

Unity游戏帧率查看软件Fraps

Download Fraps 3.5.99 free version 下载、安装、运行这个软件&#xff0c;左上角就会自动显示帧率

SpringBoot的自动配置核心原理及拓展点

Spring Boot 的核心原理几个关键点 约定优于配置&#xff1a; Spring Boot 遵循约定优于配置的理念&#xff0c;通过预定义的约定&#xff0c;大大简化了 Spring 应用程序的配置和部署。例如&#xff0c;它自动配置了许多常见的开发任务&#xff08;如数据库连接、Web 服务器配…

python提取图片中的文字写入excel文件,并打包为exe可执行文件

python提取图片数据写入excel&#xff0c;并打包为exe可执行文件 1. 以下面的图片为例2. python环境需要的依赖包3. 创建交互式窗口4. 读取文件夹下的所有文件并提取数据5. 提取图片中字段的代码6. 打包代码为exe可执行文件安装打包依赖文件运行打包代码 1. 以下面的图片为例 2…

大数据------JavaWeb------会话跟踪技术(Cookie、Session)(完整知识点汇总)

会话跟踪技术&#xff08;Cookie&Session&#xff09; 注意&#xff1a; HTTP协议是无状态 的&#xff0c;即每次浏览器向服务器请求时&#xff0c;服务器都会将该请求视为新的请求&#xff0c;因此我们需要会话跟踪技术来实现会话内的数据共享 会话 当用户打开浏览器&am…

基于STM32的智能仓储温湿度监控系统

目录 引言环境准备智能仓储温湿度监控系统基础代码实现&#xff1a;实现智能仓储温湿度监控系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;温湿度监控与管理问题解决方案与优化收尾与总结 1. 引言 智能仓储温湿度监…

【论文解读】Multiagent Multitraversal Multimodal Self-Driving: Open MARS Dataset

Open MARS Dataset 摘要引言Dataset CurationVehicle SetupData CollectionDataset Statistics Benchmark Task and ModelPlace RecognitionNeural Reconstruction Experimental ResultsVisual Place RecognitionNeural Reconstruction Opportunities and Challenges结论 摘要 …

echarts实现3D柱状图(视觉层面)

一、第一种效果 效果图 使用步骤 完整实例&#xff0c;copy就可直接使用 <template><div :class"className" :style"{height:height,width:width}" /> </template><script>import echarts from echartsrequire(echarts/theme/…

RAG技术下的文档智能检索

在数字化浪潮的推动下&#xff0c;信息检索已成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着数据量的爆炸式增长&#xff0c;如何快速精准地从海量文档中检索出有价值的信息&#xff0c;成为了一个巨大的挑战。本文将带您走进 Pinecone 向量数据库的世界&#xff0…

计算机图形学games101——MVP

首先记得一个知识点 在旋转矩阵中&#xff0c;旋转矩阵的逆矩阵就是旋转矩阵的转置&#xff0c;这个矩阵是正交矩阵 我们需要做到的就是观测变换&#xff0c;这个变换包括视图变换和投影变换&#xff08;投影变换包含正交变换和透视变换&#xff09; 三维变换复习 首先复习…

Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制

这里写目录标题 0. 机器人配置1. Ubuntu20.04配置TurtleBot3 Waffle Pi远程控制1.1 TurtleBot3 Waffle Pi端配置1.2 PC端配置1.2.1 安装turtlebot3的环境配置1.2.2 创建项目并安装Turtlebot31.2.3 配置环境变量 1.3 PC端与TurtleBot3进行通信1.3.1 PC端与机器人端互PING和SSH连…

ATA-L2水声功率放大器驱动水声换能器的测试研究

随着水声通信技术的发展&#xff0c;水下通信设备也开始逐步走向实用化&#xff0c;为了满足其实际的使用要求&#xff0c;功率放大器的设计需要具有高效率的特性&#xff0c;并能在水下长时间连续可靠的工作。 压电陶瓷换能器主要负责电信号与声信号之间的转换&#xff0c;换能…

ruoyi-cloud登录接口实现滑块验证码

一、前言 ruoyi项目默认的验证码是这样的 今天来尝试增加滑块验证码&#xff0c;我们用到的是tianai-captcha。 文档地址&#xff1a;http://doc.captcha.tianai.cloud/ 源码地址&#xff1a;https://gitee.com/tianai/tianai-captcha 下面来看具体的步骤。 二、后端 在g…

JL-33 手持式气象站/便携式气象站 小型气象站厂家 微型气象站

产品概述 手持式气象站是一款携带方便&#xff0c;操作简单&#xff0c;集多项气象要素于一体的可移动式气象观测仪器。产品采用传感器及芯片&#xff0c;能同时对空气温度、空气湿度、风速、风向、光照、大气压力、颗粒物、噪声等要素进行准确测量、记录并存储。仪器带有机械…

游泳哪个牌子好?6大游泳耳机选购技巧总结分享

游泳耳机作为水上运动爱好者和游泳专业人士的必备装备&#xff0c;不仅要能够抵御水的侵入&#xff0c;还要提供清晰的音质和舒适的佩戴体验。在市面上&#xff0c;不同品牌的游泳耳机琳琅满目&#xff0c;选择起来可能会令人头疼。本文旨在为您提供一份详尽的游泳耳机选购指南…

详细解释下flutter初始示例的代码

详细解释下flutter初始示例的代码 main 首句导入需要的包 类似于其他语言的import main函数为入口函数 包裹MyApp类 MyApp 这个类继承自无状态类 可见myapp不管理任何状态 build方法是所有widget内必须实现的方法 此处返回一个 ChangeNotferiProvider 可以看到它用于管理应…

2024年低碳发展与地球科学国际会议 (LCDES 2024)

2024年低碳发展与地球科学国际会议 (LCDES 2024) 2024 International Conference on Low Carbon Development and Earth Science 【重要信息】 大会地点&#xff1a;长沙 大会官网&#xff1a;http://www.iclcdes.com 投稿邮箱&#xff1a;iclcdessub-conf.com 【注意&#xf…

一个opencv实现检测程序

引言 图像处理是计算机视觉中的一个重要领域&#xff0c;它在许多应用中扮演着关键角色&#xff0c;如自动驾驶、医疗图像分析和人脸识别等。边缘检测是图像处理中的基本任务之一&#xff0c;它用于识别图像中的显著边界。本文将通过一个基于 Python 和 OpenCV 的示例程序&…