【汇编语言】寄存器(CPU工作原理)(三)—— 物理地址,16位结构CPU以及8086CPU给出物理地址的方法

server/2024/10/8 13:38:05/

在这里插入图片描述

文章目录

  • 前言
  • 1. 物理地址
  • 2. 16位结构的CPU
  • 3. 8086CPU给出物理地址的方法
  • 4. 由段地址×16引发的血案……
  • 结语

前言

📌

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

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

文章主要内容:分析物理地址及其组成,16位结构的CPU,探讨8086 CPU如何生成物理地址。

1. 物理地址

CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址
CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不同的CPU可以有不同的形成物理地址的方式。我们现在讨论8086CPU是如何在内部形成内存单元的物理地址的。

2. 16位结构的CPU

我们说 8086CPU的上一代CPU(8080、8085)等是8位机,而8086是16位机,也可以说8086是16位结构的CPU。那么什么是16位结构的CPU呢?

概括地讲,16位结构(16位机、字长为16位等常见说法,与16位结构的含义相同)描述了一个 CPU 具有下面几方面的结构特性

  • 运算器一次最多可以处理16位的数据

  • 寄存器的最大宽度为16位

  • 寄存器和运算器之间的通路为16位

8086是16位结构的CPU,这也就是说,在8086内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位的。内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位CPU,能一次性处理、传输、暂时存储16位的地址。

3. 8086CPU给出物理地址的方法

8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。

📌

解释:因为20位地址总线,代表可以产生 2 20 2^{20} 220种地址,然后由于内存大小是以字节为单位的,每个字节单元都有一个地址。每一种地址都对应一个字节空间大小,所以说20位地址总线就可以寻找 2 20 2^{20} 220个字节的内存空间,所以说寻址能力就是 2 20 2^{20} 220B也就是1MB。

8086CPU是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。从8086CPU的内部结构来看,如果将地址从内部简单地发出,那么它只能送出16位的地址,表现出的寻址能力只有64KB。

那么,8086CPU如何用内部16位的数据转换成20位的地址呢?

8086CPU 采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。相关部件的逻辑结构如下图所示。

在这里插入图片描述

如上图所示,当8086CPU要读写内存时,进行如下步骤:
(1)CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址

(2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件

(3)地址加法器将两个16位地址合成为一个20位的物理地址;

(4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路

(5)输入输出控制电路将20位物理地址送上地址总线

(6)20位物理地址被地址总线传送到存储器

地址加法器合成物理地址的方法:

物理地址=段地址×16+偏移地址

例如,8086CPU要访问地址为123C8H的内存单元,此时,地址加法器的工作过程如下图所示(图中数据皆为十六进制表示)。

在这里插入图片描述

4. 由段地址×16引发的血案……

“段地址×16”有一个更为常用的说法就是数据左移4位(位指的是二进制位)。

我们看一个例子,一个数据为2H,二进制形式为10B,对其进行左移运算:

在这里插入图片描述

我们通过观察移位次数和各种形式数据的关系:

(1)一个数据的二进制形式左移1位,相当于该数据乘以2;

(2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;

(3)地址加法器如何完成段地址×16的运算? 就是以二进制形式存放的段地址左移4位。

经过进一步的思考,我们可以看出:

  • 一个数据的十六进制形式左移1位,相当于乘以16
  • 一个数据的十进制形式左移1位,相当于乘以10
  • 一个数据的X进制形式左移1位,相当于乘以X。

结语

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

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

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

在这里插入图片描述


http://www.ppmy.cn/server/128769.html

相关文章

PHP语言发展历程

PHP是一种开源的服务器端脚本语言,主要用于Web开发,最初由Rasmus Lerdorf在1994年创建。PHP的发展历程如下: PHP的起源:1994年,Rasmus Lerdorf创建了PHP的第一个版本,最初是一套用于跟踪他个人简历访问的C…

【Canvas与标牌】盾形银底红带Best Quality Premium标牌

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>BestQulityPremium金属牌重制版Draft2</title><style type&…

LeetCode 54 Spiral Matrix 解题思路和python代码

题目&#xff1a; Given an m x n matrix, return all elements of the matrix in spiral order. Example 1: Input: matrix [[1,2,3],[4,5,6],[7,8,9]] Output: [1,2,3,6,9,8,7,4,5] Example 2: Input: matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]] Output: [1,2,3,4,8,1…

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 1 部分:Elastic Serverless Forwarder

作者&#xff1a;来自 Elastic Hemendra Singh Lodhi 这是多部分博客系列的第一部分&#xff0c;探讨了将数据从 AWS S3 导入 Elastic Cloud 的不同选项。 Elasticsearch 提供了多种从 AWS S3 存储桶导入数据的选项&#xff0c;允许客户根据其特定需求和架构策略选择最合适的方…

【rCore OS 开源操作系统】Rust mod模块和static生命周期 知识点及练习题

【rCore OS 开源操作系统】Rust 模块 mod 知识点及练习题 前言 虽然是模块的章节&#xff0c;但是也涉及到了一些结构体访问控制、生命周期 相关的知识点。 这里暂不讨论 crate&#xff0c;个人觉得这个东西属于工程化的内容&#xff0c;而不是 rust 的模块语法。 知识点 mo…

计算机网络——DNS

提供域名——>ip地址的转换 分层命名 分布式解析 怎么样维护 DNS实现在边缘系统——传输层及其以上 还提供别名——>规范名字的转换——>ip 负载均衡是一种用于在多个计算资源&#xff08;如服务器、网络设备等&#xff09;之间分配工作负载的技术。其主要目的是…

Qt源码-Qt多媒体音频框架

Qt 多媒体音频框架 一、概述二、音频设计1. ALSA 基础2. Qt 音频类1. 接口实现2. alsa 插件实现 一、概述 环境详细Qt版本Qt 5.15操作系统Deepin v23代码工具Visual Code源码https://github.com/qt/qtmultimedia/tree/5.15 这里记录一下在Linux下Qt 的 Qt Multimedia 模块的设…

雷池+frp 批量设置proxy_protocol实现真实IP透传

需求 内网部署safeline&#xff0c;通过frp让外网访问内部web网站服务&#xff0c;让safeline记录真实外网攻击IP safeline 跟 frp都部署在同一台服务器&#xff1a;192.168.2.103 frp client 配置 frpc只需要在https上添加transport.proxyProtocolVersion "v2"即…