寄存器由来 ES CS SS DS FS GS区别

本文解析了8086 CPU中段寄存器的作用,包括CS(代码段)、DS(数据段)、SS(堆栈段)、ES(扩展段)、FS(标志段)和GS(全局段)。重点介绍了它们如何解决地址总线宽度大于数据总线的问题,以及每个寄存器在内存寻址中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

段寄存器百度百科原地址

cs是代码段寄存器

	存放当前正在运行的程序代码所在段的段基址,表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移量则由IP提供。

ds是数据段寄存器

 	当前程序使用的数据所存放段的最低地址,即存放数据段的段基址

ss是堆栈段寄存器

	当前堆栈的底部地址,即存放堆栈段的段基址

es是扩展段寄存器

	当前程序使用附加数据段的段基址,该段是串操作指令中目的串所在的段

fs是标志段寄存器

	fs是80386起增加的两个辅助段寄存器之一,在这之前只有一个辅助段寄存器ES
	FS寄存器指向当前活动线程的TEB结构(线程结构)
	偏移  说明
	000  指向SEH链指针
	004  线程堆栈顶部
	008  线程堆栈底部
	00C  SubSystemTib
	010  FiberData
	014  ArbitraryUserPointer
	018  FS段寄存器在内存中的镜像地址
	020  进程PID
	024  线程ID
	02C  指向线程局部存储指针
	030  PEB结构地址(进程结构)
	034  上个错误号

gs是全局段寄存器

	gs是80386起增加的两个辅助段寄存器之一,在这之前只有一个辅助段寄存器ES

段寄存器的产生

  1. 段寄存器的产生源于Intel 8086
    CPU体系结构中数据总线与地址总线的宽度不一致。数据总线的宽度,也即是ALU(算数逻辑单元)的宽度,平常说一个CPU是“16位”或者“32位”指的就是这个。8086CPU的数据总线是16位。
  2. 地址总线的宽度不一定要与ALU的宽度相同。因为ALU的宽度是固定的,它受限于当时的工艺水平,当时只能制造出16位的ALU;但地址总线不一样,它可以设计得更宽。地址总线的宽度如果与ALU相同当然是不错的办法,这样CPU的结构比较均衡,寻址可以在单个指令周期内完成,效率最高;而且从软件的解决来看,一个变量地址的长度可以用整型或者长整型来表示会比较方便。但是,地址总线的宽度还要受制于需求,因为地址总线的宽度决定了系统可寻址的范围,即可以支持多少内存。如果地址总线太窄的话,可寻址范围会很小。如果地址总线设计为16位的话,可寻址空间是2^16=64KB,这在当时被认为是不够的;Intel最终决定要让8086的地址空间为1M,也就是20位地址总线。地址总线宽度大于数据总线会带来一些麻烦,ALU无法在单个指令周期里完成对地址数据的运算。有一些容易想到的可行的办法,比如定义一个新的寄存器专门用于存放地址的高4位,但这样增加了计算的复杂性,程序员要增加成倍的汇编代码来操作地址数据而且无法保持兼容性。
  3. Intel想到了一个折中的办法:把内存分段,并设计了4个段寄存器,CS,DS,ES和SS,分别用于指令、数据、其它和堆栈。把内存分为很多段,每一段有一个段基址,当然段基址也是一个20位的内存地址。不过段寄存器仍然是16位的,它的内容代表了段基址的高16位,这个16位的地址后面再加上4个0就构成20位的段基址。而原来的16位地址只是段内的偏移量。这样,一个完整的物理内存地址就由两部分组成,高16位的段基址和低16位的段内偏移量,当然它们有12位是重叠的,它们两部分相加在一起,才构成完整的物理地址
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值