段寄存器是因为对内存的分段管理而设置的。

16位CPU有四个段寄存器,其程序可同时访问四个不同含义的段,引用方面有如下规定:
1. 取命令:段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。
2. 取堆栈:段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。
3. 取数据:段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES。
4. 其它情况,段寄存器除了其默认引用的寄存器外,还可以强行改变为其它段寄存器。

32位CPU内有6个段寄存器,程序在某一时刻可访问6个不同的段。其段寄存器的值在不同的方式下具有不同的含义:
1. 代码段寄存器:32位微机在取指令时,系统自动引用CS和EIP来取出下条指令。
2. 堆栈段寄存器:32位微机在访问堆栈段时,总是引用堆栈段寄存器SS。堆栈指针可用32位的ESP和16位的SP。
3. 数据段寄存器:DS是主要的数据段寄存器。通常情况下,它是除访问堆栈以外数据时的默认段寄存器。在某些串操作中,其目的操作数的段寄存器被指定为ES是另一个例外。
段寄存器CS、SS、ES、FS和GS也都可以作为访问数据时的段寄存器(原来是DS),但它们必须用段超越前缀的方式在指令中直接写出。用这种方式会增加指令的长度,指令的执行时间也有所延长。
一般来说,程序频繁访问的数据段用DS来指向,不太经常访问的数据段可用ES、FS和GS等来指向。

--------------------------------------操作数的寻址方式------------------------------------------
1. 立即寻址方式(操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数)
MOV AH, 80H
ADD AX, 1234H

2. 寄存器寻址方式(指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器)
ADD VARD, EAX (源操作数是寄存器寻址方式)
ADD BH, 78h (目的操作数是寄存器寻址方式)
MOV EAX, EBX (源和目的操作数都是寄存器寻址方式)

3. 直接寻址方式(指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址)
MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。
执行该指令要分三部分:
1). 由于1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出;
2). 访问数据段的段寄存器是DS,所以,用DS的值(左移4位)和偏移量1234H相加,得存储单元的物理地址:21234H;
3). 取单元21234H的值5213H,并按“高高低低”的原则存入寄存器BX中。
所以,在执行该指令后,BX的值就为5213H。
MOV ES:[1000H], AX (认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来)

4. 寄存器间接寻址方式(用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;用BP来指定,则其缺省的段寄存器为SS)
MOV BX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。
执行结果 PA=(DS)*16+DI=1000H*16+2345H=12345H。该指令的执行效果是:把从物理地址为12345H开始的一个字的值传送给BX。

5. 寄存器相对寻址方式(同上,但增加一个偏移量)
MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H
EA=(SI)+100H=2345H+100H=2445H
PA=(DS)*16+EA=1000H*16+2445H=12445H
该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。

6. 基址加变址寻址方式(效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和)
MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H
EA=(BX)+(SI)=2100H+0011H=2111H
PA=(DS)*16+EA=1000H*16+2111H=12111H
该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。

7. 相对基址加变址寻址方式(同上,但增加一个偏移量)
MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H
EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H
PA=(DS)*16+EA=1000H*16+2310H=12310H
该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。
下面四种书写方式等价:
MOV AX, [BX+SI+1000H]
MOV AX, 1000H[BX+SI]
MOV AX, 1000H[BX][SI]
MOV AX, 1000H[SI][BX]

8. 32位地址的寻址方式
在用16位寄存器来访问存储单元时,只能使用基地址寄存器(BX和BP)和变址寄存器(SI和DI)来作为地址偏移量的一部分,但在用32位寄存器寻址时,不存在上述限制,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。
当用32位地址偏移量进行寻址时,内存地址的偏移量可分为三部分:一个32位基址寄存器,一个可乘1、2、4或8的32位变址寄存器,一个8位/32位的偏移常量,并且这三部分还可进行任意组合,省去其中之一或之二。

EA = 基址寄存器 + 变址寄存器*比例因子(1或2或4或8)+偏移常量(无/8位/32位)
疑问:这里没有出现段寄存器。难道32位情况下,段寄存器的值是0,或者是什么值都不重要。

32位基址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;
32位变址寄存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)

由于32位寻址方式能使用所有的通用寄存器,所以,和该有效地址相组合的段寄存器也就有新的规定。具体规定如下:
1). 地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器;
如:[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器;
2). 默认段寄存器的选用取决于基址寄存器;
3). 基址寄存器是EBP或ESP时,默认的段寄存器是SS,否则,默认的段寄存器是DS;
4). 在指令中,如果使用段前缀的方式,那么,显式段寄存器优先。

指令的举例 访问内存单元所用的段寄存器
MOV AX, [123456H] ;默认段寄存器DS
MOV EAX, [EBX+EBP] ;默认段寄存器DS
MOV EBX, [EBP+EBX] ;默认段寄存器SS
MOV EBX, [EAX+100H] ;默认段寄存器DS
MOV EDX, ES:[EAX*4+200H] ;显式段寄存器ES
MOV [ESP+EDX*2], AX ;默认段寄存器SS
MOV EBX, GS:[EAX+EDX*2+300H] ;显式段寄存器GS
MOV AX, [ESP] ;默认段寄存器SS

段寄存器和8种地址寻址方式相关推荐

  1. 汇编的8种寻址方式,以及2个默认段寄存器

    16位CPU所含有的寄存器有(见图2.1中16位寄存器部分): 4个数据寄存器(AX.BX.CX和DX) 2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP) ,32位CPU增加2个16位 ...

  2. ARM处理器9种基本寻址方式,和单片机微机原理寻址方式截然不同,(例如没有直接地址寻址,只能间接指针寻址或者寄存器变址寻址,立即数寻址,不是所有立即数都可直接寻址)不可套用理解。需独立学习

    基本寻址方式 寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,ARM处理器有9 种基本寻址方式. 1.寄存器寻址 操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,寄存器 ...

  3. ARM寄存器的7种工作模式和几种寻址方式

    ARM寄存器的7种工作模式 CPSR[5:0] 10000 user 10001 FIQ 10010 IRQ 10011 SVC 10111 中止 11011 未定义 11111 系统 用这两个指令读 ...

  4. 2020-11-24(Windows保护模式学习笔记(1)—— 段寄存器与段权限检查)

    X86 CPU的三个模式:实模式.保护模式和虚拟8086模式 0x01 段寄存器 通常情况下,我们认为有8个段寄存器,他们分别是 ES CS SS DS FS GS LDTR TR 其中,后四个寄存器 ...

  5. Windows保护模式学习笔记(一)—— 段寄存器GDT表

    Windows保护模式学习笔记(一)-- 段寄存器&GDT表 保护模式 参考书籍: 一.段寄存器 段寄存器的结构 段寄存器的读写 段寄存器的属性 1)探测Attribute: 2)探测Base ...

  6. 通用寄存器介绍和段寄存器的介绍

    以下内容来自百度百科: (提示:点击蓝色的字,可以进入百度百科看相关内容) 通用寄存器 目录 简介 主要用途 相关信息 编辑本段简介 通用寄存器 通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算, ...

  7. win32 段寄存器怎么寻址

    32位cpu 地址线扩展成了32位,这和数据线的宽度是一致的.因此,在32位机里其实并不需要采用"物理地址=段:偏移"这种地址表达方式.原来在16位机里规定的 每一个段不大于64k ...

  8. Intel 64/x86_64/IA-32/x86处理器段寄存器 - 32位段寄存器/64位段寄存器

    Segment Registers 本节主要讲述Intel处理器中的段寄存器,用于支持处理器的段式存储器管理机制.16位的8086/Intel286处理器有4个段寄存器CS/DS/SS/ES.32位的 ...

  9. IA-32寄存器(通用寄存器、EFLAGS寄存器、指令指针寄存器、段寄存器)

    文章目录 一.通用寄存器(GPR) 二.EFLAGS寄存器(标志寄存器) 三.指令指针寄存器(EIP) 四.段寄存器(Segment Register) 通用寄存器(General Purpose R ...

最新文章

  1. Windows API函数大全
  2. 大厂面试官必问的Mysql锁机制
  3. 解剖人脸识别从无到有的发展史
  4. 《TCP/IP详解 卷1:协议》第4章 ARP:地址解析协议
  5. OpenCV中绘制外围矩形框和圆框
  6. hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化
  7. 孔板流量计计算公式_带你全面了解各种流量计!
  8. hdu 1394 Minimum Inversion Number
  9. 请求 Provisional headers are shown 问题
  10. Geoserver入门操作系列之二:创建图层样式
  11. 关于GX WORKS2中M8002、M8012、M8013无法使用的问题
  12. 智源首席科学家孙茂松当选欧洲科学院外籍院士
  13. Tapestry介绍
  14. 2014年双11淘宝靠谱外贸原单店铺和天猫店铺推荐
  15. CAS算法与ABA问题
  16. 搭载3D立体相册网页 加入背景音乐 真香!
  17. 高代|共轭矩阵 自共轭矩阵
  18. 初次办流量卡,怎么才能区分是不是物联卡?
  19. 1017 A除以B(C语言)
  20. 特性阻抗公式 (含微带线,带状线的计算公式)

热门文章

  1. 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 绑定作用域 binding 变量分析 | Binding 类 variables 成员分析 )
  2. 【错误记录】Android Studio 编译时 Kotlin 代码编译报错 ( Not enough information to infer type variable T )
  3. 【MATLAB】三维图形绘制 ( 三维平面图 | 二维网格 | meshgrid 函数 | 绘制网格 | mesh 函授 | 绘制平面 | surf 函数 | 绘制等高线 | contour 函数 )
  4. 【Flutter】Animation 动画 ( Flutter 动画类型 | Flutter 动画的核心类 )
  5. Sql Server触发器的使用
  6. javascript DOM 编程艺术 札记2 平稳退化
  7. BZOJ2816: [ZJOI2012]网络
  8. (Matlab)从已知向量中随机提取若干元素
  9. 11.typescript-元组
  10. js中iframe访问父页的方法