赞
踩
目录
含有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
此种寻址方式中的寄存器主要是通用寄存器,不含控制寄存器,段寄存器限制使用。
关注点:
存储器操作数的字长本身不确定,其字长取决于指令中另一个寄存器操作数,或通过其他方式指定字长
直接寻址 指令直接给出操作数的偏移地址 例如 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]
- MOV AX,2000H
- MOV DS,AX
- MOV BX,1200H
- MOV AL,[BX]5
执行完毕后 AL就是将内存中1205H送入到AL中去。
相对寻址主要用于一维数组的操作,常将位移量作为“表头”地址,间址寄存器的值作为表内相对地址。
基址、变址寻址
操作数的偏移地址为:一个基址寄存器的内容(基址寄存器BX,BP)+一个变址寄存器(SI,DI)的内容
操作数的段地址由选择的基址寄存器决定:基址寄存器为BX,默认在数据段。基址寄存器为BP,默认在堆栈段
基址变址寻址方式与相对寻址方式一样,主要用于一维数组操作
- MOV SI,1100H
- MOV BX,SI
- MOV AX,[SI+BX]
基址、变址、相对寻址
操作数的偏移地址为:基址寄存器内容+变址寄存器内容+位移量
操作数的段地址由选择的基址寄存器决定,基址变址相对寻址方式主要用于二维表格操作。
- MOV DI,1100H
- MOV BP,DI
- MOV AL,[BP][DI]5
隐含寻址
指令中隐含了一个或两个操作数的地址,即操作数在默认的地址中。
- MUL BL //乘法操作 忽略了被乘数
- 指令执行:
- AL×BL----->AX
寻址方式表示指令运算对象的来源和运算结果的去向
注意点:立即寻址仅针对源操作数
寄存器寻址表示指令运算的数据在寄存器中(常为通用寄存器)‘
存储器寻址表示指令运算的对象在内存中 数据在内存中的偏移地址在 [ ]中,段地址可以默认或重设
存储器寻址和寄存器寻址均可用于源或目标操作数
从功能上包括六大类:数据传输、算术运算、逻辑运算和移位、串操作、程序控制、处理器控制。
除标志传送指令外,其它指令的执行对标志位不产生影响。
该类所有指令的执行均不影响标志位
一般数据传送指令
注意点:两操作数字长必须相同
两操作数不允许同时为存储器操作数
两操作数不能同时为段寄存器
在源操作数是立即数的时候,目标操作数不能是段寄存器
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端口的操作的指令
端口地址在指令中的表示方式 (寻址方式)
指令的功能:从端口地址读入数据到累加器/将累加器的值输出到端口
指令格式:
- 输入指令:IN acc,PORT
- 输出指令:PORT,acc(AL/AX)
指令的寻址方式:根据端口地址码的长度,指令具有两种不同的端口地址表现形式:
直接寻址:端口地址为8位时,指令中直接给出8位端口地址;寻址256个端口
间接寻址:端口地址为16位时,指令的端口地址必须由DX指定;可以寻址64K个端口
- IN AX,80H 从80H端口读入16bit数据到AX
- MOV DX,2400H
- IN AL,DX 从2400H端口读入8bit数据到AL
- OUT 35H,AX 将AX的值写入到35H端口中
加法运算指令、减法运算指令、乘法指令、除法指令
算术运算指令的执行大多对站台标志位会产生影响
加法指令 普通加法指令ADD、带进位的加法指令ADC、加1指令INC
ADD指令的执行会对全部6个状态标志位都产生影响
ADC指令多用于多字节数相加,使用前要将CF归零
INC不能是段寄存器,不能是立即数。INC指令的执行不影响CF,影响其他五位标志位
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。