chap.3 指令系统(续 8086系统结构和8086指令系统)_第1页
chap.3 指令系统(续 8086系统结构和8086指令系统)_第2页
chap.3 指令系统(续 8086系统结构和8086指令系统)_第3页
chap.3 指令系统(续 8086系统结构和8086指令系统)_第4页
chap.3 指令系统(续 8086系统结构和8086指令系统)_第5页
已阅读5页,还剩153页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8086CPU结构CPU引脚及其功能存储器组织与堆栈总线周期与操作时序

第一部分8086系统结构§1.18086CPU结构

一、8086的功能结构

Intel8086是一个由Intel于1978年所设计的16位微处理器芯片,是x86架构的鼻祖。

8086从功能上分为两部分:总线接口部分(BIU),执行部分(EU)。两部分各自执行自己的功能,并行工作,这种工作方式与传统的计算机在执行指令时的串行工作方式相比极大地提高了工作效率。

通用寄存器AHALBHBLCHCLDISI暂存寄存器ALU标志寄存器执行部分控制电路123456CSDSSSESIP

内部寄存器总线控制逻辑地址加法器20位16位8位指令队列缓冲器6个字节外总线执行部件(EU)总线接口部件(BIU)8086CPU结构图DHDLSPBPALU的数据总线16位1、总线接口部件(BIU)功能:(1)地址的形成(2)从内存取指令送到指令队列(3)CPU执行指令时,读/写操作数(4)总线控制总线接口部件的组成:(1)四个段地址寄存器

CS,16位代码段寄存器(CodeSegment)

DS,16位数据段寄存器(DataSegment)

ES,16位附加段寄存器(ExtraSegment)

SS,16位堆栈段寄存器(StackSegment)(2)16位指令指针寄存器IP(PC)。InstructionPointerregister(3)20位的地址加法器。(4)六字节的指令队列缓冲器。(5)总线控制逻辑:发出总线控制逻辑说明:(1)指令队列缓冲器:存放6字节的指令代码,先进先出,允许预取6字节指令代码。(2)地址加法器:产生20位地址。CPU内无论是段地址寄存器还是偏移量都是16位的,通过地址加法器产生20位地址。2、执行部件作用:(1)从指令队列中取出指令。(2)对指令进行译码,发出相应的控制信号。(3)接收由总线接口送来的数据或发送数据至接口。(4)进行算术、逻辑运算。执行部件的组成:(1)4个通用寄存器:AX(累加器)、BX(基址寄存器)、CX(计数寄存器)、DX(数据寄存器)

四个通用寄存器都是16位或作两个8位来使用。(2)4个专用寄存器SP------堆栈指针寄存器(在堆栈操作使用)StackPointerBP------基址指针寄存器BasePointerDI-------目的变址寄存器DestinationIndexSI-------源变址寄存器(和DI成为变址寄存器,通常与DS一起使用,提供偏移量)SourceIndex(3)算术逻辑单元ALU

完成8位或者16位二进制算术和逻辑运算,计算偏移量。(4)数据暂存寄存器协助ALU完成运算,暂存参加运算的数据。(5)执行部件的控制电路:取指令控制和时序控制从总线接口的指令队列取出指令操作码,通过译码电路分析,发出相应的控制命令,控制ALU数据流向。(6)标志寄存器16位寄存器,其中有7位未用。D15D0OFDFIFTFSFZFAFPFCF进借位标志奇偶标志半进借位标志零标志符号标志单步中断中断允许方向标志溢出标志1-有进、借位0-无进、借位1-低8位有偶数个10-低8位有奇数个11-低4位向高4位有进、借位0-低4位向高4位无进、借位1-结果为00-结果不为03、CPU执行程序的操作过程(1)20位地址形成,并将从该地址指定的单元中取出指令字节,依次放入指令队列中。(2)当指令队列中有2个空字节时,总线接口部件就会自动取指令至队列中。(3)执行部件从指令队列队首取出指令代码,执行该指令。(4)当队列已满,执行部件又不使用总线时,总线接口部件进入空闲状态。(5)执行转移指令、调用指令、返回指令时,先清空队列内容,再将要执行的指令放入队列中。§1.28086CPU的引脚及其功能8086CPU可在两种模式下工作:

最小模式:只有一8086CPU。最大模式:有两个或两个以上的CPU,一个为主CPU8086,另一个为协CPU8087。指令周期:执行一条指令所需要的时间。总线周期:CPU通过总线与存储器或I/O接口进行一次数据传输所需的时间。T状态(时钟周期):CPU处理动作的最小单位。

T1状态——输出存储器地址或I/O地址。T2状态——输出控制信号。T3和Tw状态——总线操作持续,并检测READY以决定是否延长时序。T4状态——完成数据传送T1T2T3TWT4总线周期01020304050607080910111213141516171819204039383736353433323130292827262524232221GNDAD14AD13AD12AD11AD10AD9AD8AD7AD6AD5AD4AD3AD2AD1AD0NMIINTRCLKGNDVCC(5V)AD15A16/S3A17/S4A18/S5A19/S6/BHE/S7MN//MX/RDHOLD(/RQ//GT0)

HLDA(/RQ//GT1)/WR(/LOCK)M//IO(/S2)DT//R(/S1)/DEN(/S0)ALE(QS0)/INTA(QS1)/TESTREADYRESET8086一、最小模式下的引脚及功能1、地址/数据总线(AddressandDataBus)AD15-AD0:地址/数据复用引脚,双向,三态。在T1状态,为16位地址总线A15-A0,输出访问存储器或I/O的地址信息。在T2~T4状态,为16位数据总线D15-D0,与存储器和I/O设备交换数据信息。地址/数据总线复用,分时工作。2、A19/S6-A16/S3(Address/Status)地址/状态总线复用引脚,输出,三态。T1状态:输出地址的高4位信息A19-A16T2、T3、T4状态:输出状态信息S6:指示当前CPU是否与总线相连,S6=0,表示8086当前与总线相连。S5:中断允许标志当前的状态。

S5=0,禁止一切可屏蔽中断源的中断请求;

S5=1,允许一切可屏蔽中断源的中断申请。S4、S3:当前正在使用的段寄存器

S4S3段寄存器

00当前正在使用ES01当前正在使用SS10当前正在使用CS11当前正在使用DS

(5)READY:准备就绪信号,输入,高电平有效。

READY=1,表示CPU访问的存储器或IO端口已准备好传送数据。若CPU在总线周期T3状态检测到READY=0,表示未准备好,CPU自动插入一个或多个等待状态TW,直到READY=1为止。(6)INTR:可屏蔽中断请求信号,输入。当INTR=1,表示外设向CPU发出中断请求,CPU在当前指令周期的最后一个T状态去采样该信号,若此时,IF=1,CPU响应中断,执行中断服务程序。

(10)RESET:复位信号,输入,高电平有效。RESET信号至少要保持4个时钟周期。复位时:标志寄存器、IP、DS、SS、ES为0,CS=FFFFH,指令队列清空。复位后CPU从FFFF0H处开始执行。(11)ALE:地址锁存允许信号,输出,高电平有效。用来锁存地址信号A15-A0,分时使用AD15-AD0地址/数据总线。

4、电源线和地线8086/8088采用单+5V,1、20引脚为地线。1.3

8086存储器组织1、存储器编址2、存储器的分段结构3、8086存储器的分体结构

1、存储器编址

在内存里以字节为单位存取信息,系统为每个字节编一个地址(二进制数表示,书写格式为十六进制),称为存储器地址,存储的内容即为数据。地址内容00000H00001H00002HFFFFFH000000010010001101000101……存储器中的数据及表示形式2301H(规则字)4523H(非规则字)地址内容00000H00001H00002HFFFFFH000000010010001101000101……01H2301H4523H45H数据地址字节数01H00000H字节数23H00001H字节数45H00002H字2301H00000H字4523H00001H顺序存放,低字节低地址(字数据)2、存储器的分段结构

8086有20条地址线,寻址达220(1M)字节,把1M字节的存储器分为任意数量的段,其中每一段最多可达寻址216(64K)字节。

每个段的起始地址必须能16整除(该地址的最低四位为0000)。

8086可将内存最多可分为64K个段,最少可分为16个段。每个段的最大范围是64KB,最小的段是16B。段与段之间可连续分布,也可重叠。

(1)逻辑地址和物理地址物理地址:也称实际地址,是用唯一的20位二进制数所表示的地址,规定了1M字节存储体中某个具体单元的地址。逻辑地址在程序中使用,即段地址:偏移地址

。如2000H:0003H2000H:0000H12H0001H34H0002H56H0003H78H

(2)物理地址的形成物理地址=段基址*16(左移4位)+偏移地址。段基址:CS、DS、ES、SS。偏移地址:IP、DI、SI、BX、BP、SP等。物理地址的形成如下:(由20位地址加法器实现)段寄存器值偏移量+物理地址16位4位16位20位0000一个存储单元可以有一个或多个逻辑地址,但只能有一个物理地址。例如物理地址21000H可以有以下几个逻辑地址:

2100:0000H2000:0100H段基址由系统自动分配,而偏移地址则由用户编程时提供。

CS0000IP代码段DS或ES0000SI、DI或BXSS0000SP或BP数据段堆栈段存储器段寄存器和偏移地址寄存器组合关系

8086用两个存储体来组织实际存储空间

奇地址偶地址00001H00003H00000H00002HFFFFEHFFFFFH….….A0A0~A19BHED8~D15D0~D7地址交叉排列8086D0~D15规划字(对准字)存放:偶地址作为字的地址非规划字(非对准字)存放:奇地址作为字的地址规则字的读/写只需访问一次存储器;非规则字的读/写需二次访问存储器。第一次访问奇地址,第二次访问偶地址。

§1.4总线周期与操作时序指令周期:执行一条指令所需要的时间。总线周期:CPU通过总线与存储器或I/O接口进行一次数据传输所需的时间。T状态(时钟周期):CPU处理动作的最小单位。T1T2T3TWT4总线周期T1状态——输出存储器地址或I/O地址。T2状态——输出控制信号。T3和Tw状态——总线操作持续,并检测READY以决定是否延长时序。T4状态——完成数据传送8086的操作时序分为如下几个总线周期:(1)总线读周期

(2)总线写周期(3)总线空操作(4)中断响应周期(5)总线保持和响应周期(6)复位操作

(4)TW状态在T3状态,存储器或外设没有准备好数据,不能在T3状态将数据放到总线上,使READY=0,则CPU在T3和T4之间插入一个或几个TW状态,直到数据准备好READY=1为止。TW状态时总线的动作与T3时相同。(5)T4状态CPU对数据总线进行采样,读出数据。CPU往存储器或I/O设备读数据的时序如下页所示:CLKT1T2T3、TWT4

A19/S6-A16/S3A19-A16/BHE/S7/BHES7-S3ALEREADYAD15-AD0地址输出数据输入

CPU从存储器或I/O端口读取数据的时序

(5)T4状态在T4状态,数据从数据总线上被撤除,各种控制信号和状态信号进入无效状态,CPU完成了对存储器或I/O设备的写操作。

3、总线空操作8086只有在CPU和存储器或外设要传送数据时,才能执行上述的总线周期;当指令队列已满,且EU未申请访问存储器时,不执行总线周期,总线接口进入了总线空闲周期。S6~S3同前一总线周期;若前一周期是读周期,则AD15~AD0为高阻态;总前一周期是写周期,则AD15~AD0保持数据有效。CLKT1T2T3、TWT4M//IOA19/S6-A16/S3A19-A16/BHE/S7/BHES7-S3ALEREADYAD15-AD0地址输出数据输出/WRDT//R/DENCPU往存储器或I/O端口写数据的时序4、中断响应周期中断响应周期:CPU中止现行程序转中断服务程序这一过程。中断响应周期要用两个总线周期。第一个响应周期:使AD15-AD0、/BHE/S7、A19/S6-A16/S3悬空。第二个响应周期:外设向数据总线上输送一个字节的中断类型号。每一响应周期的T1状态输出一个高电平脉冲,作为地址锁存信号。CLKT1T2T3T4T1T2T3T4第一中断响应周期第二中断响应周期ALE/INTAAD7-AD08086中断响应周期的时序图中断类型号5、总线保持和响应周期当系统中CPU之外的另一个控制器要求使用总线时,向CPU发请求信号HOLD。在每个时钟脉冲的上升沿,CPU检测HOLD,如为高电平,并且允许让出总线时,在总线周期的T4或空闲状态Ti之后的下一个时钟周期,CPU发出总线响应信号HLDA,并且让出总线,直到HOLD信号无效,CPU才收回总线控制权。6、系统复位产生:RESET端上的高电平维持4个时钟周期,可使CPU复位。CPU复位:PSW、DS、ES、SS、IP等寄存器被清零,指令队列被清空。CS寄存器设置为FFFFH。当RESET由高电平变低电平7个机器周期后,CPU开始从FFFF0处执行程序。注:由于复位后,IF=0,处关中断状态,所以在初始化程序中应开中断,使CPU可响应中断请求。8086的复位时序:CLKRESET输入RESET内部三态门浮空CPU内部用时钟CLK来同步外部的复位信号8086CPU复位后总线信号:AD15-AD0:A19/S6-A16/S3:/BHE/S7:S2、S1、S0:/LOCK、/RD、/INTA:ALE、HLDA、QS0、QS1:/RQ//GT0:/RQ//GT1:高阻状态低电平高电平第二部分8086指令系统指令系统是微处理器(CPU)所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统。本部分介绍8086/8088CPU的寻址方式以及各种指令系统,并通过具体实例讲述了各条指令的功能和使用方法。通过本部分的学习,读者应该掌握以下内容:

•4类操作数的寻址方式

•常用指令的格式、功能、以及对标志位的影响§2.18086的寻址方式汇编指令的格式如下:形成有效操作数过程称之为操作数的寻址。操作来源有四种:立即数、寄存器、存储器、I/O端口。操作码操作数一、立即寻址方式指令操作数部分直接给出指令的操作数,操作数与操作码一起存入代码段中。立即数有8位和16位。例:MOVAL,05H;源操作数为立即寻址指令执行后,AL=05H,8位数据05H存入AL寄存器。例:MOVAX,3064H;源操作数为立即寻址指令执行后,AX=3064H,16位数据3064H存入AX寄存器。注意:①立即数只能作源操作数,不能作目的操作数。②以A、B、C、D、E、F开头的数字出现在指令中时,必须在前面加一个数字0。③立即数可以送到寄存器、存储器中。例:下列指令是错误的。

MOV2000H,AXMOVAL,B5H

而指令MOV[2000H],1234H是对的。二、寄存器寻址方式

寄存器寻址方式的操作数是寄存器的值,指令中直接使用寄存器名,包括8位或16位通用寄存器和段寄存器。可使用的16位寄存器:AX、BX、CX、DX、SI、DI、SP、BP、CS、DS、ES、SS;其中AX、BX、CX、DX可各自分成两个8位寄存器别使用。例:MOVAX,CX;(AX)←(CX)

MOVAL,1H;(AL)←

1注意:①CS不能作为目的操作数,如MOVCS,AX是错误的指令。②源操作数必须与目的操作数相匹配。如

MOVAL,BX是错误的三、存储器寻址方式偏移地址、有效地址与物理地址 在存储器寻址方式中,操作数是某个内存单元的 内容(值),指令中给出的是内存单元的偏移地 址(即有效地址EA)。段地址通常在隐含的某 个段寄存器中。存储单位的实际地址即为物理地 址,它通常由段地址和有效地址组合而成由于内存单元的地址的给出方式不同,存储器寻址又可分为以下几种寻址方式:直接寻址寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址寻址物理地址=段基址+EA1、直接寻址方式

形式:MOVAX,[nn]//直接地址

MOVAX,X//标号地址

在直接寻址方式中,操作数的偏移地址(有效地址EA)直接用指令加以指定(有直接地址值和标号两种形式),它存放在代码段中指定操作码之后操作数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。段地址隐含的由DS指定,也可以ES指定(需在指令中指明)。存储器地址为:

DS:偏移地址或ES:偏移地址。例:MOVAX,[2000H]

将DS:2000H单元内容送入AXMOVAL,[2000H]

将DS:2000H单元的内容取一个字节送AL例:MOVAX,ES:[2000H]

将ES:2000H单元中的内容送入AX

传送原则:低地址的内容(字节)送寄存器的低位,高地址的内容送寄存器的高位。段超越前缀:显式给出段基址寄存器2、寄存器间接寻址寄存器间接寻址方式的操作数形式为:[reg]操作数的有效地址包含在基址寄存器BX,基址指针BP或一个变址寄存器(SI或DI)中。寄存器间接寻址要用方括号括起来(寄存器寻址区别)例:MOVAX,[BX];将由BX决定的存储单元的内容送到AX寄存器。0000000100020003BBAAAXAHALAABB寄存器间接寻址数据段0002BX操作数在存储器中,指令中寄存器内容作为操作数所在单元的有效地址。

(BX)(SI)(DI)(BP)有效地址=

默认的段寄存器为DS默认的段寄存器为SS物理地址计算方法:物理地址=(DS)*16+(BX)或(SI)或(DI)物理地址=(SS)*16+(BP)例:已知:(DS)=2100H,(DI)=2000H

指令:MOVAX,[DI];的执行结果是?解:物理地址=(DS)*16+(DI)

=2100H*16+2000H=21000H+2000H=23000H

指令结果:将23000H单元内容送AL中,将23001H单元内容送AH中。例:MOVAX,DS:[BP]MOVBX,ES:[SI]这些是使用段超越前缀的3、寄存器相对寻址方式操作数在存储器内,指令中寄存器内容与指令指定的位移量(DISP)之和作为操作数所在单元的有效地址。

(BX)

offset8

(SI)

(DI)(BP)offset16有效地址=

段寄存器为DS段寄存器为SS+物理地址=(DS)*16+(BX)+offset8

(SI)、(DI)、offset16类同。物理地址=(SS)*16+(BP)+offset16例:

如果(DS)=3000H,(SI)=2000H,COUNT=3000H,则执行指令MOVAX,CONUT[SI],求出此种寻址方式对应的有效地址和物理地址。有效地址=2000H+3000H=5000H物理地址=(DS)*16+5000H=30000H+5000H=35000H上述指令也可表示为:MOVAX,[CONUT+SI]4、基址变址寻址方式:操作数在存储器中,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)内容之和作为操作数所在存储单元的有效地址。

(BX)(SI)(BP)(DI)有效地址=+物理地址=(DS)*16+(BX)+(SI)或(DI)物理地址=(SS)*16+(BP)+(SI)或(DI)例:MOVAX,[BX+DI]或MOVAX,[BX][DI]

功能:将DS:(BX)+(DI)字存储单元内容送AX。例:MOVAX,[BP+SI]或MOVAX,[BP][SI]功能:将SS:(BP)+(SI)字存储单元内容送AX。

例:如果(DS)=2100H,(BX)=0158H,(DI)=10A5H,则执行指令MOVAL,[BX][DI]解:有效地址:EA=(BX)+(DI)=0158H+10A5H=11FDH

物理地址:(DS)*16+有效地址=21000H+11FDH=221FDH执行结果:将221FDH单元内容送入寄存器AL中MOVAL,[BX+DI]等价5、相对基址变址寻址方式操作数在存储器内,指令将基址寄存器(BX或BP)与变址寄存器(SI或DI)的内容之和再加上位移量(8位或16位),得到操作数所在单元的有效地址。(BX)(SI)offset8

(BP)(DI)offset16物理地址=(DS)*16+(BX)+(SI/DI)+偏移量物理地址=(SS)*16+(BP)+(SI/DI)+偏移量有效地址=++例:已知:(DS)=3000H,(BX)=2000H,(SI)=1000H,MK=0250H

指令:MOVAX,MK[BX][SI]

或MOVAX,MK[BX+SI]

或MOVAX,[MK+BX+SI]

解:有效地址:MK+(BX)+(SI)=0250H+2000H+0100H=3250H物理地址:(DS)*16+有效地址=30000H+3250H=33250H执行结果:将33250H单元内容送AL,33251H内容送AH。

6、段超越当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。

段超越前缀形式为:

段寄存器名:MEM说明:MEM可是具体的数、寄存器以及他们的组合形式,例如:MOVAX,ES:[BP];段地址在ESMOVAX,CS:[BX][SI];段地址在CS段地址的基本约定和允许超越的情况如表所示:存储器存取方式约定段允许超越段偏移地址取指令堆栈操作源串目的串BP作基址通用数据读写CSSSDSESSSDS无无CS,ES,SS无CS,DS,ESCS,ES,SSIPSPSIDI有效地址EA有效地址EA7、对内存寻址方式的注解(1)在汇编后,指令中的变量名由具体的偏移地址所取代。

(2)在寄存器相对寻址与相对基址变址方式中,位移量disp可以是符号常量或变量,汇编后为一个常数,若是变量,则取其偏移地址。(3)在Microsoft宏汇编MASM(MicrosoftMacroAssembler)中,内存操作数可以采用多种书写形式:6[BX][SI]、[BX+6][SI]、[BX+SI+6],他们是等价的

(4)在[]中只能出现立即数和BX、BP、SI、DI,且BX和BP、SI和DI不能成对出现在[]中。如:[BX+BP]、[SI+DI]是非法的指令形式(5)计算出的有效地址以16位表示,若超过0FFFFH,CPU将忽略所有溢出。(6)记忆8086内存操作数形式的简易方法如下:

[BX][SI]disp[BP][DI]四、端口寻址方式操作数在端口寄存器中,指令中给出了端口的地址。根据端口地址的不同,有两种寻址方式:1、端口直接寻址:用8位的立即数端口地址范围:00H~FFH

如:INAL,80H;//输入8位数据

INAX,80H;//输入16位数据

OUT81H,AL//输出8位数据2、端口间接寻址,用16位的寄存器DX指定端口为地址范围:0000H~FFFFH

如:MOVDX,218HINAL,DX源操作数的寻址方式例源操作数的允许形式

直接操作数(立即数)MOVAX,20H指令中的直接常数间接操作数

寄存器操作数MOVAX,BX通用寄存器或段寄存器存储器操作数直接寻址MOVAX,DS:[20]MOVAX,B(字)“段:[常数]”或“段:常数”“[变量]”或“变量”间接寻址寄存器间接寻址MOVAX,[BX][BX,BP,SI,DI之一]寄存器相对寻址MOVAX,[BX+20]MOVAX,[BX+B(字)][BX,BP,SI,DI之一+位移量]基址变址寻址MOVAX,[BX+SI][BX,BP之一+SI,DI之一]相对基址变址寻址MOVAX,[BX+SI+20]MOVAX,[BX+SI+B][BX,BP之一+SI,DI之一+位移量]端口操作数

直接寻址INAL,20H指令中有端口号(0~0FFH)

间接寻址INAL,DXDX中有端口号(0~0FFFFH)操作数的寻址方式例:已知:DS=1000H,BX=0200H,SI=02H,内存10200H~10205H单元的内容分别是10H,2AH,3CH,46H,59H,6BH。下列指令执行完成后,AX寄存器里面的内容各是什么?MOVAX,0200HMOVAX,[200H]MOVAX,BXMOVAX,[BX]MOVAX,3[BX]MOVAX,[BX+SI]MOVAX,2[BX+SI]第二部分8080指令系统§2.28086/8088的指令系统8086/8088的指令系统可以分为6组:(1)数据传送指令(2)算术运算指令(3)逻辑指令与移位指令(4)串操作指令(5)控制转移指令(6)处理机控制指令

一、数据传送指令数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储单元中

。这类指令又可分为以下几种情况:通用传送指令:MOV、PUSH/POP、XCHG、XLAT输入输出指令:IN、OUT地址目标传送指令:LEA、LDS、LES标志传送指令:LAHF、SAHF、PUSHF、POPF1、通用传送指令(1)MOV(Move):传送指令指令格式:

MOVdest,src;dest←src功能:将源操作数src复制到目的操作数dest中,源操作数src的内容不变。对标志位的影响:无语法格式:

MOVreg/mem/seg,reg/mem/seg/imm MOV指令的操作数及传送方向见下页立即数IMM存储器MEM通用寄存器REGDS、ES、SSCS(SEG)说明:①双操作数指令不允许两个操作数同时为段寄存器或存储器操作数

MOVseg,seg;错误

MOVmem,mem;错误

②立即数不能传送到段寄存器中

MOVseg,imm ;错误

③立即数不能作为目的操作数

MOVimm ,

reg;错误④目的操作数不允许使用CS、IP寄存器

MOVCS,AX;错误⑤dest与src必须类型匹配,即同时是字节或字类型。

MOVAX,BX寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。立即数没有明确的类型,MASM(宏汇编语言)负责将立即数扩展为与目的操作数位数相同。

MOVAL,34HMOVBX,56H有时MASM不能确定内存操作数的类型,需要用byteptr和wordptr明确指出是字节或字类型。只要其中一个操作数的类型确定即可。

MOV[2000H],ALMOV[2000H],BYTEPTR34H例:错误的MOV指令如下所示:MOVAX,BL;类型不匹配MOVDS,1000H;不允许立即数送段寄存器MOV[BX],[SI];不允许内存操作数之间传送MOVES,CS;不允许段寄存器之间传送MOVCS,AX;CS不能作为目的操作数(2)XCHG(Exchange):交换指令指令格式:XCHG目的,源;功能:交换源操作数与目的操作数相交换注意:

允许Reg←→Reg,Reg←→Mem(段寄存器除外)不允许Mem←→Mem例:设AX=2000H,DS=3000H,BX=1800H,(31A00H)=1995H,执行下面指令的结果是?

XCHGAX,[BX+200H]解:源操作数物理地址为:DS×16+BX+200H=31A00H

那么执行执行之后:AX=1995H, 而(31A00H)=2000H(3)PUSH:入堆操作指令格式:PUSHREG/MEM/SEG功能:将源操作数推入堆栈执行过程:先移后入(SP)←(SP)-2,((SS)+(BP))←(SRC)

(4)POP:出栈操作

POPREG/MEM/SEG先出后移。但CS不能作为目的操作数。2、输入输出指令

输入输出指令是用来实现I/O端口与AX之间的数据传送。根据端口地址的不同,又分为端口直接寻址和端口间接寻址两种。(1)IN(INPUT)格式:INAL,(PORT);8位地址、8位数据

INAX,(PORT);8位地址、16位数据或:INAL,DX;//端口地址放在DX寄存器中

INAX,DX;(2)OUT(OUTPUT)格式:OUTDX,AL;其余类同。3、地址目标传送指令:专用于传送地址码。(1)LEA:取有效地址格式:LEAREG,MEM功能:取源操作数地址的偏移量,并把它传送到目的操作数所在的单元。要求:源操作数必须是一个存储器操作数,目标操作数必须是一个除段寄存器以外的16位寄存器,通常是变址寄存器SI等。LEA指令与MOV指令的区别:MOV一般传送的是源操作中的内容而不是地址。BUFF=0123454800FEFFLEASI,BUFF;执行后:(SI)=0002HMOVSI,BUFF;执行后:(SI)=0048H段起始地址012013201432015432014800FEFF543201(2)

LDS:将双字指针送到寄存器和DS指令(LoadPointerusingDS)格式:LDSreg16,mem32

功能:从源操作数指定的存储单元中,取出一个变量的4个字节地址指针,前两个字节(表示变量偏移量)送入指定寄存器,后两个字节(表示变量段地址)送DS寄存器。(3)LES:将双字指针送到寄存器和ES指令(LoadPointerusingES)格式:LESreg16,mem32

;功能:功能与LDS类似,只不过后两个字节送ES寄存器。4.标志传送(位操作)指令

LAHFSAHFPUSHFPOPF隐含操作数AH隐含操作数FLAGS(1)LAHF(LoadAHFromFlags)功能:将FLAGS的低8位装入AH格式:LAHFSFPFAFZFCF….AHFLAGSD15D0D7D0(2)SAHF(StoreAHintoFlags)功能:执行与LAHF相反的操作,把AH的内容存入标志寄存器。指令格式:SAHFD0SFPFAFZFCF….AHFLAGSD15D7D0(3)PUSHF(PUSHFlagsontoStack)功能:将标志寄存器的内容进栈,同时修改SP:SP←Sp-2。指令格式:PUSHF(4)POPF功能:把当前SP所指的字送到标志寄存器PSW,并修改SP的值:SP←Sp+2

。指令格式:POPF标志传送指令说明:LAHF/SAHF指令是寄存器AH与标志寄存器PSW的低字节之间完成的字节型数据传送。

PUSHF/POPF指令是标志寄存器PSW与堆栈间进行的字型数据传送。指令SAHF/POPF将影响标志位。所有的数据传送类指令仅此两条指令影响标志位。成对的使用PUSHF和POPF,可以对标志位寄存器进行保存和恢复,常常用在过程调用和终端服务程序的开头与结尾处。二、算术运算指令运算的数据类型:有符号二进制数、无符号二进制数、无符号压缩BCD码、无符号非压缩BCD码。除CBW、CWD外,所有指令均影响标志位。指令类型:加法:ADD、ADC、INC减法:SUB、SBB、DEC、NEG、CMP乘法:MUL、IMUL除法:DIV、IDIV符号扩展:CBW、CWD十进制调整:DAA、DAS、AAA、AAS、AAM、AAD1、加法指令加法:ADDDST,SRC; (DST)←(SRC)+(DST)带进位加法:ADCDST,SRC;

(DST)←(SRC)+(DST)+CF加1:INCDST;(DST)←(DST)+1说明:①这在三条指令运算结果将影响状态标志位,但是INC指令不影响标志CF(Carryflag进位标志)。②SRC可为IMM、MEM、REG,而DST只能为REG、MEM类型。③加法指令也有数据传送的功能,所以前面数据传送指令的限制同样有效。如不能同时为存储器操作数④对INC指令,DST既是源操作数,又是目的操作数,因此DST只能是REG或MEM,为MEM操作数时,必须指明数据类型,否则出错。

如:INC[SI];错误应为:INCWORDPTR[SI];字内容加1INCBYTEPTR[SI];字节内容加1

例:ADDAL,18H;//AL←AL+18HADCBL,AL;//AL←AL+BL+CFADCAX,DX;//AX←AX+DX+CFADDAL,CONST[BX];//AL←MEM(DS:CONST[BS])+ALADDCONST[BX],AL;//MEM(DS:CONST[BS])←MEM(DS:CONST[BS])+AL2、减法指令指令格式:减法SUBDST,SRC;(DST)←(DST)-(SRC)带借位减法SBBDST,SRC;(DST)←(DST)-(SRC)-CF减1DECOPR;(OPR)←(OPR)-1取负NEGOPR;(OPR)←

0H-(OPR)比较CMPOPR1,OPR2;(OPR1)-(OPR2),结果反映到标志位上(ZF)

以上五条指令均可作字或字节运算,而且除DEC不影响CF外,其他都按一般规则影响状态标志位。说明:减法指令的语法规范同加法指令一致比较指令除了不回送结果外,其他一切均同SUB指令,该指令主要用来判断两数的大小与是否相等。比较指令后面常常是条件转移指令,根据比较的结果实现程序的转移。SBB指令常用在多字节的减法运算。

例:AX=98H,BX=0AH,DX=2000H,下面执行执行的结果是什么?SUBAX,BXSUBDX,1850H解:AX=98H-0AH=8EHDX=2000H-1850H=07B0H3、乘法指令指令格式:无符号数乘法MULSRC

;(AX)←(AL)*(SRC)字节乘法(DX,AX)←(AX)*(SRC)字乘法带符号数乘法IMULSRC;操作同上进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中;进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。源操作数不允许使用立即数。对于存储器数,必须在前面加B或者W指出是字节和是字。乘法指令运算结果只影响状态标志CF、OF例:编程求Y=5*X,假定X为字节数。

MOVAL,XMOVBL,5MULBL思考:MovAL,X MUL5这样可行吗?解:不可行,因为MUL指令中,要求源操作数必须是寄存器或者是存储器操作数。

4、除法指令指令格式:无符号数除法DIVSRC;如果SRC为字节(AL)←(AX)/(SRC)除法的商(AH)←(AX)/(SRC)除法余数如果SRC为字(AX)←(DX,AX)/(SRC)除法的商(DX)←(DX,AX)/(SRC)除法余数带符号数除法IDIVSRC;操作同上。除法运算的说明当除数是字节数据时,被除数必须放在AX中;当除数是字数据时,被除数必须放在DX,AX中。如果被除数是8位,必须放在AL中,并且AH清零除法指令运算结果对状态标志无定义。8086/8088规定IDIV指令运算结果余数的符号与被除数相同。例:求7A86H÷04H=?MOVAX,7A86HMOVBL,04HDIVBL

关于符号扩展指令:字节扩展到字CBW;将寄存器AL中的符号位扩展到寄存器AH字扩展到双字CWD;将寄存器AX中的符号位扩展到寄存器DX指令功能:

①如果(AL)<80H,则(AH)=00H(正数)否则(AH)=0FFH(负数)②如果(AX)<8000H,则DX=0000H(正数)否则(DX)=0FFFFH(负数)70AL70AH015AXDX150CBWCWD例:求-4001H÷4=?MOVAX,-4001HCWDMOVCX,4IDIVCX说明:此题不能用16位除8位的方式,因为其商超过了256。

5、非压缩BCD码十进制调整指令指令格式:加法十进制调整AAA;减法十进制调整AAS;乘法十进制调整AAM;除法十进制调整AAD;AAA指令将AL的内容变换成一位非压缩的十进制数。AAA检查AL低四位,如低四位是0--9的数字,AAA就清除AL的高四位,以及AF和CF标志;如AL低四位表示的数大于9或AF=1,AAA执行:加6到AL寄存器;加1到AH寄存器;置AF=1,CF=1;清除AL高四位为0例:求BCD7+BCD8=?MOVAL,07H;AL=00000111MOVBL,08H;BL=00001000ADDAL,BL;AL=00001111(低四位超过了9,因此要调整)AAA;结果AL=05H,AH=01H,CF=AF=1。其他调整指令不作介绍调整过程AL=00001111判断:1111>1001加6:AL=AL+6=00010101清AL高四位:AL^00001111=0000101AF置1,CF置1,并且使得AH=1最后的结果为15H,即为000101016、压缩BCD码十进制调整指令6.1加法十进制调整DAA;执行的操作:这条指令执行前必须先执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存放在AL寄存器中,才能进行调整。功能:把两个压缩BCD数相加后的结果调整为正确的BCD码6.2减法十进制调整DAS;执行的操作:这条指令执行之前,必须先执行SUB或SBB指令,减法指令必须把两个BCD码相减,并把结果存放在AL寄存器中。调整的方法:累加器AL低4位大于9或辅助进位标志位AF=1,则累加器AL加06H修正。累加器AL高4位大于9或辅助进位标志位AF=1,则累加器AL加60H修正。累加器AL高4位大于等于9,低4位大于9,则累加器AL进行加66H修正。例:进行BCD码加法运算59+68=1270101100159+011010006811000001C1+0110011066

100100111127加法运算结果为C1,AF=1,高位大于9加66H进行压缩BCD调整说明:压缩BCD码加法或减法十进制调整指令必须在ADD(ADC)或SUB(SBB)指令之后,调整结果对标志OF无影响,对其它状态标志位均有影响。减法十进制调整方法与加法十进制调整方法类同,只是将加6变为减6操作。上述加法及调整的指令如下:

MOVAL,59HADDAL,68HDAA练习:求83-38=?(用BCD码实现)三、逻辑运算与移位指令1、逻辑运算指令:对字节或字数据进行按位的操作。格式:逻辑与ANDDST,SRC;

(DST)←(DST)AND(SRC)逻辑或ORDST,SRC;

(DST)←(DST)OR(SRC)逻辑非NOTOPR;

(OPR)←(OPR)异或XORDST,SRC;

(DST)←(DST)XOR(SRC)测试TESTOPR1,OPR2;(OPR1)AND(OPR2)AND、OR、XOR、TEST都是按位进行运算的NOT也是按位取反,但是不影响标志位。AND指令主要用于使操作数的某些位保留(和1相与)、某些位清0(和0相与)。 例:ANDAL,0FH;屏蔽高4位,保留低4位。OR用法:

a用于使操作数的某些位保留(和0相或),使某些位置1(和1相或)。

b用于分离符号标志,进行判断、转移。影响ZF、SF和PF,CF=OF=0。例:ORBX,0C000H(1100000000000000)将BX的两位最高的有效位(15和14位)置成1,而其它位不变。XOR用法:用于使操作数的某些位保留(与0异或),某些位取反(和1异或)。例:将AL的高4位保留,低4位取反:

XORAL,0FH(00001111)例:将AX中的内容清0:

XORAX,AX(bxorb=0)NOT指令改变寄存器或存储单元的每一位状态,原来为0变为1,原为1变为0。例:MOVAX,45H;NOTAX;AX=0BAHTEST指令是一条测试指令,它执行的操作与AND相同,不过它不送回结果,只影响标志位。例:TESTAL,00000001B;如AL最低位为0,则ZF=1。例:测试AL的0、3、5位,若有一位为1,则转出错处理。

TESTAL,00101001BJNZERROR;ZF=0,转出错ERROR。2、移位指令逻辑左移SHLOPR,CNL算术左移SALOPR,CNL逻辑右移SHROPR,CNL算术右移SAROPR,CNL其中:OPR为操作数,CNL为1或CL表示移位次数0CFOPR0CFOPRCFOPR例:设AL=10110100,CF=1在SHLAL,1之后,AL=01101000CF=1在SALAL,1之后,AL=01101000CF=1在SHRAL,1之后,AL=01011010CF=0在SARAL,1之后,AL=11011010CF=0

算术左移(SAL)和算术右移(SAR)实现带符号数移位。SAR通过在整个移位过程中复制符号来保护操作数的符号。SAL不保护进位,但如果符号位发生变化的话,就将1送OF标志。在多次移位的情况下,OF的值不确定。逻辑左移(SHL)和逻辑右移(SHR)对无符号数的移位。SHL将操作数左移,空出来的第0位置0;SHR将操作数右移,空出来的高位(字节时第7位,字时第15位)置0。例:用左移的方法实现Y=5*XMOVAL,XMOVCL,2SHLAL,CL;AL=4XADDAL,X例:用右移方法作除法-128/8=-16MOVAL,-128MOVCL,03HSARAL,CL执行后,AL=0F0H=-163、循环移位指令循环左移ROLOPR,CNT循环右移ROROPR,CNT带进位循环左移RCLOPR,CNT带进位循环右移RCROPR,CNTOPR操作数,CNT移动的位数CFOPRCFOPRCFOPRCFOPR例:设AL=10110100B,CF=1执行下列语句:执行ROLAL,1后,AL=01101001,CF=1执行RORAL,1后,AL=01011010,CF=0执行RCLAL,1后,AL=01101001,CF=1执行RCRAL,1后,AL=11011010,CF=0课堂练习:将AL寄存器的高4位与低4位交换解:可采用循环左移4位或者循环右移4位ROLAL,04HRORAL,04H思考:可不可以用带进位的循环移位?四、串操作指令串操作:对存储区中连续存放的字节或一串字进行操作。串操作指令的对象是内存中地址连续的字节或字串,在每次操作执行后,能自动修改地址,为下次操作作准备。如用重复前缀,则可一直执行直到预定的次数。串操作指令共有5条:MOVS:字符串的传送Mov目的串,源串LODS:数据串装入LODS源串STOS:数据串的存储STOS目的串CMPS:字符串的比较COPS目的串,源串SCAS:字符串的扫描SCAS目的串不做详细介绍(1)特点:①源操作数由SI间址,在当前数据段DS中;目的操作数由DI间址,在附加数据段ES中,且不允许段超越。②每次操作后,SI、DI的内容自动修改。方向标志位DF=0:SI、DI自动加1(或2);DF=1:SI、DI自动减1(或2)。③要处理的串长度存放在CX寄存器中,有的操作可使用重复前缀。而有的操作则不能使用(如LODS)。(2)重复的方式:

REP无条件重复

REPE/REPZ 相等/结果为0则重复

REPNE/REPNZ不相等/结果不为0则重复与REP前缀相配合工作的指令MOVS、LODS和STOS指令,直到(CX)=0为止。执行过程:①如(CX)=0则退出REP,否则继续执行;②(CX)←(CX)-1;③执行其后的串指令;④重复①~③。1、MOVS(串传送)指令格式:[REP]MOVSB/MOVSW指令功能:DS:[SI]→ES:[DI]例;将数据段首地址为BUF1的200个字节传送到附加段首址为BUF2的内存区中,使用如下指令:

MOVAX,SEGBUF1MOVDS,AXMOVBX,SEGBUF2MOVES,BXLEASI,BUF1LEADI,BUF2MOVCX,200CLDLOP:MOVSBREPMOVSBLOOPLOPHLT若不用串操作指令,可用一般指令编制如下:

LEASI,BUF1LEADI,BUF2MOVCX,200LOP:MOVAL,[SI]MOV[DI],ALINCSIINCDIDECCXJNZLOPHLT由此可看出,串操作指令是程序设计的高级技术。2、LODS(串装入)指令格式:LODSB/LODSW指令功能:将DS:[SI]所指单元的内容装入AL或AX中。一般不用REP。无意义。3、STOS(串送存)指令格式:[REP]STOSB/STOSW指令功能:将AL或AX中的内容送入ES:[DI]所指单元中。如用REP,则表示每个单元的内容完全相同。例:将内存中以BUF为首址的100个字节单元的内容清0MOVAX,SEGBUFMOVES,AXLEADI,BUFXORAX,AXMOV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论