8086段寄存器
8086的访问内存的时候:物理地址=段地址×16+偏移地址,这个段地址由段寄存器来提供。8086有4个段地址寄存器,分别是CS,DS,ES,SS。其中CS是最为关键的,因为CS:IP指示了CPU需要读取的地址。IP是指令指针寄存器,在这里就作为偏移地址。也就是说:在8086CPU中,任意时刻,CPU都会把CS:IP指向的内容当作指令来执行。每读取一次之后,IP中的值会自动增加(增加的长度就是所读取到的指令的长度),以便CPU读取下一个指令。
8086在上电或者复位的时候,CS被设置为0xFFFFH,IP被设置为0x0000H。也就是说CPU此时执行的是0xFFFF0H内存处的指令。
在冯诺依曼结构的计算机中是指令和数据是一起存放的,因此8086上述的方式就解决了这个问题。CS:IP所指向的一定是指令,不会是数据。
8086提供了修改CS:IP的指令,它们被称之为转移指令,例如JMP指令。一个同时修改CS:IP的内容的指令如下:
JMP 0x07c0:0x0000,执行之后CS=0x7c00,IP=0x0000。此时CPU将去0x7c00处读取指令。
当然,如果仅仅只修改IP的内容,那么可以使用JMP 某一合法寄存器,例如:
MOV AX,1234H
JMP AX
执行上面的指令之后,IP的值就会被修改为1234。这两条指令其实就相当于:MOV IP,AX。当然8086并没有提供MOV可以修改CS和IP的功能,也就不存在MOV IP,AX这样的指令了。
需要注意的是8086是小端模式,也就是说数据的高位对应高地址,数据的低位对应低地址。例如下图所示的在内存中分布的数据。
假设20000(4E20H)在Intel的8086的计算机上,在内存中应该是低地址0存放20H,高地址1存放4E。由于8086一次性能处理16位数据,也就是两个字节,我们通常称之为1个字,故:1字=2字节。
前文我们说过,CS:IP给出的地址一定是指令地址,那么数据的地址呢?在8086PC中,DS段寄存器通常用来存放要访问的数据的段地址。下面是一个例子:
MOV AX,1000H
MOV DS,AX
MOV BX,[0] ;[]表示内存一个单元,其中的0表示偏移地址。
这三条指令执行完以后,DS=1000H,BX取到了1000:0000地址处的数据。8086在执行最后一条指令的时候会自动去取DS中保持的段地址。
- 技术分享 | 浅谈 RAS
- Sniper-OJ 练习平台多题WriteUp
- 怎么能学透一个知识点
- Jarvis-OJ平台多题WriteUp分享
- 会员提问 之 JS中的私有方法有什么意义?
- 本周末的QQ群视频--还是电商网站的事
- 【译】使用Apache的mod重写来保护你的C2 Empire
- 大白话,设计一个购物车对象
- 【译】Cromos – 下载并注入代码到谷歌 Chrome 浏览器扩展中
- X-NUCA 2017第三期 WriteUp
- 学习分享 | Flipped Ciphertext Bits
- 聊一下JavaScript定时器
- java redis 通用组建
- 学习分享 | Padding Oracle
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 分布式追踪实战
- python的接班者之coconut
- Docker 垃圾回收机制补充
- 通过docker image 获取到 dockerfile
- Tensorflow2.0实现简单的RNN文本分析
- 利用Tensorflow2.0实现手写数字识别
- PyTorch,TensorFlow和NumPy中Stack Vs Concat | PyTorch系列(二十四)
- 为什么大家都说“SELECT *”效率低?
- 手把手教你如何搭建一套GPS定位系统平台
- [较难]LeetCode-4.寻找两个正序数组的中位数 利用数组扩充和二分法切割思想实现
- Go Errors 错误处理
- MySQL数据库备份实操
- spring-cloud-config:配置同步原理
- Newbe.Claptrap 框架入门,第二步 —— 简单业务,清空购物车
- 来自前端同学对后端童鞋的吐槽!@!#^$%