实模式下的地址分段

实模式下的地址分段

在程序里我们可能要操作一些位于内存中的数据,如何找到这些数据呢?当然是通过地址。

程序在执行之前需要加载到内存中,数据也是如此。如果我们直接把需要操作的数据的地址写死在程序代码中,若程序和数据加载的地址发生了变化,那么代码中写死的地址就无效了。

为了解决这个问题,我们引入了分段机制。简单来说就是把物理地址分成若干逻辑段,用于存放指令和数据。每个段的起始地址就是段地址,代码中的地址是段内偏移地址。真实的物理地址由段地址加上偏移地址得到。段地址是程序加载时就写入段寄存器中的。

CS和DS寄存器就分别用于存放代码段地址和数据段地址。ES为附加段地址寄存器,SS为堆栈段地址寄存器。

在8086处理器中,段寄存器是16位的,但是该处理器却有20条地址总线。如何利用16位的段寄存表示20位的地址呢?为此,真实的物理段地址需要右移四位,也就是除以16,这样就得到了16位的逻辑段地址。这就要求段地址必须是16的整数倍。当需要形成物理地址的时候,段寄存器中的段地址就乘以16,再加上代码中的偏移地址就可以得到真实的物理地址。形成物理地址的工作是由一个叫总线接口部件的部件完成的。

16位的段寄存器最多可以表示2的16次方个段地址,20位地址总线最多可以访问1MB个地址。也就是说,每个段的最大是64KB。由此也可以算得每个段最小的大小和最大段数量。

相关推荐
Sss_Ass12 天前
跟着老师不迷路系列---跟着李述铜老师学习汇编语言之基本汇编程序符号绑定语句
学习·嵌入式·汇编语言·李述铜·符号绑定语句
Sss_Ass12 天前
跟着老师不迷路系列---跟着李述铜老师学习汇编语言之内核寄存器简介
学习·学习方法·汇编语言·李述铜
Sss_Ass12 天前
跟着老师不迷路系列——跟着李述铜老师学习汇编语言之基本汇编程序section指令
学习·学习方法·汇编语言·李述铜·section指令
Sss_Ass12 天前
跟着老师不迷路系列---跟着李述铜老师学习汇编语言之基本汇编程序指令集分类
开发语言·学习·学习方法·汇编语言·李述铜
alanesnape2 个月前
CPU眼中的i++ 与 ++i
cpu·汇编语言
肆忆_3 个月前
刨根问底:从反汇编看 C++ 对象的生与死
汇编语言
zhongvv4 个月前
对单片机C语言指针的一些理解
c语言·数据结构·单片机·指针·汇编语言
-曾牛4 个月前
【汇编语言入门】从第一个加法程序吃透汇编核心基础
汇编·单片机·嵌入式硬件·汇编语言·病毒分析·lcx·逆向开发
ComputerInBook4 个月前
函数调用栈帧分析(Windows平台)
c语言·windows·编译原理·汇编语言·c++语言
Logic1014 个月前
深入理解C语言if语句的汇编实现原理:从条件判断到底层跳转
c语言·汇编语言·逆向工程·底层原理·条件跳转·编译器原理·x86汇编