DS 寄存器和 ES 寄存器:

DS  寄存器和  ES  寄存器都属于段寄存器,其实它们和  CS  寄存器以及  SS  寄存器用起来区别不大,

既然是段寄存器的话,自然它们存放的就是某个段地址了 。

通过上面对基础知识的介绍呢,我们已经知道,如果  CPU  要访问一个内存单元时,

我们必须要提供一个指向这个内存单元的物理地址给  CPU ,

而我们也知道在  8086  CPU  中,物理地址是由段地址左移 4  位,然后加上偏移地址形成的,

所以,我们也就只需要提供段地址和偏移地址即 OK 。

8086  CPU  呢,提供了一个  DS  寄存器,并且通常都是通过这个  DS  段寄存器来存放要访问的数据的段地址 。

DS(Data  Segment):很显然,DS 中存放的是数据段的段地址 。

但是这里不得不再点一下,那就是我们对段的支持是在  CPU  上体现的,而不是在内存中实现了段,

所以事实上我们使用的段其实是一个逻辑概念,即是我们自己定义的,

再说白了,我定义一个段,我说它是数据段那它就是数据段,我说它是代码段那么它就是代码段,

它们其实都是一块连续的内存而已,至于为什么要区分为数据段和代码段,

很明显,是用来给我们编程提供方便的,即我们在自己的思想上或者说是编码习惯上规定,

数据放数据段中,代码放代码段中 。而我们在使用数据段的时候,为了方便或者说是代码的编写方便起见,

我们一般把数据段的段地址放在  DS  寄存器中,当然,如果你硬要觉得  DS  不顺眼,那你可以换个  ES  也是一样的,

至于  ES(Extra  Segment)  段寄存器的话,自然,是一个附加段寄存器,如果再说得过分点,

就当它是个扩展吧,当你发现,你几个段寄存器不够用的时候,你可以考虑使用   ES  段寄存器,

在使用方式上,则和其他的段寄存器没什么区别  。

下面看一个介绍使用  DS  寄存器的  Demo:

ASSUME CS:CODESCODES SEGMENTSTART:MOV AX,1000HMOV DS,AXMOV AL,1MOV BX,0MOV CX,5          ;设计一个循环,让其循环 5 次s: MOV [BX],AL       ;这里 [BX] 并没有指定段地址哦INC ALINC BXLOOP s            MOV AH,4CHINT 21H
CODES ENDSEND START

上面的代码所做的事情,就是循环将  1,2,3,4,5 写入到地址  1000H:0000H ,1000H:0001H,

1000H:0002H,1000H:0003H,1000H:0004H  中,

语句的执行过程如下:

首先我们来看尚未执行上述任何指令时栈中的数据情况:

而当循环执行完成以后,我们再来看内存  1000H:0000H 处的值:

在这里,我们可以看到确实达到了我们预期的效果,但是大家注意看代码:

    s: MOV [BX],AL       ;这里 [BX] 并没有指定段地址哦INC ALINC BXLOOP s  

这里可以看到,我们在  [BX]  中并没有给其指定段地址,而只有一个偏移地址,

但是根据我们一开始的介绍,必须要有段地址和偏移地址才能够定位内存单元,

莫非这里出问题了?

其实不是的,因为我们在最前面定义了段地址   DS  为  1000H,

当我们定义好段地址后,每一次  CPU  执行到  [BX]  时,便会自动或者说是默认的从  DS  中取值,

并且将取得的值作为段地址,因此,当  [BX]  为  0001H  时,CPU  会从   DS  中取得一个  1000H ,

由这两个一合成即可以得到正确的物理地址   1000H:0000H 。

最后还提醒一点,那就是   8086  CPU  不支持直接将一个数据送入段寄存器中,

也就是下面的做法是错误的:

    MOV DS,1000H

8086 DS 和 ES 寄存器相关推荐

  1. si,di,ds,es寄存器

    ds和es是段寄存器,si和di是变址寄存器 ds和si组成:ds:si es和di组成:es:di 常用把地址的值赋值给另地址. ds:si ==>es:di 这里还应用到cx,表示赋值的长度 ...

  2. 8086汇编学习之[BX],CX寄存器与loop指令,ES寄存器等

    同类学习笔记总结: (一).8086汇编学习之基础知识.通用寄存器.CS/IP寄存器与Debug的使用 (二).8086汇编学习之DS寄存器.SS/SP寄存器 一.汇编程序的基本格式: 1.基本格式与 ...

  3. 汇编ds和ss寄存器

    一.DS寄存器 8086CPU寄存器都是16位的,数据类型有一下两种: 字节型数据 字型数据 16位寄存器存储一个字,而内存中需两个连续字节单元存储:任何两个连续的内存单元可以看作两个字节单元或一个字 ...

  4. IA-32 Architecture: the function of segment regitster(CS DS SS ES)

    对于IA-32架构,与8086不同,段寄存器不再是像以前一样,直接作为段基址,因为32位的寄存器直接就可以表示4GB大小,不需要再偏移,因此段寄存器的含义也发生了相应的变化. 在IA-32架构里,段寄 ...

  5. 8086cpu中的寄存器(cs、ds、es、ss、ip、sp、bp、si、di)

    1)4个16位段地址寄存器 8086对存储器采用分段管理,4个段寄存器分别用于存放4个当前段的起始地址,又称为段基址寄存器. CS(Code Segment) --代码段寄存器 DS(Data Seg ...

  6. LDT,LDTR,GDT,GDTR,CS,DS,ES,TSS,TR操作系统常见寄存器

    本人平时操作系统常见的一些符号,容易忘记混淆,记录一下,欢迎补充~ LDT:local descriptor table,局部描述符表,主要存放各个任务的私有描述符,如本任务的代码段描述符和数据段描述 ...

  7. Intel的X86芯片段式管理历史起源(CS、DS、ES、SS)——避免产品公司的小九九

    Intel公司在1974年4月发布8080 CPU.这是一枚8位元处理器,时脉为2MHz,亦是第一枚可算得上的处理器. 注意,这里的8位.16位指的是ALU的宽度,而并不是地址线的宽度(如果CPU与地 ...

  8. 8086变址和指针寄存器

    SI和DI称为变址寄存器,在字符串操作中SI作为源指针,DI作为目的指针(ES:DI<--DS:SI) ;用作存储器指针时可用于寻址 DS:[SI],DS:[BX+DI] BP和SP称为指针寄存 ...

  9. 8086汇编语言:标志寄存器的各个标志位的详细介绍

    一.基本介绍: CPU的内部的寄存器中,有一类特殊的寄存器(对于不同的处理机,其个数和结构都可能不同):它具有以下三种作用! 这种特殊的寄存器在8086CPU中,被称为标志寄存器flag.8086CP ...

最新文章

  1. 秒懂JVM的三大参数类型,就靠这十个小实验了
  2. android studio github 项目导入问题
  3. 关于ARP、MAC、IP欺骗以及TCP劫持
  4. l开头的英文车标是什么车_L开头的英文车标叫什么车
  5. 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组
  6. 背景图的属性(backgroud)
  7. 20210314:力扣第 232 场周赛
  8. mysql交换分区_对MySQL交换分区的实践
  9. HP MSA2312 ERROR
  10. 服务器上使用nvcc编译多个cu文件,在cmake中使用nvcc编译。cu
  11. IT6561 IT6563 IT6562 IT6564系列 DP转HDMI
  12. mysql frm 修复_使用mysqlfrm恢复frm表结构
  13. 阿里云盘迎来了第三方客户端小白羊版
  14. 微信聊天,对方回复“哦”怎么办?学会这3个技巧,永不尬聊
  15. 电磁场与仿真软件(29)
  16. Python多线程、多进程最全整理
  17. 人民路婚纱店入驻华盛街
  18. 设计模式:工厂设计模式
  19. 景区传统市场营销已死,智慧景区志在必行!
  20. java匹配IP正则表达式

热门文章

  1. 视频直播关键技术:流畅、拥塞和延时追赶
  2. 【视频】网易杭州研究院副院长汪源2016QCon大会专访
  3. 【ABP杂烩】面向切面编程(AOP)知识总结
  4. 淮南:发力“大数据”能源城激活新动能
  5. PostgreSQL 前世今生
  6. HDU 1867 A + B for you again KMP解决问题的方法
  7. [C] 跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc,兼容Windows、Linux、Mac)...
  8. 用 jQuery 获取 iframe 父子页面元素
  9. APT***的那些事
  10. linux 历史命令列表,fc – 显示历史列表中的命令或修改指定的历史命令并执行。 - Linux 命令大全...