码农的笔记

Delphi虽好,但已不流行; 博客真好,可以做笔记

博客园 首页 新随笔 联系 订阅 管理

------------------------------------------------------------------

----------------------------------

 

--------------------

 

------------

 

 ---------------------

 

 

 

 

 

---------------------------------------------------------

段寄存器

8086CPU有14个寄存器

AX,BX,CX,DX,si,di,sp,bp,ip,cs,ss,ds,es,psw

其中有8个通用寄存器

 

8086寄存器16位,可以存放两个字节

AX BX CX DX一般用来存放一般数据

 

 

 

 

 

为保证兼容性,这四个寄存器可以分为两个独立的8位寄存器使用

AX可以分为AH和AL

H高L低

同样的对于ABCD-X

 

 

 

 

 

 

 

 

字在寄存器中的存储

一个字可以存在一个16位寄存器中

Word=2B

 

关于数制的讨论

二进制太冗长

几条汇编指令

 

 

Mov ax,18                  将18送入                 AX = 18

Add ax,8                     将寄存器AX中的数制加上8                  AX = AX + 8

Mov ax,bx                 将寄存器BX中的数据送入寄存器AX中              AX = BX

 

例如如果在寄存器中加法数据超过了16位

例如 

 

 

AX = 8226H BX =8226H

Add ax,bx

Ax=044c

Ax值应该为1044C但是最高位溢出,但是CPU并不会抛弃该内容,但是1会放到进位寄存器中

这里的丢失,指的是进制位不能再8位寄存器中保存,但是CPU不是真的丢弃这个进位值,该问题在后面讨论。

 

 

Cpu访问内存单元是要给出内存单元的地址。所有的内存单元构成的存储空间是一个线性空间。 

我们将这个唯一的地址成为物理地址。

 

16位结构的CPU

概括的讲,16为结构描述了一个CPU具有以下几个方面特征

  1. 运算器一次最多可以处理16位数据
  2. 寄存器的最大宽度为16位
  3. 寄存器和运算器之间的通路是16位的

 

 

8086有20位地址总线,可传送20位地址,寻址能力为1M

内部为之流微结构,只能传送16位的地址,表现出的寻址能力却只有64k

8086采取一种在内部用两个16位地址合成的方法来形成一个20位的物理地址

 

16位段地址和16为偏移地址,通过地址加法器转换成20位物理地址

 

 

地址加法器合成物理地址的方法

物理地址 = 段地址 * 16 + 偏移地址

十六进制数据相当于向左移一位

相应的如果是二进制数则向左移四位

 

例如

8086CPU访问地址为123C8H的内存单元

 

 

 

 

 

简单的可以推算到,一个数据的二进制形式左移N位,相当于该数据乘以2的N次方

 

所以对于地址加法器完成*16的步骤相当于左移4位

 

段地址错误的概念

内存被划分成了一个一个短,每一个段都有一个段地址的认识是错的

内存划分来自于CPU,由于8086CPU用“(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以分段的方式来管理内存

 

两点需要注意

1)  段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数

2)  偏移地址为16位,16为地址的寻址能力为64K,所以一个段长度最大为64K

 

内存单元地址小结

1)CPU访问内存单元时,必须向内存提供内存单元的物理地址

2)8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址

3)CPU可以用不同的段地址和偏移地址形成同一个物理地址

 

8086CPU中存储单元用两个元素来猫叔,即段地址和偏移地址

数据在21F60H内存单元中,对于8086有两种描述

a)       数据在内存2000:1F60单元中

b)       数据存在内存的2000段中的1F60H中

 

可根据需要,降低至连续起始位置为16的倍数的一组内存单元定义为一个段

 

 

 

段寄存器

段寄存器就是提供段地址的

8086CPU有四个段寄存器

CS DS SS ES

Code segment

Data segment

Stack segment

Extra Segment

当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址

 

 

CS和IP

其实8086CPU中最关键的寄存器,他们指示了CPU当前要读取指令的地址

CS为代码段寄存器 code segment

IP为指令指针寄存器

 

工作过程的简要描述

1)  从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器

2)  IP = IP+ 所读取指令唱的,从而指向下一条指令

3)  执行指令,转到步骤1,重复这个过程

 

8086PC工作过程的简要描述

1)在8086CPU加电启动活着复位时,CS=FFFFH ,IP= 0000H

2)即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行

3)FFFF0H单元中的指令是8086PC机开机后执行的第一条指令

 

CS和IP在任何时候CPU将CS和IP的内容当成指令的段地址和偏移地址,用他们合成失灵的物理地址,到内存中读取指令码执行。

如果说,内存中的一段信息曾将被CPU执行过的话,那么它所在的内存单元必然被CS:IP指向过。

 

 

修改CS,IP指令

在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。

CPU从何处执行指令是由CS,IP中的内容决定的,程序员可以通过改变CS,IP中的内容来控制CPU执行目标指令

 

我们如何改变CS,IP的值

         我们如何修改AX的值

         Mov

         如mov ax,123

         Mov指令可以改变8086CPU大部分寄存器的值,被称为传送指令

 

??能够通过mov改变cs,ip值吗?

不行,但是8086提供了体术的指令jmp

Jmp段地址:偏移地址

Jmp 2AE3:3   (2AE33)

Jmp 3:0B16      (00B46)

 

功能:用指令中给出的段地址修改CS,偏移地址修改IP

 

仅修改IP内容

Jmp 某一合法寄存器

Jmp ax(类似于mov IP,ax)

Jmp bx

 

功能 :用寄存器中的值修改IP

 

问题分析:CPU运行的流程

 

 

 

 

 

 

 

代码段

对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。

可以将长度为N(N《=64K)的一组代码,存在一组地址连续,其实地址为16的倍数的内存单元中,这段内存使用来存放代码的,从而定义了一个代码段

 

例如

 

 

如何使代码段的指令被执行呢?

讲一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU并不会有由于这种安排,就自动地将我们定义的代码段中的指令当做指令来执行

因为CPU只认被CS:IP指向的内存单元中的内容为指令

所以只要将CS:IP只想多定义的代码段中的第一条指令的首地址

 

小结

段地址在8086CPU的寄存器中存放,当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086有4个段寄存器,其中cs用来存放指令的段地址。

Cs存放指令的段地址,IP存放指令的偏移地址

8086机中,任意时刻,CPU将CS:IP指向的内容当做指令执行

转自:http://blog.163.com/willwang_blog/blog/static/2212130942013581154349/

 

这个链接下有图片,,我为了省懒就这么复制粘贴了,只为学习留个资料留个纪念

posted on 2017-06-28 16:30  码农的笔记  阅读(1255)  评论(0编辑  收藏  举报