物理地址是怎么确定的?以8086为例

本文详细解析了8086 CPU如何通过段地址与偏移地址结合生成20位物理地址,实现1MB内存空间的有效寻址。

物理地址

我们知道,CPU 访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。

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

而上一篇我们讲到,地址总线的宽度决定CPU的寻址能力。8086有20根地址总线,可以传送20位地址,所以其寻址能力为2^20B,即1M。

很自然地,这里产生了矛盾:如果只是简单地将地址从内部发出,那么8086只能发出16位的地址,表现的寻址能力也就只有2^16byte,即64KB。这这与1M的寻址能力不符!

那么如何解决该矛盾呢?

在正式讨论之前,我们换一个话题。如下图所示,假如大熊要去图书馆,询问胖虎图书馆的具体位置(物理地址),于是胖虎告诉他:

图片

(1)你可以从从学校走2826米能到图书馆;

(2)也可以从学校走2000米到体育馆,再走826米就是图书馆。

显然,两种方式大熊都能找到图书馆的位置。

那么现在加一些限制条件,比如大熊和胖虎之间用如下的方格纸进行通信,那么按照第一种方式直接写入2826表示图书馆的位置就能准确定位。

图片

如果现在再加一个限定条件:假如方格个数只有三个,如何才能定位图书馆的位置呢?

只能采用第二种方式咯:先找到体育馆,再通过偏移的826米找到图书馆。

图片

概括表述为:先用200米表示起始位置,我给它起个名字叫段地址,将200米乘以10的位置我们叫它基地址,基地址再加上偏移位置826米,正好是2826米,也就是图书馆的位置!

好了,我们再回到8086CPU确定物理地址的方式上来,根据上面的例子我们就能解决CPU内部与数据总线的矛盾。8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

(1) CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;

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

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

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

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

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

动图演示如下:

图片

地址加法器采用物理地址=段地址x16+偏移地址的方式合成物理地址,其思想和上述例子中找图书馆的位置时如出一辙的,只不过从10进制变成了计算机的16进制。

图片

当个体受限时,借助外力以及互相配合则显得尤为重要!

图片

君子性非异也,善假于物也。——荀子

两点注意:

(1)段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;

(2)偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。

总结

  • CPU将若干地址连续的内存单元看作一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元;
  • 物理地址=段地址x16+偏移地址
    在这里插入图片描述
<think>嗯,用户问的是以MOV指令为,介绍与数据有关的寻址方法。首先,我得回忆一下计算机组成或者汇编语言里寻址方式的分类。MOV指令在汇编中用于数据传送,所以不同的寻址方式会影响数据是如何被访问和传输的。 用户可能需要的是具体的子,每种寻址方式如何应用于MOV指令。比如立即寻址、直接寻址、寄存器寻址、间接寻址、寄存器间接寻址、基址变址寻址、相对寻址等等。需要确认这些寻址方式是否都属于数据有关的,可能还要排除一些与程序流程控制相关的寻址方式。 首先,我应该列出常见的与数据相关的寻址方式,然后针对每种方式用MOV指令举说明。比如立即寻址就是把操作数直接写在指令里,比如MOV AX, 1234H。直接寻址是操作数的地址直接给出,比如MOV AX, [1234H]。寄存器寻址则是使用寄存器作为操作数,比如MOV AX, BX。 然后要考虑是否有其他类型,比如寄存器间接寻址,比如MOV AX, [BX],这里BX里的值是地址。基址变址可能是MOV AX, [BX+SI]或者类似的结构。还有可能包括比变址、相对基址变址等,具体取决于架构,比如x86的不同模式。 需要确保每个子都正确,并且用中文解释清楚。同时注意用户提到的LaTeX格式,行内公式用$...$,独立公式用$$...$$。不过在这个问题中,可能公式用的不多,主要是汇编代码的子,可能需要用代码块或者适当标注。 还要注意回答的结构,分点说明,结构清晰。可能需要先介绍寻址方式的概念,再分别举MOV的用法。同时检查是否有错误,比如混淆了间接寻址和基址变址寻址的区别,或者是否漏掉了某些常见的寻址方式。 另外,用户可能对寻址方式的应用场景和优缺点感兴趣,是否需要简要说明?比如立即寻址速度快但数据大小受限,直接寻址需要访问内存较慢,寄存器寻址最快但数量有限等。这些信息能帮助用户理解为什么有多种寻址方式。 需要确认MOV指令在不同架构(如x86,ARM)中的差异,但用户没有指定架构,可能默认是x86。但可能需要说明子是基于某种架构的,比如Intel 8086。 还要注意术语的准确性,比如“数据有关的寻址方法”可能指的是操作数的寻址方式,特别是源操作数和目的操作数的不同寻址方式组合是否有效,比如MOV指令是否允许某些组合,比如不能同时两个操作数都是内存地址,这在x86中可能需要使用不同的方式。 可能还需要提到每个寻址方式的语法表示,比如在汇编中的书写方式,以及操作数如何解析。如,直接寻址用方括号,而寄存器间接寻址也用方括号包含寄存器名。 总结下来,步骤应该是: 1. 定义寻址方式的作用和重要性。 2. 分点列出各种与数据相关的寻址方式,每种方式用MOV指令举。 3. 解释每个子中操作数的来源和寻址过程。 4. 可能比较不同方式的优缺点和应用场景。 5. 确保子正确,符合x86汇编语法,避免错误。 现在需要检查是否有遗漏的寻址方式,比如是否有变址寻址、堆栈寻址等,但堆栈寻址可能属于特定指令如PUSH/POP,而MOV可能不使用。或者是否有字符串寻址,但可能属于特定指令如MOVS。 可能需要包括的寻址方式有:立即、直接、寄存器、寄存器间接、基址、变址、基址加变址、相对、比变址等。但需要确认哪些属于与数据有关的,并且在MOV中常见。 最后,组织语言时要清晰,分点说明,每个寻址方式作为一个小标题,然后解释和举。确保符合用户的结构要求,使用中文,正确应用LaTeX格式,如果有公式的话,比如地址计算可能需要用数学表达式,如基址加变址可能是$[BX + SI]$,用行内公式。</think>以`MOV`指令为,与数据有关的寻址方法主要用于确定操作数的来源或目的地。以下是常见的寻址方式及其在`MOV`中的具体应用: --- ### 1. **立即寻址(Immediate Addressing)** - **特点**:操作数直接嵌入指令中,无需访问内存。 - **语法**:`MOV 目标操作数, 立即数` - **示**: ```assembly MOV AX, 1234H ; 将立即数1234H送入AX寄存器 ``` - **应用场景**:初始化寄存器或变量。 --- ### 2. **直接寻址(Direct Addressing)** - **特点**:操作数的地址直接由指令给出。 - **语法**:`MOV 目标操作数, [地址]` - **示**: ```assembly MOV AX, [2000H] ; 将内存地址2000H处的内容送入AX ``` - **地址计算**:直接使用$2000H$作为物理地址。 --- ### 3. **寄存器寻址(Register Addressing)** - **特点**:操作数在寄存器中,速度最快。 - **语法**:`MOV 目标寄存器, 源寄存器` - **示**: ```assembly MOV AX, BX ; 将BX寄存器的值复制到AX ``` - **限制**:操作数必须为寄存器。 --- ### 4. **寄存器间接寻址(Register Indirect Addressing)** - **特点**:寄存器中存储的是操作数的地址。 - **语法**:`MOV 目标操作数, [寄存器]` - **示**: ```assembly MOV AX, [BX] ; 将BX指向的内存内容送入AX ``` - **地址计算**:操作数地址为$BX$的值。 --- ### 5. **基址寻址(Base Addressing)** - **特点**:基址寄存器(如BX或BP)与偏移量结合。 - **语法**:`MOV 目标操作数, [基址寄存器 + 偏移量]` - **示**: ```assembly MOV AX, [BX+10H] ; 将BX+10H地址处的内容送入AX ``` - **地址计算**:$物理地址 = BX + 10H$。 --- ### 6. **变址寻址(Indexed Addressing)** - **特点**:使用变址寄存器(如SI、DI)与偏移量结合。 - **语法**:`MOV 目标操作数, [变址寄存器 + 偏移量]` - **示**: ```assembly MOV AX, [SI+20H] ; 将SI+20H地址处的内容送入AX ``` --- ### 7. **基址变址寻址(Base-Indexed Addressing)** - **特点**:基址寄存器与变址寄存器组合。 - **语法**:`MOV 目标操作数, [基址寄存器 + 变址寄存器]` - **示**: ```assembly MOV AX, [BX+SI] ; 将BX+SI地址处的内容送入AX ``` - **地址计算**:$物理地址 = BX + SI$。 --- ### 8. **相对寻址(Relative Addressing)** - **特点**:以当前指令指针(IP)为基准的偏移量。 - **语法**:`MOV 目标操作数, [IP + 偏移量]` - **示**: ```assembly MOV AX, [IP+100H] ; 将IP+100H地址处的内容送入AX ``` --- ### 9. **比变址寻址(Scaled Indexed Addressing)** - **特点**:支持变址寄存器乘以比因子(如2、4),常见于32/64位架构。 - **语法**:`MOV 目标操作数, [基址寄存器 + 变址寄存器*比因子]` - **示**: ```assembly MOV EAX, [EBX + ESI*4] ; 将EBX+ESI*4地址处的内容送入EAX ``` --- ### 总结 | 寻址方式 | 操作数来源 | 性能特点 | |------------------|------------------------------|-----------------------| | 立即寻址 | 指令内直接提供数据 | 最快,无内存访问 | | 寄存器寻址 | 寄存器 | 速度快 | | 直接/间接寻址 | 内存地址 | 需访存,速度较慢 | | 基址/变址寻址 | 基址或变址寄存器+偏移量 | 灵活,适合数组/结构体 | 通过灵活组合这些寻址方式,`MOV`指令可以高效地完成数据在不同位置(寄存器、内存、立即数)之间的传输。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子象限

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值