当前位置:   article > 正文

微机原理(FPGA设计CPU理解)_fpga 8086

fpga 8086

目录

8088内部寄存器

通用寄存器

控制寄存器

段寄存器

内存储器管理

内存地址变换

段寄存器

逻辑段与逻辑地址

堆栈及堆栈段的使用

指令与指令系统

指令的格式

指令中操作数

立即数

寄存器操作数

存储器操作数

指令的寻址方式

寻址方式

立即寻址

寄存器寻址

存储器操作数的寻址方式

小结 

8086指令系统

数据传送类指令

通用数据传送指令

地址传送指令

标志传送指令

输入输出指令

算数运算指令


8088内部寄存器

含有14个16为寄存器,按照功能可以分为三类

8个通用寄存器、4个段寄存器、2个控制寄存器

通用寄存器

数据寄存器(AX,BX,CX,DX)

8088/808含四个16位数据寄存器,它们可以分为8个8位寄存器 拆开后彼此相互独立没有高八位,低八位之分。但是当两个寄存器合起来时AH一定是高八位,AL一定是低八位。

AX---->AH,AL

BX----->BH,BL

CX----->CH,CL

DX----->DH,DL

数据寄存器的专用方法

AX:累加器 所有I/O接口都通过AX与接口传送信息,多用于存放中间运算结果

BX:基址寄存器 间接寻址中用于存放基地址

CX:计数寄存器 用于循环或串操作中存放计数值

DX:数据寄存器 间接寻址的I/O指令中存放I/O端口地址 在32位乘除法运算时,存放高16位

地址指针寄存器(SP,BP)

SP堆栈指针寄存器,其内容为栈顶的偏移地址 (只要是堆栈存在,那么SP就作为专用寄存器,作为栈顶指针)

BP基址指针寄存器,常用作在访问内存时存放内存单元的偏移地址

变址寄存器(SI,DI)

SI 源变址寄存器

DI 目标变址寄存器

变址寄存器在指令中常用于存放数据在内存中的地址

控制寄存器

IP 指令指针寄存器,其内容为下一条要取指令的偏移地址

FLAGS 标志寄存器 存放运算结果的特征

6个状态标志位   (CF SF AF PF OF ZF)
CF (Carry Flag):    进位标志位,加减法时最高位有进位(借位)则 CF=1
OF (Overflow Flag): 溢出标志位,当算数超出了有符号数的可表达范围时 OF=1
ZF (Zero Flag):     零标志位,当运算结果为零时 ZF=1
SF (Sign Flag):     符号标志位,当运算结果最高位为1时 SF=1

PF (Parity Flag):            奇偶标志位,运算结果低8位中"1"的个数为偶数时 PF=1
AF (Auxiliary Carry Flag):   辅助进位标志位,加减操作,若bit3向bit4有进位(借位) AF=1
3个控制标志位   (IF TF DF)  
 TF (Trap Flag):             陷阱标志位, TF=1 时使CPU处于单步执行指令的工作方式
IF (Interrupt Enable Flag): 中断允许标志位, IF=1 时使CPU可以响应可屏蔽中断请求
DF (Direction Flag):        方向标志位,在数据串操作时确定操作方向

段寄存器

用于存放相应逻辑的段基地址

代码段:存放指令代码
CS(寄存器): 代码段寄存器,存放代码段的段基地址
数据段:存放操作的数据
DS(寄存器): 数据段寄存器,存放数据段的段基地址
附加段:存放操作的数据
ES(寄存器): 附加段寄存器,存放数据段的段基地址
堆栈段:存放暂时不用但是需要保存的数据
SS(寄存器):堆栈段寄存器,存放堆栈段的段基地址
 

内存储器管理

8088CPU是16位体系结构的微处理器

可以同时处理(产生)16位二进制码 可以产生64K个编码

8088CPU需要管理1MB内存 需要能够产生1M个地址编码(16×64K)

内存地址变换

欲实现对1MB内存空间的正确访问,每个内存单元在整个内存空间中必须具有唯一地址  ->物理地址 内存地址变换:如何将直接产生的16位编码变换为20位物理地址

内存每个单位的地址在逻辑上都由两部分组成:

段(基)地址:指示存储单元在整个内存空间中处于哪个区域(段)

段内地址(相对地址/偏移地址):指示存储单元在段内中的相对位置(与段内第一个单元的距离)

8088为16位结构,所以段地址和偏移地址均为16位

段地址(16位)偏移地址(16位)

内存地址变换的目的就是如何将这个32位的地址变换成20位的物理地址

段首的偏移地址为0000H  16位的0和4位的零是一样的,据此我们可以将32位的地址转换为20位的地址 所以段首的物理地址为:

段地址(16位)0000

内存物理地址由段基地址和偏移地址组成:物理地址=段基地址×16+偏移地址

物理分段的缺点是将内存按照一定的大小进行分块,在实际的使用中可能产生内存浪费,使用效率低的情况所以在实际过程中一般不使用物理分段的方法。

段寄存器

作用:用于存放相应逻辑段的段基地址

8086/8088内存中逻辑段的类型:

代码段:存放指令代码   

数据段:存放操作的数据

附加段:存放操作的数据

堆栈段:存放暂时不用但需要保存的数据

8086/8088内存中每类逻辑段的数量最多为64K个

段寄存器

CS代码段寄存器,存放代码段的段基地址

DS数据段寄存器,存放数据段的段基地址

ES附加段寄存器,存放数据段的段基地址

SS堆栈段寄存器,存放堆栈段的段基地址

逻辑段与逻辑地址

内存的分段是逻辑段,不是物理段。各个逻辑段在地址上可以不相连、可以部分重合、也可以完全重合。

每个内存单元具有唯一物理地址,但可能具有多个逻辑地址。即:

一个内存单元可以同时处于两个逻辑段

一个内存单元可以在不同的时刻属于相同(或不同)类型的段

一个内存单元在同一时刻可以属于不同类型的段。

堆栈及堆栈段的使用

堆栈:内存中一个特殊的区域,用于存放暂时不用或者需要保护的数据,常用于响应中断或子程序的调用。

堆栈可以形象的比喻成一个箱子,往箱子里放东西时,首先占用的是箱子底部。

若栈顶=栈底 空栈  SP栈顶指针

若栈顶=栈首 满栈

指令与指令系统

指令:控制计算机完成某种操作的命令(一条指令包含的信息:运算数据的来源、运算结果的去向 、执行的操作)

指令系统:处理器所能识别的所有指令的集合

指令的兼容性:同一系列机的指令都是兼容的

指令的格式

操作码操作数操作数
执行何种操作目标操作数(运算结果的去向)源操作数(运算数据的来源)
参加操作的数据或数据存放的地址

零操作数指令:操作码

单操作数指令:操作码 操作数

双操作数指令:操作码 操作数 操作数

多操作数指令:三操作数及以上

指令中操作数

立即数表示参加操作的数据本身
寄存器表征数据存放的地址
存储器

立即数

由指令直接给出,是常数性质的

无地址含义,指标是运算的数据(不能作为目标操作数)

例如:MOV    AX,1234H  将常数1234H送给目标寄存器AX

 MOV BL,22H  将常数22H送给目标寄存器BL

立即数无法作为目标操作数

寄存器操作数

表示运算的数据存放在寄存器中

多数情况下,寄存器操作数指通用寄存器

在三类操作数中所需运行时间最短

例如:MOV AX,BX 将BX中的内容送给AX

 MOV DL,CH 将CH中的内容送给DL

在CPU中内部执行所以速度最快

存储器操作数

表示运算的数据存放在内存

指令中【】里是数据所在单元的偏移地址

在三类操作数中所需运行时间最长

例如 MOV AL,[1200H] 表示将内存中偏移地址1200H中的内容送给AL

MOV AX,[1200H] AX是16位寄存器 将1201H 1200H中的内容合并送给AX

指令的寻址方式

寻址方式

操作数可能的来源或运算结果可能的去处:由指令直接给出、寄存器、内存单元

寻找操作数所在地址的方法可能有三种大类型:指令直接给出方式、存放在寄存器中的寻址方式、存放在存储器中的寻址方式

立即寻址

有指令直接给出运算的数据(操作数是立即数)。为常数形式或字符形式

立即数只能表示运算的数据,无地址含义

立即寻址仅适合于源操作数。即源操作数是参加操作数据本身

寄存器寻址

参加操作的操作数在CPU的通用寄存器中

例如:MOV AX,BX

此种寻址方式中的寄存器主要是通用寄存器,不含控制寄存器,段寄存器限制使用。

存储器操作数的寻址方式

关注点:

  1. 指令操作的对象在内存中,表现形式为:[   ]
  2. 指令中给出运算对象在内存某个逻辑段中的偏移地址 [  偏移地址  ]
  3. 逻辑段的段基地址通过默认或者重设方式给出

存储器操作数的字长本身不确定,其字长取决于指令中另一个寄存器操作数,或通过其他方式指定字长 

直接寻址 指令直接给出操作数的偏移地址 例如 MOV AX,[1200H]

直接寻址方式下,操作数默认在数据段,但允许段重设,即由指令给出所在逻辑段 例如MOV AX,ES(段重设符):[ 1200H]    此时表示数据在附加段

寄存器间接寻址 操作数存放在内存中,数据在内存中的偏移地址为方括号中通用寄存器的内容。仅四个通用寄存器可用于存放数据的偏移地址(间址寄存器BX,BP,SI,DI)

例如MOV BX,1200H MOV AX,[BX ] 

有寄存器简介给出操作数的偏移地址,存放偏移地址的寄存器称为间址寄存器,操作数的段地址(数据处于哪个段)取决于选择哪一个间址寄存器:BX,SI,DI默认在数据段 BP默认在堆栈段

寄存器相对寻址操作数的偏移地址为寄存器的内容加上一个位移量 例如:MOV AX,[BX+DATA]

  1. MOV AX,2000H
  2. MOV DS,AX
  3. MOV BX,1200H
  4. MOV AL,[BX]5

执行完毕后 AL就是将内存中1205H送入到AL中去。

相对寻址主要用于一维数组的操作,常将位移量作为“表头”地址,间址寄存器的值作为表内相对地址。

基址、变址寻址

操作数的偏移地址为:一个基址寄存器的内容(基址寄存器BX,BP)+一个变址寄存器(SI,DI)的内容 

操作数的段地址由选择的基址寄存器决定:基址寄存器为BX,默认在数据段。基址寄存器为BP,默认在堆栈段

基址变址寻址方式与相对寻址方式一样,主要用于一维数组操作

  1. MOV SI,1100H
  2. MOV BX,SI
  3. MOV AX,[SI+BX]

基址、变址、相对寻址

操作数的偏移地址为:基址寄存器内容+变址寄存器内容+位移量

操作数的段地址由选择的基址寄存器决定,基址变址相对寻址方式主要用于二维表格操作。

  1. MOV DI,1100H
  2. MOV BP,DI
  3. MOV AL,[BP][DI]5

隐含寻址

指令中隐含了一个或两个操作数的地址,即操作数在默认的地址中。

  1. MUL BL //乘法操作 忽略了被乘数
  2. 指令执行:
  3. AL×BL----->AX

小结 

寻址方式表示指令运算对象的来源和运算结果的去向

注意点:立即寻址仅针对源操作数

寄存器寻址表示指令运算的数据在寄存器中(常为通用寄存器)‘

存储器寻址表示指令运算的对象在内存中 数据在内存中的偏移地址在 [ ]中,段地址可以默认或重设

存储器寻址和寄存器寻址均可用于源或目标操作数

8086指令系统

从功能上包括六大类:数据传输、算术运算、逻辑运算和移位、串操作、程序控制、处理器控制。

数据传送类指令

  1. 通用数据传送指令
  2. 输入输出指令
  3. 地址传送指令
  4. 标志传送指令

除标志传送指令外,其它指令的执行对标志位不产生影响。

通用数据传送指令

  1. 一般数据传送指令
  2. 堆栈操作指令
  3. 交换指令
  4. 查表转换指令
  5. 字位扩展指令

该类所有指令的执行均不影响标志位

一般数据传送指令

 注意点:两操作数字长必须相同

两操作数不允许同时为存储器操作数

两操作数不能同时为段寄存器

在源操作数是立即数的时候,目标操作数不能是段寄存器

IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现

判断下列指令的正确性

MOV AL,BX×两操作数字长不同
MOV AX,[SI]05H源操作数作为相对寻址
MOV [BX][BP],BX×目标操作数寻址方式错误(基址,基址)
MOV DS,1000H×不能用立寻址方式给段寄存器赋值
MOV DX,09H
MOV [1200],[SI]×两操作数不能同时为存储器操作数

堆栈操作指令

堆栈操作的原则先进后出、以字为单位

堆栈操作指令:压栈操作PUSH OPRD (16位寄存器或存储器两单元)、出栈操作 POP OPRD

堆栈操作指令说明 :指令的操作数必须是16位;操作数可以是寄存器或存储器两单元,但是不能是立即数。

交换指令

实现两操作数的互换

XCHG REG ,MEM/REG

两操作数必须有一个是寄存器操作数

不允许使用段寄存器

查表指令

XLAT 

用BX的内容表示表格首地址,AL内容为表内位移量 BX+AL得到要查找元素的偏移地址,将BX+AL所指单元的内容送给AL    

字位扩展指令

将符号数的符号位扩展到高位

指令为零操作数指令,采用隐含寻址,隐含的操作数为AX及AX,DX 无扩展数的扩展规则为在高位加零。

地址传送指令

取偏移地址指令LEA  (取近地址指针)

LDS指令和LES指令 (取远地址指针)

LEA指令 将变量的16为偏移地址写入到目标寄存器,当程序中用符号表示内存的偏移地址时,需使用该指令。 格式LEA REG,MEM 指令要求:源操作数必须是一个存储器操作数,目标操作数通常为间址寄存器

标志传送指令

 LAHF、SAHF隐含操作数AH。 PUSHF、POPF隐含操作数FLAGS

LAHF将FLAGS的低八位装入到AH中

输入输出指令

专门面向I/O端口的操作的指令

端口地址在指令中的表示方式 (寻址方式)

指令的功能:从端口地址读入数据到累加器/将累加器的值输出到端口

指令格式:

  1. 输入指令:IN acc,PORT
  2. 输出指令:PORT,acc(AL/AX)

指令的寻址方式:根据端口地址码的长度,指令具有两种不同的端口地址表现形式:

直接寻址:端口地址为8位时,指令中直接给出8位端口地址;寻址256个端口

间接寻址:端口地址为16位时,指令的端口地址必须由DX指定;可以寻址64K个端口

  1. IN AX,80H 从80H端口读入16bit数据到AX
  2. MOV DX,2400H
  3. IN AL,DX 从2400H端口读入8bit数据到AL
  4. OUT 35H,AX 将AX的值写入到35H端口中

算数运算指令

加法运算指令、减法运算指令、乘法指令、除法指令

算术运算指令的执行大多对站台标志位会产生影响

加法指令 普通加法指令ADD、带进位的加法指令ADC、加1指令INC

ADD指令的执行会对全部6个状态标志位都产生影响

ADC指令多用于多字节数相加,使用前要将CF归零

INC不能是段寄存器,不能是立即数。INC指令的执行不影响CF,影响其他五位标志位

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/628625
推荐阅读
相关标签
  

闽ICP备14008679号