实模式下的地址分段

实模式下的地址分段

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

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

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

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

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

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

相关推荐
10岁的博客14 天前
汇编语言:从基础到高级实战指南
汇编语言
qqxhb2 个月前
系统架构设计师备考第12天——计算机语言组成和分类
系统架构·汇编语言·机器语言·执行顺序·高级语言·数据运算·数据组织
思考着亮2 个月前
6.AT&T汇编
汇编语言
思考着亮2 个月前
5.8086 汇编中栈平衡和函数调用过程分析
汇编语言
数据智能老司机2 个月前
实现逆向工程——汇编指令演练
安全·逆向·汇编语言
Jooolin2 个月前
【教你一招】反汇编有啥用?
c++·ai编程·汇编语言
danzongd2 个月前
浅谈C++ const
c++·内存·优化·汇编语言·计算机系统·寄存器
CYRUS_STUDIO3 个月前
OLLVM 混淆 + VMP 壳照样破!绕过加壳 SDK 的核心检测逻辑
android·逆向·汇编语言
CYRUS_STUDIO3 个月前
Android 下内联汇编开发指南:从基础语法到多架构适配全掌握
android·android studio·汇编语言