分段管理,段超越前缀,机器码格式


 

8个通用寄存器

 

 

16 bit

 

accumulate

ax

ah

al

R0

count

cx

ch

cl

R1

data

dx

dh

dl

R2

base

bx

bh

bl

R3

stack

sp

 

R4

stack base

bp

 

R5

source

si

 

R6

destination

di

 

R7

 

 

 

一.存储器的分段管理

1. 808620条地址线,最大可寻址范围0 ~ 2^20 - 1,即00000 ~ FFFFF,可寻址1M内存。

2. 80861M的存储空间分成多个段,每段最大64KB,范围0000 ~ FFFF。采用物理地址=段地址+偏移地址的方式访问地址:reg * 10h + offset。例如要访问地址12345h,表示为12340005,实际地址为1234h * 10h + 5 = 12345h。也可以表示为12300045,即1230h * 10h + 45h = 12345h

  1. 因此,一个物理地址可以有多种表示方法,称为有多个逻辑地址。

 

二. 段寄存器

段寄存器(CS, DS, ES, SS)用于存储段地址,当访问内存数据时,需要先规划好段地址。

  1. CS Code Segment 代码段,CSIP取得下一条要执行的指令,CS存放代码段的段地址,IP存放下条指令的偏移地址。
  2. DS Data Segment数据段,例如11AD875为止存在一个字符串,想显示它,需要确保DS的值为11ADDS不是通用寄存器,所以不能用mov指令直接赋值,要通过通用寄存器中转一下。先mov ax, 11ADmov ds, ax,随后可调用int 21中断显示字符串。
  3. SS Stack Segment堆栈段,SSSP取得栈顶数据,SS存放堆栈段的段地址,SP存放栈顶的偏移地址。
  4. ES Extra Segment附加段,附加段是附加的数据,也用于数据的保存。串操作指令将附加段作为其目的操作数的存放区域。
  5. 随着发展,80386 处理器增加了FSGS,也是附加段,它们没有缩写。

 

三. 段超越前缀指令

没有指明时,一般的数据访问在DS段,但也可以指令访问哪个段。

例如mov ax, [2000]默认访问DS:[2000]

mov ax, ES: [2000]则访问ES:[2000]

但要注意写法,先写前缀:

 

 

 

 

 

例如写了以下代码:

 

 

 

 

 

 

 

可见mov ax,[2000]指令的机器码相同,只是多了段超越前缀,每个前缀只影响下面的一条指令。

 

四. 机器码格式

  1. mov指令

 

 

 

将每条指令机器码的前2字节转成二进制,发现前半部分固定的是指令,后半部分是寄存器编号:

指令   寄存器

10111   000   ax

10111   001   cx

10111   010   dx

10111   011   bx

10111   100   sp

10111   101   bp

10111   110   si

10111   111   di

 

五. 流水线

 

 

 

图中是一个简单的流水线,除了刚启动时,之后取址和译码可以在同一时间都运行,提高了效率。

流水线设计有长流水线和多流水线,长流水线任务切分细,设计简单,但是如果指令预测失败,已完成的任务都白费,付出的代价高。多流水线任务切分粗,设计复杂,需要额外管理成本,但是如果指令预测失败,付出的代价低相对较低。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM