第3章指令系统_第1页
第3章指令系统_第2页
第3章指令系统_第3页
第3章指令系统_第4页
第3章指令系统_第5页
已阅读5页,还剩126页未读 继续免费阅读

下载本文档

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

文档简介

第三章指令系统1第三章指令系统1、指令的概念和结构2、8086/8088的寻址方式3、8086/8088的指令系统21、指令的概念和结构数字计算机是按照程序规定的流程工作的,而程序由CPU的指令序列组成。不同类型的CPU,指令系统不同,程序的格式也不同。但计算机的指令、指令系统、程序等基本概念是完全相同的,它们的工作方式和过程也是类似的。指令:一特定的二进制编码,与时序发生器配合,控制计算机完成某种操作的命令。指令系统:一组唯一的二进制编码的集合,处理器所能识别的所有指令的集合。31、指令的概念和结构Ex:实验中第一条指令:MOVAX,0040它完成的功能是将16位立即数0040(H),送到寄存器AX中。换算成16进制,其指令码为:B84000(H)

101110000100000000000000(B)这种二进制代码表示既不易理解,也不易记忆。但却是微处理器唯一能执行的代码。用指令助记符,上述指令可写成:这种用助记符表示的指令叫汇编语言指令或符号指令。41、指令的概念和结构8086指令格式51、指令的概念和结构8086指令格式61、指令的概念和结构

标号:指令助记符(操作码)操作数;注释

,★指令助记符是指令名称的代表符号,它是指令语句中的关键字,不可缺省,它表示本指令的操作类型,必要时可在指令助记符的前面加上一个或多个“前缀”,从而实现某些附加操作。★标号是给该指令所在地址取的名字,必须后跟冒号“:”,它可以缺省,是可供选择的标识符。8086/8088汇编语言中可使用的标识符必须遵循一定的规则。★操作数是参加本指令运算的数据,有些指令不需要操作数,可以缺省;有些指令需要两个操作数,这时必须用逗号(,)将两个操作数分开;有些操作数可以用表达式来表示。★注释部分是可选项,允许缺省,如果带注释则必须用分号(;)开头,注释本身只用来对指令功能加以说明,给阅读程序带来方便,汇编程序不对它做任何处理。71、指令的概念和结构操作码与操作数指令:做什么?如何做?绝大部分的指令都由操作码和操作数两部分组成操作码(也称为指令码)说明要执行的操作,如数据传送,加法、减法、乘法、除法等等。操作数则指明数据的来源,和结果的去向。操作数也称为地址码

。也可以说,指令由指令码(命令码)和地址码组成。如指令:

MOVAX,0A6D1H;立即数

MOVAX,[0A6D1H];存储器地址

MOV[0A6D1H],AX

MOV0A6D1H,AX81、指令的概念和结构指令举例单字节指令:NOP:无操作(空操作)90HPUSHAX将AX寄存器内容压入堆栈

50HPUSHDS将段寄存器DS内容压入堆栈

1EH91、指令的概念和结构复杂指令集与精简指令集处理器指令中地址码个数越多,指令的功能越强;地址码的组合变化方式越丰富,指令系统的功能越强。指令组合变化方式多,每一条指令所完成的工作越多,程序代码越短。指令条数和指令的组合变化,均要靠不同的电路组合(微操作电路)的支持,因此导致电路设计越复杂,对指令的学习、记忆要求高。

8086/8088指令中只能包含一个存储器地址。精简指令集(RISC)CPU,使用精心挑选的指令,简化CPU设计,提高指令执行速度。相对于精简指令集(RISC)CPU,8086为复杂指令集(CISC)CPU,101、指令的概念和结构复杂指令集与精简指令集8086/8088CPU称为复杂指令集(CISC)CPU,它的指令变化方法较多,导致指令数量多。8086/8088CPU指令系统采用可变字长的指令格式,最短的指令仅一个字节,最长的指令有六个字节。11122、8086/8088的寻址方式操作码与操作数程序(指令)存放在程序区,由CPU按条读入并顺序执行。指令由操作码和操作数(地址码)组成。操作数就是参与运算或待加工处理的数据(保存的地方-地址)。操作数可存放在下面三个地方的某一处:寄存器,存储器(包括堆栈),程序区(代码区)。立即操作数:指令的组成部分,存放在程序区。寄存器操作数:存放在CPU内部的某个寄存器中。存储器操作数:存放在存储器的某个单元中。

132、8086/8088的寻址方式寻址方式确定操作数存放位置的算法1、指令的操作数就是参加运算的数据,立即数寻址方式。2、指令的操作数代表一个地址,称为直接寻址方式。3、指令的操作数为寄存器中的数,称为寄存器寻址方式。4、若指令中操作数是寄存器,而其中的内容才是真正的数据存储单元的地址,称为间接寻址方式。5、若操作数要经过计算,在某个基本地址上加上一个偏移量,称为变址寻址方式。(基址+变址)有少数指令只有操作码,没有操作数,如WAIT、NOP等指令

142、8086/8088的寻址方式复习:8086/8088的存储器组织8088/8086微处理器内部寄存器和内部总线均为16位二进制,地址总线为20位。采用段地址加段内偏移地址,组成20位地址,因此可以直接访问1M存储器空间。输入输出指令只用低16位地址线,可以直接访问64K外部接口空间。8086/8088程序可分成四个独立的部分(段):代码段、数据段、堆栈段、扩展(数据)段。每一段仍为64K。152、8086/8088的寻址方式复习:8086/8088的存储器组织8086/8088有四个段寄存器:CS、DS、SS和ES。CS称为代码段寄存器,它是程序存储区的基地址(起始地址)。其中的内容一般不可改变。DS称为数据段寄存器,它是保留程序运行时所需要的数据和结果的存储区的基地址。SS称为堆栈段寄存器,特殊存储器段。ES称为扩展(数据)段寄存器,它同样是保留程序运行时所需要的数据和结果的存储区的基地址(与DS类似)。162、8086/8088的寻址方式寻址方式----立即数寻址数据直接出现在指令中,存储在程序段中(只能为常数)。

MOVAX,1234H指令存储的地址:CS*10H+IPEx:172、8086/8088的寻址方式寻址方式----直接寻址操作数地址的16位偏移量在指令中,实际的地址为数据段寄存器(DS)左移4位,加上指令中的这16位偏移量。形成数据的物理地址。数据在数据空间内。MOVAX,[1000H]182、8086/8088的寻址方式直接寻址与立即数寻址与立即数寻址不同的是这里1000H带括号[],它表示1000H是一个地址(直接寻址)。立即数寻址没有括号,1000H为常数(立即数)。存储在紧随指令码的存储器单元内。数据存储空间不同。假定段寄存器DS=2000H,则操作数地址为[DS]×10H+1000H=21000H,实际占用系统物理地址为21000H和2100lH两个字节的存储单元。直接寻址是以数据段寄存器DS的地址为基址,指令中操作数的寻址范围为64K字节。192、8086/8088的寻址方式寻址方式----寄存器寻址操作数存放在CPU内部的寄存器中。例

MOVCX,AXMOVAH,AL速度快,代码短202、8086/8088的寻址方式寻址方式----寄存器间接寻址以寄存器中的数为存储单元地址,称为寄存器间接寻址。指令中操作数地址的16位偏移量可以存放在四个寄存器(SI,DI,BP,BX)之中的某一个。若以SI,DI寻址,这种寻址方式称变址寻址(IndexAddressing)。若以BX,BP寻址时,称基址寻址(BasedAddressing)。其中SI、DI、BX寻址时,以DS作为段基地址,BP以SS作为段基地址。212、8086/8088的寻址方式寻址方式----寄存器间接寻址MOVAX,[SI]DS=2100H,SI=1200HMOVAX,[BP]SS=1200H,BP=2100Ex:222、8086/8088的寻址方式寻址方式----寄存器间接寻址

段超越根据需要,也可以指定其它的段寄存器,作为操作数的基地址。这种指令称段超越指令,即SI,DI,BX的内容也可以与其它段寄存器的内容相加,形成操作数的地址。例如:

MOVES:[DI],AXMOVDX,DS:[BP]232、8086/8088的寻址方式寻址方式----寄存器寻址

段超越242、8086/8088的寻址方式寻址方式----寄存器相对寻址(变址寻址)数据地址由寄存器加上固定的偏移量确定。固定偏移量在程序中指定(常数)。MOVAX,1000H[SI]MOVAX,[SI+1000H]252、8086/8088的寻址方式寻址方式----基址加变址寻址数据地址由两个寄存器的内容在加常数偏移量给出。假定[DS]=1200H[SI]=1400HMOVAX,[BX+SI+l030H]Ex:262、8086/8088的寻址方式寻址方式总结8088/8086中存储器采用分段管理。每一段长度为64K。程序永远以CS为段基地址。操作数,可以存储在以DS、ES或SS为段基地址的存储器单元中,也可能在以CS为段基地址的存储器单元中(与指令码在一起)。以哪个寄存器进行间址、变址与基址加变址寻址,在8068/8088中有一个基本约定,操作数在相应的段区域中。无论何种寻址方式,操作数只能在某一个段的64K字节范围内。只要在指令中不特别说明要超越这个约定,则缺省情况就按这个基本约定寻找操作数,这就是所谓的缺省(default)状态。为了编程灵活,8068/8088允许改变段寄存器,称为段超越。表3.4是8088/8086中的基本约定和允许段超越的说明。

272、8086/8088的寻址方式寻址方式总结282、8086/8088的寻址方式Ex:movax,34hmov34h,axmovax,[34h]movax,[cx]movax,[si+1234h]movax,blmov[di+1234h],axmovax,1234h[si]mov1234h[di],axmovax,23h[si][bx]movax,es:23h[si][bx]movax,es:[bx+si+23h]293、8086/8088的指令系统8086/88微处理器指令分类数据传送类指令(只进行传送而不改变数值)数据处理类指令:算术、逻辑字符串操作指令程序控制类指令:转移,调用,返回,循环

其他指令:

CPU控制指令:暂停、等待、空操作中断控制指令:开中断,关中断,中断返回303、8086/8088的指令系统数据传送类指令传送类指令可分为:

通用数据传送指令:MOV

交换指令:XCHG;

堆栈操作指令:PUSH,POP

地址传送指令:LEA,LDS,LES

累加器专用传送指令:IN,OUT,XLAT

标志寄存器传送指令:LAHF,SAHF,PUSHF,POPF313、8086/8088的指令系统数据传送类----通用数据传送指令MOV指令格式:MOVDST,SRC指令功能:DST←

(SRC)DST:目的操作数SRC:源操作数立即数向通用寄存器传送

MOVCL,055H;立即数055H传送到8位寄存器CL中

MOVAX,1234H;立即数1234H传送到寄存器AX中MOV指令不影响标志寄存器状态。Ex:323、8086/8088的指令系统数据传送类----通用数据传送指令MOVEx:立即数向内存单元传送:MOV[BX],1234H立即数1234H传送到段寄存器DS指明的,以BX内容为偏移量的存储器单元中(寄存器间接寻址)。若DS寄存器中的内容是1000H,BX=0016H,则指令执行完之后存储单元10016H的内容是34H,10017H单元的内容为12H。

MOV1234H,[BX]333、8086/8088的指令系统通用寄存器之间传送:MOVSI,BP;结果[SI]=[BP](SI中的值与BP中的值相同)(寄存器寻址)。MOVCX,AX;结果[CX]=[AX]通用寄存器与段寄存器之间传送:

MOVDS,BX;结果[DS]=[BX]MOVDX,ES;结果[DX]=[ES]与段寄存器之间只能进行字传送,并且程序中不能直接对代码段寄存器CS赋值。数据传送类----通用数据传送指令MOV343、8086/8088的指令系统段寄存器与内存单元之间的传送:MOVDS,[SI+BX]以SI和BX中内容之和为偏移量,DS为段地址,将该字地址中的数据,传送到数据段寄存器DS。基址加变址寻址。只能进行字传送。内存单元与通用寄存器之间的传送:

MOVAX,[2000H]以[DS]为段地址,2000H为段内偏移地址的内存单元中数据送AX寄存器。数据传送类----通用数据传送指令MOV353、8086/8088的指令系统36数据传送类----通用数据传送指令MOV小结使用MOV指令应注意以下几点:立即数只能作为源操作数,不能作为目的操作数。CS只能作为源操作数,不能作为目的操作数。CPU中的寄存器除IP外都可通过MOV指令访问。立即数不能直接传送到段寄存器,但可通过其它寄存器或堆栈传送。例:MOVDS,1000H;错而:MOVAX,1000HPUSH1000HMOVDS,AX;正确POPDSMOVES,AX;正确段寄存器之间不能直接传送。3、8086/8088的指令系统37数据传送类----通用数据传送指令MOV小结两个内存单元之间不能直接传送。这是因为8086的任何一条指令最多只能有一个内存操作数。

MOV[1000H],[2000H];错

MOVAX,BL;错,数据类型不匹配

MOVAX,[1000H];正确

MOVAL,[1000H];正确

MOVAL,100H;?3、8086/8088的指令系统38数据传送类----XCHG指令指令格式:XCHGOPR1,OPR2指令功能:OPR1←→OPR2本指令将两个指定的寄存器或寄存器与存储单元的内容相互进行交换。可进行8位或16位交换。但段寄存器的内容不能交换。XCHGBX,[BP十SI];[SS]*10H+[BP]+[SI]←→[BX]XCHGCX,SI;[SI]←→[CX]XCHGAX,DS:[70H];[AX]←→DS为段地址,偏移量70H单元的内容XCHGAX,ES:[70H]该指令不影响标志寄存器3、8086/8088的指令系统39数据传送类----栈操作指令PUSH和POP

堆栈是在内存中按照后进先出原则组织的一个专门区域。它有一个指针SP。有了存储区域与堆栈指针就可以组成堆栈。8088/8086中规定SP始终指向堆栈的顶部。SP的初值,通常在程序开始时,由传送指令

MOVSP,data来设定。在程序执行过程中一般不再改变。指令格式:PUSH源操作数/POP目的操作数指令功能:完成对寄存器的值的保存和恢复操作过程3、8086/8088的指令系统40数据传送类----栈操作指令PUSH和POPEx:指令PUSHAX若执行前:执行后:

AX=1256HSP=0FFEHSS=2F00HSS=2F00HSP=1000HAX=1256HPUSHAXNOPNOP操作时序:3、8086/8088的指令系统41数据传送类----栈操作指令PUSH和POPPOPDST

弹出指令的操作数也是16位,执行过程与压入过程正好反,弹出数据也分两步执行:先弹出栈顶数据,再修改堆栈指针,SP+2→SP。PUSHAXPOPBX

把AX数据经过堆栈操作送到了BX寄存器中,经过一次压入,一次弹出,SP指针不变。

3、8086/8088的指令系统42数据传送类----地址传送指令(三种)1、传送有效地址指令LEA(LoadEffectiveAdress);2、有效地址送寄存器,段地址送DS指令

LDS(LoadDSwithPointer);3、有效地址送寄存器,段地址送ES指令

LES(LoadESwithPointer)

三条指令均不影响标志寄存器。

3、8086/8088的指令系统43数据传送类----地址传送指令LEA

执行前BX=1800HSI=20EH,LEABX,[BX+SI+10H]

执行指令后

BX=1800H+20EH+10H=1A1EH。它是将BX、SI和指定的偏移量之和的值传送到目的寄存器中,而不是将它们所对应的存储单元的内容传送到目的寄存器。

对比movbx,[bx+si+10h],若没有LEA指令,如何完成相同的工作?3、8086/8088的指令系统44数据传送类----地址传送指令LDS执行前DS=B000H,

LDSSI,[20H]则存放操作数地址的单元为B0020H、B0022H。假定(B0020H)=0180H,(B0022H)=2000H,则指令执行后

SI=0180H,DS=2000H。本指令在将地址传送到目的寄存器同时,也改变了数据段寄存器DS的内容。本指令改变了数据段在内存中的区域。3、8086/8088的指令系统45数据传送类----地址传送指令LESLESDI,[BX]若执行前DS=C000H,BX=060AH,则存放地址的单元为C060AH、C060CH。假定(C060AH)=06BEH,

(C060CH)=4567H,则指令执行后DI=06BEH,ES=4567H。本指令功能与上一条相同,只是段寄存器改为扩展段寄存器ES。

3、8086/8088的指令系统46数据传送类----端口I/O指令I/O端口指令有IN和OUT两条。INDST,SRCOUTDST,SRC其中:SRC为8位或16位8位口地址可直接在指令中说明(立即数)。16位口地址用DX寄存器,DST为内部寄存器(可以是8位,也可以为16位)。该指令访问的口地址范围为0000H~FFFFH。两条指令均不影响标志寄存器指令格式:指令功能:对端口输入或输出,过程与MOV指令类似,只是地址范围不同

3、8086/8088的指令系统47数据传送类----端口I/O指令Ex1:DX=1234H,端口1234H在I/O缓冲器中的内容低字节是73H,高字节是F4HINAX,DX;结果AL=73H,AH=F4H。Ex2:INAX,28H;将端口地址为28H,29H的内容读入寄存器AX。Ex3:OUT5,AL;将AL的内容输出到端口5。

OUT100H,AL?Ex4:3、8086/8088的指令系统48数据传送类----查表换码指令XLAT 指令格式:XLAT指令功能:它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。指令说明:使用换码指令时,要求BX寄存器指向表的首地址,AL中为表中某一项与表格首地址之间的偏移量,指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中去。XLAT指令就是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。3、8086/8088的指令系统49数据传送类----查表换码指令XLAT示例

数据段中存放有一张ASCII码转换表,设首地址为2000H,现欲查出表中第11个代码的ASCII码(设DS=4000H)303132...394142...4546...42000H+042000H+11‘0’‘1’‘2’‘9’‘A’‘B’‘E’‘F’Ex:3、8086/8088的指令系统50数据传送类----查表换码指令XLAT示例

可用如下指令实现:MOVBX,2000H;(BX)←表首地址MOVAL,0BH;(AL)←序号XALT;查表转换

执行后得到:(AL)=42H3、8086/8088的指令系统51数据传送类----标志寄存器传送指令

标志寄存器传送指令共有四条。用于标志寄存器FR与AX或堆栈之间进行数据传送:LAHF;AH←(PSWL)(

FR低8位)SAHF;PSWL←AHPUSHF;16位标志寄存器压入堆栈POPF;16位数据从堆栈弹出到标志寄存器用于对标志寄存器修改与保护。标志寄存器中只有CF、DF和IF三个标志有专门的指令可修改其状态。CLI←→STICLD←→STDCLC←→STC3、8086/8088的指令系统52算术运算类指令

8086/8088有五种算术运算指令:加法指令:ADD,ADC,INC。减法指令:SUB,SBB,DEC,NEG。乘法指令:MUL,IMUL,AAM。除法指令:DIV,IDIV,AAD,CBW,CWD。

BCD码调整指令:AAA,DAA,AAS,DAS。3、8086/8088的指令系统53算术运算类指令----加法指令

1)不带进位位加法指令格式:ADDDST,SRC

指令功能:DST←

(DST)+(SRC)2)带进位位加法指令格式:ADCDST,SRC

指令功能:DST←

(DST)+(SRC)+CF3)加1

指令格式:INCOPR

指令功能:OPR←

(OPR)+1上述指令中:SRC可为寄存器、内存单元、或常数。DST,OPR可为寄存器,内存单元等。指令可影响标志位:SF,ZF,AF,PF,CF,OF。其中加1指令不影响CF,而影响其它5个标志。3、8086/8088的指令系统54算术运算类指令----减法指令

1)不带借位位减法指令格式:SUBDST,SRC

指令功能:DST←(DST)-

(SRC)2)带借位位减法指令格式:SBBDST,SRC

指令功能:DST←(DST)-

(SRC)-CF3)减1

指令格式:DECOPR

指令功能:OPR←

(OPR)-1影响的标志位与加法同3、8086/8088的指令系统55算术运算类指令----减法指令

4)取补指令格式:NEGOPR

指令功能:OPR←

-(OPR)+15)比较指令格式:CMPOPR1,OPR2

指令功能:OPR1–OPR2,执行过程同减法,但结果不保留,仅改变标志位。指令可影响的标志位:SF,ZF,AF,PF,CF,OF。其中减1指令不影响CF,而影响其它5个标志。

3、8086/8088的指令系统56无符号数运算举例

例1:假定AX=7EC0H,BX=5368HADDAX,BX;结果AX=D228H例2:假定AL=7CH,BL=55HSUBAL,BL;结果AL=27H例3:假定AX=7EC0H,BX=A368HADDAX,BX;AX=2228H,结果错例4:假定AL=65H,BL=0AAHSUBAL,BL;AL=0BBH。结果错。3、8086/8088的指令系统57有符号数运算举例

例1假定AX=2753H,BX=4A80HADDAX,BX;AX=71D3H例2假定AX=275AH,BX=5A80HSUBAX,BX;AX=0CCDAH小数减大数结果为负,正确例3假定AX=7EC0H,BX=7A00HADDAX,BX;AX=F8C0H结果为负数,错例4假定AL=97H,BL=5AHSUBAL,BL;A=3DH负数减正数,结果为正数,错3、8086/8088的指令系统58溢出及判断

(正数-

负数)得出负数(正溢出)(负数-正数)得出正数(负溢出)(正数+正数)得到负数(下溢出)(负数+负数)得到正数(负溢出)CPU根据运算结果,自动对溢出标志OF置位。实际上,在8位运算时,微处理器是根据次高位向最高位C7的进(借)位Cy6与最高位C7向进(借)位位CF的进位Cy7的模2加(异或)来置OF的。而在16位数运算时,用的是Cy14和Cy15。即:

OF=Cy7⊕Cy6

或OF=Cy15⊕Cy143、8086/8088的指令系统59算术运算类指令----乘法指令

1)无符号数乘法指令乘法指令指定的一个寄存器为AX(或AL),结果在DX:AX或AX中,另一个数在指令中指出,其中SRC不能为立即数。指令格式:MULSRC指令功能:AX←AL*(SRC)(8位乘法)

DX、AX←AX*(SRC)(16位乘法)2)带符号数乘法指令指令格式:IMULSRC指令功能:AX←AL*(SRC)

DX、AX←AX*(SRC)该指令只影响标志OF与CF。乘法不会溢出(最高位不会有进位),这里OF与CF与加减法定义的意义不同,表示结果的位数。3、8086/8088的指令系统60对MUL,若运算结果的高半部分为全0,则标志OF=CF=0;否则OF=CF=1,以表示高半部分有结果(乘积超过8位或16位)。对IMUL,高半部分的每一位及与低半部分的最高位都相同时,OF=CF=0,表示高半部分为符号位扩展;否则OF=CF=1。OF=CF=1:高半部分有数据。

算术运算类指令----乘法指令

3、8086/8088的指令系统61乘法指令举例

例1设(AL)=0FBH,(BL)=02H,(AL)为无符号数252,或带符号-5(BL)为无符号数2,带符号2MULBL;AX=01F6H,CF=OF=1,结果502。IMULBL;AX=0FFF6H,CF=OF=0,结果-10。(符号扩展)例2设(AL)=0B4H,(BL)=11H,(AL)为无符号数180,带符号-76(BL)为无符号数17,带符号17MULBL;AX=0FAF4H,CF=OF=1。结果3060。IMULBL;AX=0FAF4H,CF=OF=1。结果-1292。3、8086/8088的指令系统62算术运算类指令----除法指令

1)无符号数除法指令除法指令同样用DX:AX或AX做被除数,除数在指令中说明。指令格式:DIVSRC根据SRC确定字节,还是字。指令功能:AL←(AX)/(SRC),余数在AH中。AX←(DX)(AX)/(SRC),余数在DX中。2)带符号数除法指令指令格式:IDIVSRC指令功能:AL←(AX)/(SRC),余数在AH中。AX←(DX)(AX)/(SRC),余数在DX中。除法对所有标志均没定义,但若结果为0或溢出,产生0号中断。要专门编程序处理。633、8086/8088的指令系统算术运算类指令----符号扩展指令

3)扩展AL中的符号(ConvertBytetoWord)指令格式:CBW指令功能:(AL)7=1,(AH)=0FFH;(AL)7=0,(AH)=00H。这条指令用在两个字节相除之前,产生一个双倍长度的被除数。此指令不影响标志位。4)扩展AX中的符号(ConvertWordtoDoubleword)指令格式:CWD指令功能:(AX)15=1,(DX)=0FFFFH;(AX)15=0,(DX)=0000H该指令用在两个字相除之前.将AX中字的符号扩展至DX中,形成双倍长度的被除数。此指令不影响标志位。

643、8086/8088的指令系统算术运算类指令----BCD码调整指令

BCD码:是一种用二进制编码的十进制数,包括:

压缩BCD码(组合BCD码):即用一个字节表示两位BCD码;

非压缩BCD码(分离BCD码):即用一个字节表示一位BCD码,高四位为零。十进制数通常采用BCD码表示。计算机只能用二进制计算,不能直接进行BCD码运算。十进制调整指令是为了实现对BCD码的调整而设计。653、8086/8088的指令系统算术运算类指令----BCD码调整指令

例:8+7=15。用组合的BCD码表示,运算结果为:

即结果为0FH。在BCD码中,只允许0~9这10个数字出现,0FH不代表任何BCD码,因此要对它进行变化。BCD码应该是逢10进1,但计算机在这里是逢16进1。因此,可以在个位上补一个6,让其产生进位,而此进位作为十位数出现。

结论:如果一位BCD码所对应的4位二进制超过9,那就应该补上一个6产生进位来进行调整。663、8086/8088的指令系统算术运算类指令----BCD码调整指令

9+9=18,用组合BCD码表示运算过程为:+0000100100001001————-------00010010+0000011000001001————-------00011110错误的原因是:计算机在运算时,遇到低四位往高四位产生进位时是按照逢16进1的规则进行的,但BCD码要求逢10进1,可见,BCD码运算时只要产生了进位,就会丢失一个6。因此,在出现进位时要进行调整。

结论:对BCD码进行运算时,只要AF变为1就要在低6位进行调整。673、8086/8088的指令系统算术运算类指令----BCD码调整指令

总结:凡是遇上某4位二进制码对应的BCD码大于9时,则加6进行调整;凡是遇上低4位产生了进位时,则加6进行调整。当对多个字节进行BCD码运算时,如果低位字节往高位字节产生进位则CF=1,而当一个字节的低4位往高4位产生进位时,AF=1。十进制调整指令会根据CF和AF的值判断是否进行“加6调整”,并进行具体的调整操作。然后,程序再对高位字节进行运算,再进行十进制调整。683、8086/8088的指令系统算术运算类指令----BCD码调整指令

BCD码运算指令主要有以下:压缩的BCD码调整指令:

DAA——

加法十进制调整指令

DAS——

减法十进制调整指令非压缩的BCD码调整指令:

AAA——

加法的ASCII调整指令

AAS——

减法的ASCII调整指令

AAM——

乘法的ASCII调整指令

AAD——

除法的ASCII调整指令共6条,均为隐含寻址方式,隐含的操作数是AL或AL、AH;不能单独使用,要紧跟在相应的算术运算指令之前后;执行结果为压缩BCD码或扩展BCD码表示的十进制数。693、8086/8088的指令系统算术运算类指令----压缩BCD码调整指令

十进制加法调整:指令格式:DAA调整过程:若(AL∧0FH)>9或(AF)=1则AL←(AL)+6,AF←1。若(AL)>9FH或(CF)=1则AL←(AL)+60H,CF←1。注意:执行本指令前,必须先执行ADD或ADC指令,将两个压缩的BCD码相加。标志寄存器中的辅助进位位AF的作用703、8086/8088的指令系统算术运算类指令----压缩BCD码调整指令

十进制加法调整例:设AL=66H,BL=66H,均为BCD码。执行DAAAL加66H,得132H。[AL=32H,CF=1]AL中为BCD码32,BCD码的100在进位标志CF中,产生3位十进制数。执行ADDAL,BLAL=0CCH,CF=0,AF=0。完整的指令格式:……ADDAL,BLDAA……713、8086/8088的指令系统算术运算类指令----压缩BCD码调整指令

十进制减法调整:指令格式:DAS调整过程:若(AL∧0FH)>9或(AF)=1

则AL←(AL)-6AF←1。若(AL)>9FH或(CF)=1

则AL←(AL)-60HCF←1。注意:执行本指令前,必须先执行SUB或SBB指令,将两个压缩的BCD码相减。723、8086/8088的指令系统算术运算类指令----非压缩BCD码调整指令

指令格式:AAA(加法调整)调整过程:若(AL∧0FH)>9或(AF)=1则AL←(AL)+6,AH←(AH)+1,并且清除AL的高四位;十进制加法调整(指令隐含的寄存器为AX):AAA指令对AL高4位不影响。例:设AX=0005H,BL=09H,顺序执行指令

ADDAL,BL

;00000101

+0000100100001110,AL=0EH;经AAA调整后,AL=04H,AH=01H,CF=AF=1。AAA733、8086/8088的指令系统算术运算类指令----非压缩BCD码调整指令

十进制减法调整:指令格式:AAS调整过程:

若(AL∧0FH)>9或(AF)=1则AL←(AL)-6,AH←(AH)-1,清除AL高四位;例:AX=0103H,BL=04HSUBAL,BL;AL=0FFHAH=1HAAS;AL=09H,AH=0743、8086/8088的指令系统算术运算类指令----非压缩BCD码调整指令

十进制乘法调整:指令格式:AAM调整过程:(先执行MUL指令,并要求AL和BL的高4位为0,结果在AL。)(AL)/0AH,商在AH,余数在AL。(十位数在AH,个位数在AL)

例:AL=07H,BL=09HMULBL;AX=003FHAAM;AH=06H,AL=03H753、8086/8088的指令系统算术运算类指令----非压缩BCD码调整指令

十进制除法调整:指令格式:AAD(除法调整)调整过程:与其它十进制调整指令不同,除法调整为先执行AAD,将AX中的被除数调整成二进制数,并存在AL中。调整前AH、AL高4位均为0例如:AX=0905H,BL=06HAAD;AX=005FHDIVBL;AL=0FHAH=05HMOVDL,AH;保留余数05HAAM;AX=0105H763、8086/8088的指令系统逻辑运算类指令

逻辑运算的特点是按位运算没有进位。逻辑变量中,各位之间没有关系。逻辑与运算(AND):全“1”得“1”逻辑或运算

(OR):有“1”得“1”逻辑非运算(NOT):单数运算,“1”变“0”,“0”变“1”逻辑异或运算

(XOR):相同为“0”,不同为“1”测试(TEST)(执行与运算,但不送回结果,只影响标志)

移位(分算术移位、逻辑移位、左移、右移等)

773、8086/8088的指令系统逻辑运算类指令

标志位CF和OF恒为0,AF未定义,其中逻辑非运算结果不影响标志寄存器。其它逻辑运算结果会影响SF、ZF、PF标志。1.

逻辑与运算指令格式:ANDDST,SRC指令功能:DST←(DST)∧(SRC)2.

逻辑或运算指令格式:ORDST,SRC指令功能:DST←(DST)∨(SRC)783、8086/8088的指令系统逻辑运算类指令

3.

逻辑非运算指令格式:NOTOPR指令功能:OPR←()4.

逻辑异或运算指令格式:XORDST,SRC指令功能:DST←(DST)⊕(SRC)5.测试(执行与运算,但不送回结果,只影响标志)指令格式:TESTOPR1,OPR2指令功能:(OPR1)∧(OPR2)793、8086/8088的指令系统逻辑运算类指令

判断某一位的状态?取出某一位的状态?改变某一位的状态?取一个数的补码?803、8086/8088的指令系统逻辑移位指令

移位指令主要由以下两大类指令组成:循环移位指令非循环移位指令算术左移指令SAL逻辑左移指令SHL算术右移指令SAR逻辑右移指令SHR不带进位的循环左移指令ROL不带进位的循环右移指令ROR带进位的循环左移指令RCL带进位的循环右移指令RCR813、8086/8088的指令系统逻辑移位指令

算术左移指令SAL指令格式:SALOPR,CNT指令功能:OPR可以是除立即数以外的任何寻址方式。移位次数由CNT决定,CNT可以是1或CL。注意如移位次数大于1,则可在该指令之前把移位次数置于CL寄存器中。高

低CF0逻辑左移指令SHL指令格式:SHLOPR,CNT;与SAL指令功能完全相同说明:(1)SHL指令和SAL指令功能相同,可实现有符号数和无符号数乘2,如果左移后,最高位和CF不同,则溢出标志OF为1。(2)根据OF的值判断左移操作是否造成了溢出。823、8086/8088的指令系统逻辑移位指令

算术右移指令SAR逻辑右移指令SHR指令格式:SAROPR,CNT指令功能:高

低CF说明:右移时,最高位保持不变。用途:用于带符号数除2。指令格式:SHROPR,CNT指令功能:高

低CF0说明:逻辑右移时,最高位补零。用途:用于无符号数除2。833、8086/8088的指令系统逻辑移位指令

不带进位的循环左移指令ROL指令格式:ROLOPR,CNT指令功能:高

低CF不带进位的循环右移指令ROR指令格式:ROROPR,CNT指令功能:高

低CF843、8086/8088的指令系统逻辑移位指令

带进位的循环左移指令RCL带进位的循环右移指令RCR指令格式:RCLOPR,CNT指令功能:高

低CF指令格式:RCROPR,CNT指令功能:高

低CF853、8086/8088的指令系统逻辑移位指令

所有移位指令影响标志位:CF,OF,PF,SF,ZF,无AF。如果要移动若干位,则必须在CL中指出移动位数,若移动一位,可在指令中直接给出。可对字节或字操作,操作数可以是寄存器或内存单元。说明:863、8086/8088的指令系统字符串操作指令

串操作指令就是用一条指令实现对一串字符或数据的操作。主要由以下几种指令组成:字符串传送指令:MOVSB/MOVSW字符串比较指令:CMPSB/CMPSW字符串检索指令:SCASB/SCASW取字符串指令:LODSB/LODSW存字符串指令:STOSB/STOSW873、8086/8088的指令系统字符串操作指令说明

针对数据块或字符串的操作可实现存储器到存储器的数据传送,是唯一的一组能直接处理源和目的操作数都在存储单元的指令待操作的数据串称为源串,源串一般存放在数据段,偏移地址由SI指定。目标地址称为目标串,必须在附加段,偏移地址由DI指定指令自动修改地址指针,修改方向由DF决定。DF=0为增地址方向;DF=1为减地址方向,数据块长度值由CX指定,可增加自动重复前缀以实现自动修改CX内容883、8086/8088的指令系统字符串操作指令—重复前缀

REP无条件重复REPE相等重复REPZ为零重复REPNE不相等重复REPNZ不为零重复条件重复CX≠0ZF=1CX≠0ZF=0CX≠0重复任何一个串操作指令,都可以在其前面加上一个重复执行前缀(REP),于是指令就重复执行。重复执行次数在寄存器CX中规定。直到[CX]=0结束。893、8086/8088的指令系统字符串操作指令

字符串传送MOVSB/MOVSW指令格式:MOVSDST,SRC指令功能:把DS段由SI指出的字节或字传送到ES段由DI指出存储单元中,并修改SI和DI地址指针,加还是减取决于DF标志。用CLD指令将DF清零,地址指针自动加,增址;用STD指令将DF置1,地址指针自动减,减址MOVSB完成字节操作,MOVSW完成字操作,通常指令前面加重复前缀REP,数据串长度送CX寄存器。903、8086/8088的指令系统字符串传送举例:

编写程序实现:将BUFFER1中的17个数传送到BUFFER2中去。LEASI,BUFFER1LEADI,BUFFER2MOVCX,17CLDREPMOVSBLEASI,BUFFER1LEADI,BUFFER2MOVCX,17CLDAGAIN:

MOVSBDECCXJNZAGAINLEASI,BUFFER1LEADI,BUFFER2MOVCX,17AGAIN:MOVAL,[SI]MOV[DI],ALINCSIINCDI

DECCXJNZAGAINREP执行的操作:1)如(CX)=0则退出REP,否则往下执行.2)(CX)=(CX)-13)执行其后的串指令4)重复1)~~3)913、8086/8088的指令系统字符串操作指令

字符串比较CMPSB/CMPSW指令格式:CMPSDST,SRC指令功能:把DS段由SI指出的字节或字和ES段由DI指出的字或字节相比较,并比较后修改SI和DI地址指针。指令影响标志位。若指令加上前缀REPE或REPZ,则操作可解释为:“当串未结束(CX≠0),且串是相等的(ZF=1),继续比较”。若指令前加上前REPNE或REPNZ,则表示“当串未结束(CX≠0),且串不等于搜索值(ZF≠0)时,继续搜索”此指令可用来检查两个字符串(或数据块)是否相等,或寻找两个字符串中第一个不相同的字符,或寻找两个字符串中第一个相同的字符等。923、8086/8088的指令系统字符串比较举例:

比较两个字符串是否相等,并找出其中第一个不相等字符的首地址,将该地址送到BX中,不相等字符送到AL中。设MEM1为源串首地址,MEN2为目的串首地址,两个字串长度均为200。LEASI,MEM1LEADI,MEM2MOVCX,200CLDREPECMPSBTESTCX,00FFHJZSTOPDECSIMOVAL,[SI]MOVBX,SISTOP:HLT933、8086/8088的指令系统字符串操作指令

字符串搜索SCASB/SCASW指令格式:SCASDST,SRC指令功能:实现在内存的某一字符串中寻找指定字符(关键字)。要寻找的关键字在AL或AX中。若指令前加上前缀REPE或REPZ,则表示“当串未结束(CX≠0),且串元素等于搜索值(ZF=1)时,继续搜索”。若指令前加上前REPNE或REPNZ,则表示“当串未结束(CX≠0),且串不等于搜索值(ZF≠0)时,继续搜索”。该指令执行AL(字节)或AX(字)的与由DI作为地址指针的串中某数比较,不改变目的串元素及AX(AL)的值,仅改变标志位。串指针DI的值同时修改,是增量修改还是减量修改,决定于DF标志。943、8086/8088的指令系统字符串操作指令

取字符串LODSB/LODSW指令格式:LODSDST,SRC指令功能:该指令将存储单元的内容装入到AL或AX中。即把由SI作为地址指针的串元素,装入到AL(字节)或AX(字)中去,同时修改SI,指向下一个串元素。该指令一般不使用重复前缀,因为每重复一次,累加器的内容都要改写,因此,只保留了最后一次的数据。该指令在循环程序中,往往是很有用的。例如要统计一个数据块中有多少个正数,负数或0,非压缩BCD码改为ASCII码,统计字符串中大写字母个数等。953、8086/8088的指令系统字符串操作指令

存字符串STOSB/STOSW指令格式:STOSDST,SRC指令功能:该指令将AL(8位数)或AX(16位数)寄存器的内容存入到由DI寻址的存储器单元中。DI指针的增减取决于DF标志位。利用重复操作,可以在内存中填充一串相同的字符或数据。

963、8086/8088的指令系统程序控制类指令

主要由以下几种指令组成:子程序调用和返回指令无条件转移和条件转移指令循环控制指令973、8086/8088的指令系统程序控制类指令----子程序调用和返回指令

子程序结构相当于高级语言中的过程。为了方便模块化程序设计,往往把程序中某些具有独立功能的部分编写成独立的程序模块,称之为程序。子程序调用和返回指令都不影响标志位。调用指令(CALL);返回指令(RET);983、8086/8088的指令系统程序控制类指令----子程序调用和返回指令

将调用指令的下一条指令的地址(断点)压入堆栈获取子过程的入口地址(子过程第1条指令的偏移地址)(执行子过程,含相应参数的保存及恢复)将断点偏移地址由堆栈弹出,返回原程序段内直接调用指令、段内间接调用指令、段间直接调用指令、段间间接调用指令。子程序调用过程:该类指令提供了:993、8086/8088的指令系统程序控制类指令----子程序调用和返回指令

1、段内直接调用指令例:

CALL1000H;段内直接调用,调用地址在指令中给出子过程与原调用程序在同一代码段,在调用之前只需保护断点的偏移地址指令格式:CALLDST;指令功能:(SP)(SP)-2,((SP)-2,(SP)-1)(IP)(IP)(IP)+16位偏移量1003、8086/8088的指令系统程序控制类指令----子程序调用和返回指令

2、段内间接调用指令例:

CALLAX;段内间接调用,调用地址由AX给出。(IP)(AX)子过程与原调用程序在同一代码段,在调用之前只需保护断点的偏移地址指令格式:CALLDST;指令功能:(SP)(SP)-2,((SP)-2,(SP)-1)(IP)(IP)(EA)1013、8086/8088的指令系统程序控制类指令----子程序调用和返回指令

3、段间直接调用指令指令格式:CALLDST;指令功能:(SP)(SP)-2,((SP)-2,(SP)-1)(CS)段地址(SP)(SP)-2,((SP)-2,(SP)-1)(IP)偏移地址例:

CALL2500:3600;段间直接调用,调用段地址和偏移量在指令中给出子过程与原调用程序不在同一代码段,在调用之前需保护断点的段基地址和偏移地址。先将断点的CS压栈,再压入IP1023、8086/8088的指令系统程序控制类指令----子程序调用和返回指令

4、段间间接调用指令指令格式:CALLDST;指令功能:

(SP)(SP)-2,((SP)-2,(SP)-1)(CS)(SP)(SP)-2,((SP)-2,(SP)-1)(IP)(IP)(EA)寻址方式确定的有效地址

(CS)(EA+2)例:

CALLDWORDPTR[DI];段间间接调用,指令给出调用段地址和偏移量的存放地址1033、8086/8088的指令系统程序控制类指令----子程序调用示例

设(DS)=6000H,(SI)=0560H,指令

CALLDWORDPTR[DI]

的操作示意图IPCS代码段数据段60560HXXHXXHXXHCALL┇┇┇┇XXH1043、8086/8088的指令系统程序控制类指令----子程序返回指令

指令格式:

RET

指令功能:返回指令RET作为子程序的最后一条指令用来返回高一层的程序。执行时,会从堆栈顶部弹出返回地址出栈送IP寄存器(段内或段间)和CS寄存器(段间)。8086指令系统中,段内返回指令和段间返回指令形式是一样的。不影响标志位。(IP)((SP)+1,(SP))(SP)(SP)+21053、8086/8088的指令系统程序控制类指令----子程序返回指令

指令格式:

RET

EXP

指令功能:(IP)((SP)+1,(SP))(SP)(SP)+2(SP)(SP)+D16EXP是一个表达式,根据它的值计算出常数为指令中的位移量n。n可以表示为0~FFFFH范围中的任何一个偶数。应用范围:主程序为某个子程序提供一定的参数或参数地址,在进入子程序之前,主程序将这些参数或参数的地址压入堆栈中,通过堆栈供子程序调用,子程序使用后,这些参数已无使用价值,堆栈中不需要保存这些参数,因而在返回指令RET中提供参数n在返回同时堆栈指针自动增加几个字节,以去掉堆栈中的几个字节。1063、8086/8088的指令系统程序控制类指令----转移指令

无条件转移指令无条件转移到目标地址,执行新的指令条件转移指令在具备一定条件的情况下转移到目标地址通过修改指令的偏移地址或段地址及偏移地址实现程序的转移1073、8086/8088的指令系统程序控制类指令----无条件转移指令

指令功能:无条件转移指令可以转移到内存中存放的任何程序段。指令必须指定转移的目标地址(或称转移地址)。无条件转移指令不影响标志位。指令分类:段内转移和段间转移。段内转移只须改变IP寄存器的内容,用新的转移目标地址代替原有的IP的值就可以。段间则转到另一段去执行程序,因此,不仅要修改IP寄存器的内容,而且还要修改CS寄存器的内容。1083、8086/8088的指令系统程序控制类指令----无条件转移指令

指令格式:

JMPLABEL段内直接短转移:

格式:JMPSHORTOPR;

功能:(IP)(IP)+8位移量;8位移量是一个带符号数,转移范围在–128--+127

例:JMPSHORT10H;转移地址偏移量在指令中给出(2)段内直接近转移:

格式:JMPNEARPTROPR

功能:(IP)(IP)+16位移量;16位移量是一个带符号数,转移范围在段内任意位置例:JMP1000H;段内直接转移,转移地址偏移量在指令中给出1093、8086/8088的指令系统程序控制类指令----无条件转移指令

(3)段内间接转移:

格式:JMPWORDPTROPR;

功能:(IP)(EA);EA值由OPR的寻址方式确定。它可以使用除立即数以外的任一种寻址方式。例:JMPCX;段内间接转移,转移地址偏移量由CX给出

(4)段间直接(远)转移:

格式:JMPFARPTROPR;

功能:(IP)OPR的段内偏移地址;(CS)OPR所在段的段地址例:JMP2000:0100H;段间直接转移,转移段地址和偏移量在指令中给出1103、8086/8088的指令系统程序控制类指令----无条件转移指令

(5)段间间接转移:格式:JMPDWORDPTROPR;

功能:(IP)(EA)(CS)(EA+2)EA值由OPR的寻址方式确定。它可以使用除立即数以外的任一种寻址方式。例:JMPDWORDPTR[SI]段间间接转移,转移地址

温馨提示

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

评论

0/150

提交评论