8086 DS 和 ES 寄存器
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 寄存器相关推荐
- si,di,ds,es寄存器
ds和es是段寄存器,si和di是变址寄存器 ds和si组成:ds:si es和di组成:es:di 常用把地址的值赋值给另地址. ds:si ==>es:di 这里还应用到cx,表示赋值的长度 ...
- 8086汇编学习之[BX],CX寄存器与loop指令,ES寄存器等
同类学习笔记总结: (一).8086汇编学习之基础知识.通用寄存器.CS/IP寄存器与Debug的使用 (二).8086汇编学习之DS寄存器.SS/SP寄存器 一.汇编程序的基本格式: 1.基本格式与 ...
- 汇编ds和ss寄存器
一.DS寄存器 8086CPU寄存器都是16位的,数据类型有一下两种: 字节型数据 字型数据 16位寄存器存储一个字,而内存中需两个连续字节单元存储:任何两个连续的内存单元可以看作两个字节单元或一个字 ...
- IA-32 Architecture: the function of segment regitster(CS DS SS ES)
对于IA-32架构,与8086不同,段寄存器不再是像以前一样,直接作为段基址,因为32位的寄存器直接就可以表示4GB大小,不需要再偏移,因此段寄存器的含义也发生了相应的变化. 在IA-32架构里,段寄 ...
- 8086cpu中的寄存器(cs、ds、es、ss、ip、sp、bp、si、di)
1)4个16位段地址寄存器 8086对存储器采用分段管理,4个段寄存器分别用于存放4个当前段的起始地址,又称为段基址寄存器. CS(Code Segment) --代码段寄存器 DS(Data Seg ...
- LDT,LDTR,GDT,GDTR,CS,DS,ES,TSS,TR操作系统常见寄存器
本人平时操作系统常见的一些符号,容易忘记混淆,记录一下,欢迎补充~ LDT:local descriptor table,局部描述符表,主要存放各个任务的私有描述符,如本任务的代码段描述符和数据段描述 ...
- Intel的X86芯片段式管理历史起源(CS、DS、ES、SS)——避免产品公司的小九九
Intel公司在1974年4月发布8080 CPU.这是一枚8位元处理器,时脉为2MHz,亦是第一枚可算得上的处理器. 注意,这里的8位.16位指的是ALU的宽度,而并不是地址线的宽度(如果CPU与地 ...
- 8086变址和指针寄存器
SI和DI称为变址寄存器,在字符串操作中SI作为源指针,DI作为目的指针(ES:DI<--DS:SI) ;用作存储器指针时可用于寻址 DS:[SI],DS:[BX+DI] BP和SP称为指针寄存 ...
- 8086汇编语言:标志寄存器的各个标志位的详细介绍
一.基本介绍: CPU的内部的寄存器中,有一类特殊的寄存器(对于不同的处理机,其个数和结构都可能不同):它具有以下三种作用! 这种特殊的寄存器在8086CPU中,被称为标志寄存器flag.8086CP ...
最新文章
- 秒懂JVM的三大参数类型,就靠这十个小实验了
- android studio github 项目导入问题
- 关于ARP、MAC、IP欺骗以及TCP劫持
- l开头的英文车标是什么车_L开头的英文车标叫什么车
- 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组
- 背景图的属性(backgroud)
- 20210314:力扣第 232 场周赛
- mysql交换分区_对MySQL交换分区的实践
- HP MSA2312 ERROR
- 服务器上使用nvcc编译多个cu文件,在cmake中使用nvcc编译。cu
- IT6561 IT6563 IT6562 IT6564系列 DP转HDMI
- mysql frm 修复_使用mysqlfrm恢复frm表结构
- 阿里云盘迎来了第三方客户端小白羊版
- 微信聊天,对方回复“哦”怎么办?学会这3个技巧,永不尬聊
- 电磁场与仿真软件(29)
- Python多线程、多进程最全整理
- 人民路婚纱店入驻华盛街
- 设计模式:工厂设计模式
- 景区传统市场营销已死,智慧景区志在必行!
- java匹配IP正则表达式
热门文章
- 视频直播关键技术:流畅、拥塞和延时追赶
- 【视频】网易杭州研究院副院长汪源2016QCon大会专访
- 【ABP杂烩】面向切面编程(AOP)知识总结
- 淮南:发力“大数据”能源城激活新动能
- PostgreSQL 前世今生
- HDU 1867 A + B for you again KMP解决问题的方法
- [C] 跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc,兼容Windows、Linux、Mac)...
- 用 jQuery 获取 iframe 父子页面元素
- APT***的那些事
- linux 历史命令列表,fc – 显示历史列表中的命令或修改指定的历史命令并执行。 - Linux 命令大全...