当前位置: 首页 > news >正文

第11章 32位x86处理器编程架构

第11章 32位x86处理器编程架构

IA-32(INTEL Architecture, 32-bit):INTEL 32位处理器架构简称IA-3,以8086处理器为基础发展起来的。该章重点介绍了IA-32处理器的工作方式和相关技术。

IA-32架构的基本执行环境

寄存器的扩展

32位处理器通用寄存器:包含EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP,它们的在原先16位处理器的AX、BX、CX、DX、SI、DI、BP、SP上扩展而来,结构如下图:

image

EFLAGS:标志寄存器FLAGS也从16位扩展到了32位。

访存方式:32位处理器为了兼容16位处理器,保留了分段模型;但是提供一种变通方案平坦模型(Flat Mode),即段基地址为:0x00000000,段长度为4GB的分段方式。

32位工作模式:32位处理器有自己的32位工作模式,书籍内称呼这种32位模式为32位保护模式(Protected Mode)。与之对应的16位工作模式称为实模式(Real Mode)。

  • 实模式:程序可以自由地访问不属于它的内存位置,不安全。
  • 保护模式:处理器要求在加载程序时,先定义该程序所拥有的段,然后才允许使用这些段,还附加了段界限、特权级别、类型等属性。

段选择器:32位模式下,CS、SS、DS、ES,保存的不再是16位逻辑段地址,而是段的选择子,用于选择所要访问的段,因此,这一部分也叫作段选择器

32位处理器增加了两个额外的段寄存器FSGS,这两个寄存器到底有什么作用?书中后面也没有提到,于是我去查了下资料,只能大概了解其意思。

  • FS(Flag Segment):标志段寄存器,指向当前活动线程的TEB结构。
  • GS(Global Segment):全局段寄存器,可能被用作全局段的基址寄存器。

麻省理工的手册上,DS、ES、FS、GS都是标记为Data Segment,没有具体的区分。使用上各操作系统也有不同,具体可以参考底部的一些链接。

基本的工作模式

实模式(Real Mode):实质上就是8086模式,16位模式。

保护模式(Protected Mode):IA-32处理器的32位模式。

一些发展历史整理成表格看的更清楚一些:

image

线性地址和分页

逻辑地址:段地址和偏移地址称为逻辑地址,偏移地址叫作有效地址(Effective Address, EA),在指令中给出有效地址的方式叫作寻址方式(Addressing Mode)。比如:

inc word [bx+si+0x06]

段的管理是由处理器的段部件负责进行的。段部件将段地址和偏移地址相加,得到访问内存的地址。一般来说,段部件产生的地址就是物理地址。

多任务:IA-32处理器支持多任务,多任务在分配内存时会产生内存碎片的问题。

分页:IA-32处理器支持分页功能,分页功能将物理内存空间划分成逻辑上的页。页的大小一般为4KB,通过使用页,可以简化内存管理。

线性地址:当页功能开启时,段部件产生的地址就不再是物理地址了,而是线性地址(Linear Address),线性地址还要经页部件转换后,才是物理地址。

image

现代处理器的结构和特点

流水线

流水线(Pipe-Line)技术:把一条指令的执行过程分解成若干个细小的步骤,并分配给相应的单元来完成,各个单元的执行是独立的、并行的。

一条指令的执行过程分为取指令、译码和执行三个步骤:

image

高速缓存

为什么要高速缓存:处理器速度快,内存和硬盘相对较慢,处理器要等待内存和硬盘,便无法全速运行。

  • CPU内寄存器纳秒(ns)级别;
  • 内存一般是动态存储器(DRAM),几十纳秒级别;
  • 硬盘,通常是毫秒级(ms)。

高速缓存(Cache):处理器与内存(DRAM)之间的一个静态存储器(SRAM),容量较小,但速度可以与处理器匹配。

缓存涉及到命中的问题:如果要访问的内容已经在高速缓存中,这称为命中(Hit);否则,称为不中(miss)。缓存不中,处理器需要重新装载高速缓存,该过程中所损失的时间称为不中惩罚(miss penalty)。

乱序执行

微操作(micro-operations):为了实现流水线技术,需要将指令拆分成更小的可独立执行部分。

一个微操作:有些指令非常简单,因此只需要一个微操作。

add eax,ebx

两个微操作:

add eax,[mem] ;拆分成两个微操作:;  1.一个用于从内存中读取数据并保存到临时寄存器;;  2.另一个用于将EAX寄存器和临时寄存器中的数值相加。

三个微操作:

add [mem],eax ;拆分成三个微操作:;  1.一个从内存中读数据;;  2.一个执行相加的动作;;  3.一个用于将相加的结果写回到内存中。

乱序执行(Out-Of-Order Execution):一旦将指令拆分成微操作,处理器就可以在必要的时候乱序执行程序。

感觉乱序执行有点像并行,不相关的两个程序是可以并发执行的,从而提交效率。

寄存器重命名

寄存器重命名:在处理器内部,却有大量的临时寄存器可用,处理器可以重命名这些寄存器以代表一个逻辑寄存器,比如EAX。
image

寄存器重命名作用:为了提高指令的乱序执行,用临时寄存器代替原寄存器进行运算,等乱序执行完成后,再用临时寄存器内容替换原寄存器的内容,这个过程也叫做引退(Retirement)。

分支目标预测

清空(Flush)流水线:如果遇到一条转移指令,则后面那些已经进入流水线的指令就都无效了,就是要清空流水线。

流水线的问题:代码中经常存在分支,用哪个分支的代码填充流水线呢?用错误的分支填充流水线时,浪费的时间就越多。随着复杂架构下的流水线变得越来越长,程序分支带来的问题开始变得很大。让处理器的设计者不能接受,毕竟不中处罚的代价越来越高。

分支预测技术(Branch Prediction):分支预测的核心问题是,转移会发生还是不会发生。转移预测虽然很困难,但是可以通过统计学的方式分析概率。

比如下面这个例子:

    xor si,si    ;si清0
lops:...cmp si,20    ;si和20比较jnz lops     ;si<20,不为0,继续循环

jnz指令第一次执行时,转移一定会发生,处理器可以预测。

分支目标缓存器(Branch Target Buffer, BTB):在处理器内部,有一个小容量的高速缓存器。处理器执行了一条分支语句后,它会在BTB中记录当前指令的地址、分支目标的地址,以及本次分支预测的结果。

32位处理器的寻址方式

16位处理器的内存寻址:允许使用基址寄存器BX或者BP,同变址寄存器SI或者DI结合,再加上8位或者16位的位移来寻址内存操作数。

image

例如:

mov ax,[bx]
mov ax,[bx+di]
mov al,[bx+si+0x02]

32位处理器的内存寻址:全部的32位通用寄存器作为基址寄存器 + 除ESP外的32位通用寄存器作为变址寄存器 * 1、2、4、8比例因子 + 位或者32位的位移。

image

例如:

add eax,[0x2008]         ; 有效地址是32位的(0x00002008)
sub eax,[eax+0x08]       ; 有效地址是32位的
mov ecx,[eax+ebx*8+0x02] ; 有效地址是32位的

参考资料

  • 80386 Programmer’s Reference Manual – Section 1.1
  • Operating Modes of 80386 Microprocessors - GeeksforGeeks
  • 2.3 寄存器 | Intel 80386 程序员参考手册
  • assembly - “FS”/“GS”寄存器的用途是什么?_Stack Overflow中文网
  • 寄存器由来 ES CS SS DS FS GS区别_gs寄存器-CSDN博客
  • The Intel 80386, part 11: The TEB - The Old New Thing
  • 计算机体系结构-寄存器重命名 - 知乎

相关文章:

第11章 32位x86处理器编程架构

第11章 32位x86处理器编程架构 IA-32(INTEL Architecture, 32-bit)&#xff1a;INTEL 32位处理器架构简称IA-3&#xff0c;以8086处理器为基础发展起来的。该章重点介绍了IA-32处理器的工作方式和相关技术。 IA-32架构的基本执行环境 寄存器的扩展 32位处理器通用寄存器&am…...

加密软件是什么?有哪些用处呢?

一、加密软件是什么&#xff1f; 加密软件用于对数据进行加密和解密的工具或程序。其主要功能是通过使用加密算法将原始数据转换为密文&#xff0c;以保护数据的机密性和安全性&#xff0c;防止未经授权的访问和泄露。加密软件提供用户友好的界面和操作方式&#xff0c;使用户…...

浅谈C#之任务调度TaskScheduler

一、基本介绍 TaskScheduler 是一个抽象类&#xff0c;用于控制任务的执行方式&#xff0c;特别是它们如何被安排到线程池中的线程上执行。 TaskScheduler 负责将 Task 对象排队并决定何时、以何种方式执行这些任务。 二、TaskScheduler的作用 调度任务&#xff1a;将任务分配…...

SQL server 日常运维命令

一、基础命令 查看当前数据库的版本 SELECT VERSION;查看服务器部分特殊信息 select SERVERPROPERTY(Nedition) as Edition --数据版本&#xff0c;如企业版、开发版等,SERVERPROPERTY(Ncollation) as Collation --数据库字符集,SERVERPROPERTY(Nservername) as Serve…...

基于协同过滤算法+SpringBoot+Vue+MySQL的商品推荐系统

系统展示 用户前台界面 管理员后台界面 系统背景 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&#xff0c;以及…...

VSCode中latex文件(Misplaced alignment tab character .LaTeX

Misplaced alignment tab character &.LaTeX 先给出参考文章1 Misplaced alignment tab character &.LaTeX 把bib文件中的 &改为 and 。删除原有的bbl文件、重新运行 选择这个运行 这个错误在overleaf上并没有遇到、在vscode上遇到了 方法二就是把 &改为…...

如何给电脑设置静态IP地址:详细步骤与指南

在日常生活和工作中&#xff0c;我们经常需要使用电脑连接到网络。通常情况下&#xff0c;电脑会自动获取IP地址&#xff0c;但有时候&#xff0c;由于特定的网络需求或配置&#xff0c;我们可能需要手动为电脑设置静态IP地址。本文将详细介绍如何在Windows和Mac操作系统中为电…...

【Mysql】系统服务启动访问报错问题处理:this is incompatible with sql_mode=only_full_group_by

一、背景&#xff1a; 本来已经正常运行的平台&#xff0c;突然有一天由于对服务器进行部分操作迁移&#xff0c;发现jar可以正常启动&#xff0c;但是访问功能一直报错&#xff0c;监控后台日志后&#xff0c;发现了问题&#xff1a; 报错的具体信息如下&#xff1a; Caused…...

安装oh-my-zsh后报错zsh: command not found: conda问题解决

zsh: command not found: conda问题解决 一、问题介绍与环境介绍 系统为macOS Sonoma 14.5 所用终端为zsh 主要问题&#xff1a;安装了oh-my-zsh之后conda命令在终端中不可用。 二、原因分析 终端中zsh的可访问的程序一般放在/bin, /usr/bin, /usr/local/bin&#xff0c;~/bi…...

避免 PyCharm 将该 Python 脚本作为测试运行

为了避免 PyCharm 将该 Python 脚本作为测试运行&#xff08;即 pytest 自动捕获&#xff09;&#xff0c;你可以做以下几步来确保该脚本作为普通的 Python 程序执行&#xff0c;而不是作为 pytest 运行。 解决方案&#xff1a; 1. 确保文件名不以 test_ 开头&#xff1a; P…...

【Sqlite】.NET Framework使用Sqlite的注意事项

注意&#xff1a;NuGet引入System.Data.SQLite.Core不要引入System.Data.SQLite 注意&#xff1a;局域网共享链接 正常链接Data Source\\BAT-OCV\SqliteDB\batOCV.db;Version3;PoolingTrue;Max Pool Size100; 局域网链接Data Source\\\BAT-OCV\SqliteDB\batOCV.db;Version3;P…...

2024下《系统集成项目管理工程师》50个高频考点汇总!值得收藏

11月软考已经迫在眉睫&#xff0c;准备考系统集成的小伙伴们开始准备了吗&#xff1f; 这里给大家整理了50个高频考点&#xff0c;涵盖全书80%重点&#xff0c;先把这个存下&#xff01;再慢慢看书&#xff0c;边看书边背这个&#xff0c;事半功倍。 1、信息安全的基本要素有&…...

Java 远程调用接口(RMI)

Java Remote Method Invocation (RMI) 概述 Java 的 Remote Method Invocation (RMI) 是一种允许 Java 程序调用远程对象的方法。这种方法类似于本地调用&#xff0c;但目标对象实际位于远程 JVM&#xff08;Java 虚拟机&#xff09;中。RMI 实现了分布式计算&#xff0c;允许…...

torch.squeeze()

在深度学习中经常会遇见这个函数&#xff0c;现在来说一下这个函数的用法&#xff0c;其实很简单的。 函数作用 函数的作用就是&#xff1a;挤压size为1的维度&#xff0c;挤压也就是remove。如果size不是1的话&#xff0c;那就没变化。 使用说明 在使用的时候&#xff0c;…...

COD论文笔记 BiRefNet

本质还是一个 U 型编码器解码器结构的分割模型。 我可以考虑将©和(d)结合&#xff0c;即对解码器的输入不进行 patchify,同时在各个阶段引入梯度参考信息 最近的相关工作&#xff0c;中间监督、额外先验(频率&#xff0c;梯度&#xff0c;边缘等)取得不错效果 作者观察到…...

表单项标签简单学习

目录 1. 单选框 radio​ 编辑​编辑​编辑​编辑 2. 复选框 checkbox ​编辑​编辑​编辑 3. 隐藏域 hidden 4. 多行文本框 textarea​ 编辑​编辑 5. 下拉框 select​ 编辑​编辑 6. 选择头像​编辑​编辑 <!DOCTYPE html> <html lang"en"> <h…...

固态硬盘和机械硬盘区别?固态硬盘和机械硬盘哪个好?

在当今数据时代&#xff0c;硬盘作为电脑里的存储设备在我们的生活和工作中扮演着十分重要的角色。随着存储技术的进步&#xff0c;市场上出现了两种主流硬盘&#xff1a;固态硬盘和机械硬盘。它们各有优劣&#xff0c;那么二者究竟有什么区别&#xff1f;我们又该如何选择呢&a…...

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第三期]

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第三期] 第三期介绍&#xff1a;频道模块之频道成员 目录 QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第三期]第三期介绍&#xff1a;频道模块之频道成员获取子频道在线成员数获取频道成员列表获取频道身份组成员列…...

亚信安全全球云安全SaaS运营总部落地厦门 安全点亮一带一路

近日&#xff0c;第二十四届中国国际投资贸易洽谈会&#xff08;以下简称“投洽会”&#xff09;在福建厦门隆重开幕。本届投洽会以“投资链接世界”为主题&#xff0c;积极践行全球发展倡议&#xff0c;服务高质量共建“一带一路”。在投洽会的重要环节&#xff0c;福建省重大…...

在cmd中输入mysql无法运行(环境变量配置保姆级教程)

MySQL环境变量配置 问题概述&#xff1a;解决方法及步骤&#xff1a;检测是否解决问题 问题概述&#xff1a; 下载安装mysql之后&#xff0c;打开cmd界面输入mysql&#xff0c;出现如下提示&#xff1a; mysql 不是内部或外部命令&#xff0c;也不是可运行的程序&#xff0c;或…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...