【汇编语言】寄存器(CPU工作原理)(四)—— “段地址x16 + 偏移地址 = 物理地址”的本质含义以及段的概念和小结

news2024/10/8 14:37:58

在这里插入图片描述

文章目录

  • 前言
  • 1. "段地址x16 + 偏移地址 = 物理地址"的本质含义
  • 2. 段的概念
  • 3. 内存单元地址小结
  • 结语

前言

📌

汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。

本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。

文章主要内容:"段地址x16 + 偏移地址 = 物理地址"的本质含义以及段的概念

1. "段地址x16 + 偏移地址 = 物理地址"的本质含义

了解其本质含义有助于我们未来更加灵活地分析解决问题

“段地址x16+偏移地址=物理地址”的本质含义是:CPU在访问内存时,用一个基础地址(段地址x16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。

更一般地说,8086CPU的这种寻址功能是“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案。8086CPU中,段地址x16可看作是基础地址。

下面,我们用两个与CPU无关的例子做进一步的比喻说明。

🎈第一个比喻说明“基础地址+偏移地址=物理地址”的思想:

比如说,学校、体育馆、图书馆同在一条笔直的单行路上(参考下图),学校位于路的起点(从路的起点到学校距离是0米)。

在这里插入图片描述

你要去图书馆,问我那里的地址,我可以用两种方式告诉你图书馆的地址:

(1)从学校走 2826m 到图书馆。这 2826m可以认为是图书馆的物理地址。

(2)从学校走 2000m到体育馆,从体育馆再走826m 到图书馆。第一个距离 2000m,是相对于起点的基础地址,第二个距离826m是相对于基础地址的偏移地址(以基础地址为起点的地址)。

第(1)种方式是直接给出物理地址 2826m,而第(2)种方式是用基础地址和偏移地址相加来得到物理地址的。




🎈第二个比喻进一步说明“段地址x16+偏移地址=物理地址”的思想。

我们为上面的例子加一些限制条件,比如,只能通过纸条来互相通信,你问我图书馆的地址我只能将它写在纸上告诉你。显然,我必须有一张可以容纳4位数据的纸条,才能写下 2826 这个数据。

在这里插入图片描述

可不巧的是,我没有能容纳4位数据的纸条,仅有两张可以容纳3位数据的纸条。这样我只能以下面这种方式告诉你 2826 这个数据。

在这里插入图片描述

在第一张纸上写上 200(段地址),在第二张纸上写上826(偏移地址)。假设我们事前对这种情况又有过相关的约定:你得到这两张纸后,做这样的运算:200(段地址)x10+826(偏移地址)=2826(物理地址)。

8086CPU就是这样一个只能提供两张3位数据纸条的CPU。

2. 段的概念

“段地址”这个名称中包含着“段”的概念。这种说法可能对一些学习者产生了误导,使人误以为内存被划分成了一个一个的段,每一个段有一个段地址。如果我们在一开始形成了这种认识,将影响以后对汇编语言的深入理解和灵活应用。

其实,内存并没有分段,段的划分来自于CPU,由于8086CPU用“基础地址(段地址x16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。如下图所示,我们可以认为:

  • 地址10000H~100FFH的内存单元组成一个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H。(大小指的是这个段的长度
  • 也可以认为地址10000H1007FH、10080H100FFH的内存单元组成两个段,它们的起始地址(基础地址)为:10000H和10080H,段地址为:1000H和1008H,大小都为80H。(大小指的是这个段的长度

在这里插入图片描述

以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。

有两点需要注意

  1. 段地址x16必然是16的倍数,所以一个段的起始地址也一定是16的倍数
  2. 偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。(因为一个段是通过“基础地址(段地址x16)+偏移地址=物理地址”来寻找地址的,所以当一个段的起始地址由段地址确定后,大小也就是范围就会由偏移地址的寻址能力决定)

3. 内存单元地址小结

CPU访问内存单元时,必须向内存提供内存单元的物理地址。8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。

那么现在请你思考下面的两个问题:

(1)观察下面的地址,你有什么发现?

在这里插入图片描述

✍结论:CPU可以用不同的段地址和偏移地址形成同一个物理地址。

比如 CPU 要访问 21F60H 单元,则它给出的段地址 SA 和偏移地址 EA 满足 SAX16+EA=21F60H 即可。




(2)如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位多少内存单元?

✍结论:偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64K个内存单元。

比如:给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH。




补充:

在8086PC机中,存储单元的地址用两个元素来描述,即段地址和偏移地址
“数据在 21F60H内存单元中。”这句话对于8086PC机一般不这样讲,取而代之的是两种类似的说法:

  1. 数据存在内存2000:1F60单元中

  2. 数据存在内存的2000H段中的1F60H单元中

这两种描述都表示“数据在内存21F60H单元中”

可以根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。

结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。

也可以点点关注,避免以后找不到我哦!

Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

在这里插入图片描述

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

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

相关文章

单片机教案 1.1 ATmega2560单片机概述

第一章 迈进单片机的大门 Arduino是一款便捷灵活、方便上手的开源电子原型平台,为迈进单片机的大门提供了良好的入门途径。以下是对Arduino的详细介绍: 一、Arduino简介 Arduino是一个能够用来感应和控制现实物理世界的一套工具,它由一个基…

C++ 基于SDL库的 Visual Studio 2022 环境配置

系统:w10、编辑器:Visual Studio 2022、 下载地址 必要库: SDL https://github.com/libsdl-org/SDL 字体 https://github.com/libsdl-org/SDL_ttf 图片 https://github.com/libsdl-org/SDL_image 音频 https://github.com/libsdl-org/SDL_m…

连续点击三次用户

有用户点击日志记录表 t2_click_log,包含user_id(用户ID),click_time(点击时间),请查询出连续点击三次的用户数, 连续点击三次:指点击记录中同一用户连续点击,中间无其他用户点击; CREATE TABLE t2_click…

两个div中间有缝隙

两个div中间有缝隙效果图: 这种是display:inline-block造成的 在父元素中加入font-size:0px;,再在相应的子div中加入font-size:12px;就可以了 调整后效果图:

Pandas和Seaborn数据可视化

Pandas数据可视化 学习目标 本章内容不需要理解和记忆,重在【查表】! 知道数据可视化的重要性和必要性知道如何使用Matplotlib的常用图表API能够找到Seaborn的绘图API 1 Pandas数据可视化 一图胜千言,人是一个视觉敏感的动物,大…

数据库-分库分表

什么是分库分表 分库分表是一种数据库优化策略。 目的:为了解决由于单一的库表数据量过大而导致数据库性能降低的问题 分库:将原来独立的数据库拆分成若干数据库组成 分表:将原来的大表(存储近千万数据的表)拆分成若干个小表 什么时候考虑分…

Web 性能优化|了解 HTTP 协议后才能理解的预加载

作者:谦行 一、前言 在性能优化过程中,开发者通常会集中精力在以下几个方面:服务器响应时间(RT)优化、服务端渲染(SSR)与客户端渲染优化、以及静态资源体积的减少。然而,对于许多用…

C(十五)函数综合(一)--- 开公司吗?

在这篇文章中,杰哥将带大家 “开公司”。 主干内容部分(你将收获):👉 为什么要有函数?函数有哪些?怎么自定义函数以及获得函数的使用权?怎么对函数进行传参?函数中变量的…

[嵌入式Linux]—STM32MP1启动流程

STM32MP1启动流程 1.启动模式 STM32MP1等SOC支持从多种设备中启动,如EMMC、SD、NAND、NOR、USB、UART等。其中USB、UART是作为烧录进行启动的。 STM32MP1内部ROM中存储有一段出厂代码来进行判断从哪种设备中启动,上电后这段代码会被执行,这…

使用java函数逆序一个单链表

代码功能 定义了一个ListNode类,用于表示单链表的节点,每个节点包含一个整数值和一个指向下一个节点的引用。 在ReverseLinkedList类的main方法中,创建了一个包含从1到10的整数的单链表。 定义了一个printList方法,用于打印链表的…

基于JavaWeb开发的java springmvc+mybatis酒水商城管理系统设计和实现

基于JavaWeb开发的java springmvcmybatis酒水商城管理系统设计和实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承…

【JAVA基础】集合类之HashSet的原理及应用

近期几期内容都是围绕该体系进行知识讲解,以便于同学们学习Java集合篇知识能够系统化而不零散。 本文将介绍HashSet的基本概念,功能特点,使用方法,以及优缺点分析和应用场景案例。 一、概念 HashSet是 Java 集合框架中的一个重…

Spring Boot实现License生成与校验详解

​ 博客主页: 南来_北往 系列专栏:Spring Boot实战 在软件开发领域,License(许可证)机制是保护软件版权、控制软件使用范围的重要手段。通过为软件生成唯一的License,开发者可以确保只有合法用户才能使用软件&…

右键菜单添加 Open Tabby here

如果安装了Tabby,为了提高效率在鼠标右键菜单中添加Open Tabby here,可以通过按 win R,并输入regedit 回车打开注册表编辑器 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell 然后在Shell下面新建项,名称为Tabby&#xf…

企业架构理论TOGAF从理论到实践:引领企业数字化转型的实践指南

在现代企业面临的数字化转型浪潮中,如何从战略层面实现技术与业务的全面融合,成为了众多企业的核心挑战。TOGAF(The Open Group Architecture Framework)不仅为企业提供了强大的理论框架,还通过实践验证了其在推动企业…

力扣 中等 39.组合总和

文章目录 题目介绍解法 题目介绍 解法 是216组合总和III链接的扩展 class Solution {List<List<Integer>> res new ArrayList<>();List<Integer> path new ArrayList<>();public List<List<Integer>> combinationSum(int[] can…

Windows 下安装mamba_ssm 记录,包括causal-conv1d和mamba-ssm

Windows 下安装mamba_ssm 记录 1 重要参考文献2 具体安装步骤3 一些提醒事项4 安装causal-conv1d5 安装mamba-ssm6 结果展示 1 重要参考文献 Window 下Mamba 环境安装踩坑问题汇总及解决方法 2 具体安装步骤 重点看的是这篇 Window 下Mamba 环境安装踩坑问题汇总及解决方法 …

【Redis】持久化(下)-- AOF

文章目录 AOF概念如何使用AOFAOF工作流程命令写入演示文件同步策略 AOF的重写机制概念触发重写机制AOF重写流程 启动时数据恢复混合持久化总结 AOF 概念 AOF持久化:以独立日志的方式记录每次的写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的.AOF的主要作用是解决…

工行企业网银U盾展期后有两个证书问题的解决方法

工行企业网银U盾证书快到期后&#xff0c;可以自助展期&#xff0c;流程可以根据企业网银提示页面操作。操作后&#xff0c;可能存在两个新旧两个证书并存的情况&#xff0c;致使网银转账等操作失败&#xff0c;如图&#xff1a; 其原因是新证书生成后&#xff0c;旧证书没有删…

wsl配置图形显示环境 no $display environment variable

wsl运行fsl&#xff0c;安装好之后&#xff0c;可以使用bet&#xff0c;等命令行进行操作&#xff0c;但是不能使用fsl呼出窗口。 因为 wsl并不像原生linux具有destop桌面&#xff0c;它只有命令行。所以当运行fsl的时候会报错&#xff0c; application-specific initializat…