Chinaunix首页 | 论坛 | 博客
  • 博客访问: 821457
  • 博文数量: 97
  • 博客积分: 3042
  • 博客等级: 中校
  • 技术积分: 1610
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-21 11:48
文章存档

2015年(1)

2014年(3)

2013年(4)

2012年(43)

2011年(44)

2010年(2)

分类: LINUX

2012-02-24 13:10:34

80286以上的处理器既可以工作在实模式下也可以工作在保护模式下,但8086,8088只能工作在实模式下。在实模式下工作,处理器只可以寻址第一个1M存储空间, 但是在8086,8088上编写的应用程序可以不加修改的在8088以上的处理器上运行。第一个1M存储器又叫是存储器或者常规存储器。
 
段和偏移:
所有的实模式存储器都由段地址和偏移地址组成。加载在一个段寄存器内的段地址定义任意64K字节存储段的开始地址。偏移地址选择在这64K字节存储段内的任何一个单元。
在实模式下,每次在段寄存器内部,在它的最右边,增补一个0H,形成20位的存储地址,允许它去访问第一个1M字节存储器内以任何16字节为边界的段起点。由于实模式段存储器为64字节长,一旦知道起始地址,加上FFFFH就找到结束地址。偏移地址加到短的起点之上,以便寻址在一个存储段内的一个存储单元。例如,段地址是1000H,偏移量是2000H,则处理器寻址10000H + 2000H = 12000H单元,段加偏移量有事也写成1000:2000形式。
 
隐含段和便宜寄存器:
代码段寄存器总是和指针指令寄存器一起用于寻址程序的下一条指(CS:IP)。代码段寄存器确定短起点,指针指令寄存器确定代码段内的下一条指令,如CS = 1400H, EIP = 1200H,微处理器从存储单元14000H + 1200H = 15200H开始取下一条指令。
另外一种隐含的规则就是堆栈段。通过存储单元在堆栈段加上栈指针(SP/ESP)或者基指针(BP/EBP)来指向堆栈数据这些组合用SS:SP或SS:BP来表示。例如,SS = 2000H, BP = 3000H, 那么微处理器的寻址单元23000H,为一个堆栈存储单元。
 

8088, 80486和Pentiun缺省16位段+偏移寻址组合

 

             偏移                                     主要用途

CS             IP                                        指令寻址

SS             SP或者BP                            堆栈寻址

DS             BX, DI, SI, SI, 或16位数      数据寻址

ES             串指令的DI                          串目标寻址

 
8086~80286允许访问4个存储段,80386以上允许访问6个存储段。存储段即可以接触又可以重叠,把段看成一个窗口,它可以越过任意存储区去访问数据或者代码。一个程序可以有多余4个或者6个存储段,但每次只能访问4个或者6个存储段。
 
段加偏移地址寻址的优点:
允许程序在存储器内重定位,允许在实模式下编写的代码在保护模式下运行。
可重定位程序是一个可以不加任何修改的放置到任何存储区而仍能执行的程序。可重定位的数据是可以放在任何存储区而且不加修改的为程序所用的数据。段加偏移量寻址方案允许不加修改程序和数据使程序和数据重定位。因为存储器用偏移地址在段内寻址。存储段可以在不改变任何偏移地址的情况下,移动到存储器的任何位置,通过把整个程序作为一个整体移动到新的区域,只是改变段寄存器的内容,就实现了重定位。
阅读(2073) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~