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

段寄存器百度百科原地址

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位是重叠的,它们两部分相加在一起,才构成完整的物理地址
  • 18
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在x86架构的汇编语言中,要加载段寄存器SSDSESFSGS)的描述符选择器,可以使用指令`MOV`或`LDS`。 1. 使用`MOV`指令加载描述符选择器: ```assembly MOV AX, selector ; 将描述符选择器加载到 AX 寄存器 MOV DS, AX ; 将 AX 中的值加载到 DS 寄存器 ``` 在这里,`selector`是描述符选择器的值,可以是一个立即数或一个存储在内存中的值。首先,将描述符选择器加载到通用寄存器(例如AX)中,然后将该寄存器的值移动到相应的段寄存器(例如DS)中。 2. 使用`LDS`指令加载描述符选择器: ```assembly LDS BX, descriptor ; 将描述符加载到 BX 寄存器 ``` 这里的`descriptor`是一个有效的内存地址,它指向一个包含两个字(16位)的数据项。第一个字是段选择子(描述符选择器),第二个字是段的偏移地址。`LDS`指令将两个字分别加载到BX和DS寄存器中,其中段选择子加载到DS寄存器。 需要注意的是,加载描述符选择器之前,必须先设置好段寄存器所在的段。例如,如果要加载DS寄存器的描述符选择器,必须先设置好CS寄存器的段,因为CS寄存器的段会用于访问指令。同样的道理,如果要加载SS寄存器的描述符选择器,必须先设置好SS寄存器的段,因为SS寄存器用于堆栈操作。 在实际的汇编程序中,具体的操作会根据程序的需求和上下文而有所不同。以上提供的示例代码只是展示了如何使用`MOV`和`LDS`指令加载段寄存器的描述符选择器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值