1 / 195

第 4 章 指令系统与汇编语言

第 4 章 指令系统与汇编语言. 4.1 指令系统概述 4·2 寻址方式 4·3 8086/8088 指令系统 4·4 汇编语言简述. 1. 4. 2. 5. 3. 6. 本章学习目标. 8086CPU 指令系统 的寻址方式及地址计算方法. 8086CPU 指令及其应用. 汇编语言基本格式. 汇编语言程序设计基本步骤和基本方法. 顺序程序、分支程序、循环程序、子程序的基本结构和设计方法. 常用 DOS 中断调用. 返回本章. 4.1 指令系统概述. 4.1.1 指令的格式 4.1.2 指令 中的操作数. 返回本章.

buffy
Télécharger la présentation

第 4 章 指令系统与汇编语言

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第4章 指令系统与汇编语言 4.1 指令系统概述 4·2 寻址方式 4·3 8086/8088指令系统 4·4 汇编语言简述

  2. 1 4 2 5 3 6 本章学习目标 8086CPU指令系统的寻址方式及地址计算方法 8086CPU指令及其应用 汇编语言基本格式 汇编语言程序设计基本步骤和基本方法 顺序程序、分支程序、循环程序、子程序的基本结构和设计方法 常用DOS中断调用 返回本章

  3. 4.1 指令系统概述 4.1.1 指令的格式 4.1.2 指令中的操作数 返回本章

  4. 4.1.1 指令的格式 指令的格式与机器的字长、存储器的容量及指令的性质都有很大的关系。计算机是通过执行指令来完成各种任务的,微处理器处理的所有对象除指令外都可以认为是数据,所以计算机所要完成的任务就是对各种数据的处理。因此,一条指令至少要包括这样几个信息:运算数据的来源、运算结果的去向及执行的操作。 指令要执行的操作称为操作码,也称为指令码。它说明所执行的操作的性质和功能,如加、减、乘、除等。操作码有的占用一个字节,有的占用两个字节。一台计算机有几十或几百条指令,每条指令都有一个对应的操作码,计算机通过识别操作码来决定要进行的操作。 返回本节

  5. 参加运算的数据,亦即操作的对象称为操作数。数据的来源及运算结果的去向都统称为操作数的地址,也可简称为操作数。通常将存放结果的操作数称为目标操作数,相应的另一个操作数就称为源操作数。参加运算的数据,亦即操作的对象称为操作数。数据的来源及运算结果的去向都统称为操作数的地址,也可简称为操作数。通常将存放结果的操作数称为目标操作数,相应的另一个操作数就称为源操作数。 除操作码和操作数外,在遇到转移、子程序调用等非顺序执行的情况时,指令中还应给出下一条要执行的指令的地址(在程序顺序执行时,下条要执行的指令的地址由指令指针IP指出)。 总之,一条指令主要包括了两种信息,即操作码和操作数(或称地址码)。操作码部分描述操作的性质,操作数描述了操作的对象,它可以是直接参加运算的数据,也可以是数据的地址。

  6. 2.单操作数指令 格式: 这里操作数,它有两种情况:一是该操作数既表示运算数据的地址,也表示存放运算结果的地址。如加1指令: INC AX。该指令执行的结果是将累加器AX中的内容加1然后再送回AX;二是指令中的操作数是源操作数,而目标操作数被隐含了,即指令实际上是双操作数指令,默认了另一个操作数,运算的结果也默认存放在隐含的操作数地址中。如乘法指令: MUL BL,该指令的执行是将累加器AL的内容与BL内容相乘,结果送AX。

  7. 3.双操作数指令 格式: 指令中的操作数2是源操作数,它本身就是参加运算的一个数据,或是其中一个操作数的地址;操作数1是目标操作数,它有两个含义,表示另一个操作数的地址及存放运算结果的目标地址。这是最常见的指令格式,微处理器的基本指令系统中多数指令都是双操作数指令。例如:加法指令ADD AX, BX。 微型计算机中的指令都是以上三种格式。在大型机或某些功能较强的中、小型机的指令格式就不限于以上三种,而可以是三操作数以至多操作数的指令格式。 返回本节

  8. 4.1.2 指令中的操作数 8086指令系统中的指令均为以上三种格式。其操作数既可以是数据,也可以是参加运算的数据的地址。根据它们的性质,将操作数分为这样三类:立即数操作数、寄存器操作数和存储器操作数。 1.立即数操作数 所谓立即数是指具有固定数值的操作数,即常数。它可 以是字节(8位)或字(16位),可代表无符号数或有符号数。立即数操作数直接存放在指令代码中,跟在操作码之后,它作为指令的一部分存放在代码段里。 在指令中,立即数操作数表示参加运算的数据而不是数据的地址,所以只能用作源操作数,而不能作为目标操作数。 例: MOV AX,1234H 返回本节

  9. 注意: 立即数无法作为目标操作数 立即数可以是无符号或带符号数, 其值应在允许范围内 错误例: MOV AX, 12345H MOV 1234H, AX 2.寄存器操作数 寄存器操作数表示参加运算的数存放在指令给出的寄存器中,即寄存器的内容为操作数,可以是16位或8位。寄存器操作数既可以用做源操作数,也可以用做目标操作数。 例:MOV AX,BX MOV DL,CH 返回本章

  10. 3.存储器操作数 存储器操作数是指操作数存放在内存中,指令中需要指明操作数的地址。存储器操作数在指令中既可作为源操作数,也可以作为目标操作数。操作的数据可以是字节、字或双字,分别存放在1个、2个或4个存储单元中。地址值或寄存器 表示形式:[地址值或寄存器] 例:MOV AX,[1234H] ;[1234H]表示操作数在地址为1234H的存储器单元中 在8086中,大多数指令不允许源操作数和目标操作数同时为存储器作数,也就是说,不允许从存储器到存储器的操作。若有这样的需要,可以先将其中一个存储器的内容传送到某个通用寄存器中,然后再把这个寄存器与另一个存储器的内容作为操作数执行希望的操作。

  11. 从前面章中已经知道,能够惟一标识一个存储器单元的是它的物理地址,而物理地址是由段基地址和偏移地址计算得出。所以,要寻找一个存储在存储器中的操作数,必须首先确定数据所在的段,即确定有关的段寄存器。 一般情况下,若指令中没有指明所涉及的段寄存器,则CPU就采用默认的段寄存器来确定数据所在的段。各种存储器操作所约定的默认段寄存器、段超越(即显式地指明段寄存器)所允许的段寄存器以及指令的有效地址所在的寄存器见表4-1。 表4-1 段寄存器使用的一些基本约定 返回本节

  12. 4.2 寻址方式 4.2.1 寻找操作数的寻址方式 4.2.2 寻找转移地址的寻址方式 返回本章

  13. 4.2.1 寻找操作数的寻址方式 1.立即寻址 立即寻址是指指令中的源操作数是参加操作的一个立即数,由指令直接给出。它作为指令的一部分,紧跟在指令的操作码之后,存放于内存的代码段中,在CPU取指令时随指令码一起取出并直接参加运算。 指令中的立即数可以是8位或16位的整数。若为16位,则存放时低8位存放在低地址单元,高8位存放在高地址单元。 例如: MOV AX,3344H ;表示将16位的立即数3344H送人累加器AX。指令执行后 AH=33H,AL=44H。

  14. 2.寄存器寻址 寄存器寻址中指令的操作数在CPU的内部寄存器。它们可以是数据寄存器(8位或16位),也可以是地址指针、变址寄存器或段寄存器。 通用寄存器主要用于存放操作的数据,通用寄存器中的AX,BX,CX,DX既可以作为4个16位寄存器,用来存放字操作数,也可以当作8个8位寄存器(AH,AL,BH,BL,CH,CL,DH,DL),用来存放字节操作数。SI,DI,BP,SP只能存放字操作数。 例: MOV SI, AX ;将AX的内容送到寄存器SI中

  15. 3.直接寻址 直接寻址指令是在指令中直接给出操作数的16位偏移地址,该地址与指令的操作码一起存放在内存的代码段,也是低8位在低地址,高8位在高地址。但是,若操作数本身在指令中无特殊声明,默认存放在内存的数据段中。 例: MOV AX,[2233H] ;将数据段中偏移地址EA为2233H和2234H两单元的内容送到AX中。 假如(DS)=2000H,则所寻找的操作数的物理地址 PA=(DS)*16+EA =20000H+2233H=22233H

  16. 4.寄存器间接寻址 寄存器间接寻址与寄存器寻址方式不同,指令中指定的寄存器的内容不是操作数,而是操作数的偏移地址。也就是说操作数的偏移地址放在寄存器中,操作数本身则在存储器中。存放存储器地址的寄存器有时也称为地址指针。寄存器间接寻址方式可用的寄存器只允许是SI、 DI、 BX和BP 4个,它们可简称为间址寄存器。选择不同的间址寄存器,涉及的段寄存器将有所不同。 在默认情况下,选择SI, DI, BX为间址寄存器时,操作数在数据段,段基地址由DS决定,操作数的物理地址为: PA=(DS)*16+(BX)或(SI)或(DI)

  17. 在默认情况下,选择BP为间址寄存器,则操作数在堆栈段,段基地址由SS决定,操作数的物理地址为: PA=(SS)*16+(BP) 例: MOV AX,[SI] 假如(DS)=6000H,(SI)=1200H 操作数的物理地址PA=(DS)*16+EA =(DS)*16+(SI) =6000H*10H+1200H=61200H 61200单元的内容(61200H)=44送AL, 61201单元的内容(61200H)=33送AH, 即指令执行的结果为(AX)=3344H。

  18. 5.寄存器相对寻址 采用这种寻址方式时,存放于主存中的操作数的偏移地址等于间址寄存器的内容加上指令中给出的一个8位或16位的地址位移量,位移量紧随操作码一起存放在代码段中。操作数默认在哪一个段,则仍由所使用的间址寄存器决定(使用BP则默认在堆栈段,其他的到默认在数据段)。 位移量也可看作相对值,故把这种带位移量的寄存器间接寻址方式称为寄存器相对寻址。 PA=(DS)*16+(BX)或(SI)或(DI)+位移量 或 PA=(SS)*16+(BP) + 位移量

  19. 例:M0V AX,DATA[BX] 假如:(DS)=6000H,(BX)=1000H,DATA=08H,则 物理地址PA =(DS)*16+EA =(DS)*16+(BX)+DATA =60000H+1000H+08H=61008H 在汇编语言中,相对寻址指令的书写格式允许有几种不同的形式。以下几种写法是完全等价的: M0V AX,DATA[BX] M0V AX,[BX]DATA M0V AX,DATA+[BX] M0V AX,[BX]+DATA M0V AX,[DATA+BX] M0V AX,[DATA+BX]

  20. 6.基址变址寻址 这种寻址方式由一个基址寄存器(BX或BP)的内容和一个变址寄存器(SI或DI)的内容相加形成操作数在主存中的偏移地址。数据的段基址在默认情况下则由指令中使用的基址寄存器决定,即若使用BX作基址寄存器则数据默认在数据段,段寄存器用(DS);若使用BP作基址寄存器则数据默认在堆栈段,段寄存器用(SS)。 例:指令MOV AX,[BX][SI] 使用基址变址寻址方式时,8086CPU不允许将两个基址寄存器或两个变址寄存器组合在一起寻址,即指令中不允许同时出现两个基址寄存器或两个变址寄存器。例如,以下指令是非法的: MOV AX,[BX][BP];错误!同时出现两个基址寄存器 MOV AX,[SI][DI];错误!同时出现两个变址寄存器

  21. 7. 基址变址相对寻址 这种寻址方式事实上是上一种方式的扩充。指令中指定了一个基址寄存器和一个变址寄存器,同时还给出一个8位或16位的位移量,将三者相加就得到操作数在主存中的偏移地址。至于默认的段寄存器,仍由所用的基址寄存器决定。 例: MOV AX,DATA[BX][DI] 与寄存器间接寻址方式类似,基址变址相对寻址指令同样也可以表示成多种形式,例如: MOV AX,DATA[BX][SI] MOV AX, [BX+DATA][SI] MOV AX, [BX+SI+DATA] MOV AX, [BX]DATA[SI] MOV AX, [BX+SI][DATA]

  22. 同样,基址变址相对寻址也不允许在指令中同时出现两个基址寄存器或两个变址寄存器。即下列指令也是非法的: MOV AX,DATA[SI][DI] MOV AX,[BX][BP]DATA 返回本节

  23. 4.2.2 寻找转移地址的寻址方式 在一般情况下,当BIU取走一条指令后,指令指针IP会自动加1指向代码段中下一条要执行指令的地址,使程序按照预先设定好的次序,由低地址到高地址顺序执行。但当遇到转移指令,需要改变程序的这种执行顺序,转移到一个新的地址再顺序执行。因为BIU是严格按照CS和IP所给出的地址去取指令的,所以,只要修改IP的内容或同时修改CS和IP的内容就能够实现程序转移到新地址继续执行的目的。寻找转移地址的寻址方法就是如何找出转移的目标地址。 程序的转移可以是在当前代码段内,这种转移称为段内转移,只需改变IP的内容;程序也可以转移到另一个代码段,这称为段间转移,需同时修改CS和IP的内容。因此转移地址的寻址相应地有段内寻址和段向寻址两种方式。

  24. 1.段内寻址方式 1)段内直接寻址 段内直接寻址也称为相对寻址。转移的地址是当前IP的内容加上指令给定的8位或16位位移量,形成新的IP,并使CS的内容保持不变。位移量可以为正,也可以为负。如果位移量是8位,称为段内直接短转移,转移范围为 -128~+127;若位移量为16位,称为段内直接近转移,转移范围为-32768~+32767。指令的格式表示为: JMP NEAR PTR NEXT JMP SHORT EXIT 其中,NEXT和EXIT均为转向的符号地址(标号),在机器指令中,用位移量来表示。位移量就是程序中的标号与转移指令之间的距离,由汇编程序计算得到。 段内直接寻址方式适合于条件转移或无条件转移类指令,但条件转移指令只能是段内短转移。

  25. 2)段内间接寻址 此时程序转移的地址存放在寄存器或存储单元中。执行时用寄存器或存储单元的内容取代当前IP的值。这个寄存器或存储单元的内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得。指令的格式表示为: JMP BX JMP WORD PTR [BX+TABLE] 其中,WORD PTR为操作符,用以指出其后的寻址方式所取得的转向地址是一个字的有效地址。

  26. 2.段间寻址方式 使用段间寻址方式是表示程序转移的目标地址不在当前代码段内。亦即不仅要改变指令指针IP的内容,代码段寄存器CS的内容也要修改。段间寻址同样可分为直接寻址和间接寻址两种方式。 1)段间直接寻址 这种寻址方式是直接用指令中(NEXT)给出的16位的段地址以及16位的偏移地址来取代当前CS和IP的内容。指令的格式表示为: JMP FAR PTR NEXT 其中,NEXT 为转向的符号地址,FAR PTR为段间转移的操作符。

  27. 2)段间间接寻址 此时转移的目标地址存放在存储器的连续4个单元中,高地址单元存放新的CS值,低地址单元存放新的IP值。指令的格式表示为: JMP DWORD PTR [BX+TABLE] 其中,DWORD PTR为双字操作符,用以指出其后的寻址方式所取得的转向地址需取双字的段间转移指令。[BX+TABLE]说明数据寻址方式为寄存器相对寻址方式。 返回本节

  28. 4.3 8086/8088指令系统 4.3.1 数据传送类指令 4.3.2 算术运算类指令 4.3.3 逻辑运算(位操作)类指令 4.3.4 串操作类指令 4.3.5 控制转移类指令 4.3.6 处理器控制类指令 返回本章

  29. 4.3.1 数据传送类指令 数据传送类指令的功能是把数据、地址或立即数传送到寄存器或存储单元。根据传送的内容可以分为四类,通用数据传送指令、累加器专用传送指令、地址传送指令和标志寄存器传送指令。 1.通用数据传送指令 (1)MOV传送指令 指令格式:MOV dst,src ;dst←(src) 其中dst表示目的操作数,src表示源操作数。该指令把源操作数传送至目的操作数。这种传送实际上是进行数据的“复制”,源操作数内容不变,目的操作数内容与源操作数内容相同。

  30. 图4-8 MOV数据传送的方向 在MOV指令中源操作数可以为:存储器、寄存器、段寄存器和立即数;目标操作数可以为:存储器、寄存器(不能为IP)和段寄存器(不能为CS)。除了目标操作数和源操作数不能同时为存储器、段寄存器;目标操作数不允许为立即数;不允许立即数送段寄存器以外,可以任意搭配。数据传送的方向如图4-8所示。 需说明一点,对于代码段寄存器CS和指令指针寄存器IP,通常无需用户利用传送指令改变其中的内容。但是CS可以作为源操作数。

  31. ①.立即数传送到通用寄存器:立即数可以是8位或16位数据、常量、ASCII码字符、符号名等。数据的类型必须与寄存器字长一致。①.立即数传送到通用寄存器:立即数可以是8位或16位数据、常量、ASCII码字符、符号名等。数据的类型必须与寄存器字长一致。 例如: MOV AL, 32H ;8位立即数52H 送AL寄存器 MOV CL, 'D' ;字符’D’的 ASCII码值送CL寄存器 MOV SI, COUNT ;COUNT为一个符号常数,其值送SI寄存器 MOV DX, 3250H ;16位立即数3250H送DX寄存器 ②.通用寄存器之间传送:此类指令可采用8位或16位寄存器,两个寄存器之间传送要求数据类型必须匹配。 例如: MOV AX, BX ;16位寄存器之间传送 MOV DL, CL ;8位寄存器之间传送

  32. ③.通用寄存器和存储单元之间传送:可以将数据从存储单元传送到通用寄存器,也可以从通用寄存器传送到存储单元。③.通用寄存器和存储单元之间传送:可以将数据从存储单元传送到通用寄存器,也可以从通用寄存器传送到存储单元。 例如:MOV AX, [2100H] ; 将指定存储单元中的数据传送到AX寄存器中 MOV [5210H], SI ; 将SI寄存器中的内容传送到指定的存储单元中这类传送指令中,两个操作数的类型要一致。 ④.立即数传送到存储单元:源操作数可以是8位或16位立即数。 例如:MOV ARRAY, 32H;如果在数据段中己定义ARRAY为内存单元的符号地址,则将立即数32H送给ARRAY单元。

  33. ⑤.段寄存器与通用寄存器间的数据传送:采用16位寄存器,且只能是字操作。段寄存器CS不能作为目的操作数。⑤.段寄存器与通用寄存器间的数据传送:采用16位寄存器,且只能是字操作。段寄存器CS不能作为目的操作数。 例如:MOV DS, AX ;将累加器AX中的内容传送到 数据段寄存器DS中 ⑥.段寄存器与存储单元间的数据传送: 例如:MOV [SI], DS ;将DS中的内容传送到SI所指示的字单元中 MOV ES, [BX] ;将BX所指示的存储单元中的内容传送到ES中

  34. 注意:MOV指令可以在CPU内部或CPU和存储器之间传送字或字节数据。应该注意:立即数不能直接送段寄存器;目的操作数不允许用立即数寻址,也不允许用CS寄存器;MOV指令在两个存储单元之间不能直接传送数据;不允许在两个段寄存器之间直接传送数据:MOV指令不影响标志位。注意:MOV指令可以在CPU内部或CPU和存储器之间传送字或字节数据。应该注意:立即数不能直接送段寄存器;目的操作数不允许用立即数寻址,也不允许用CS寄存器;MOV指令在两个存储单元之间不能直接传送数据;不允许在两个段寄存器之间直接传送数据:MOV指令不影响标志位。

  35. (2)XCHG交换指令 指令格式:XCHG oprl,opr2 ;将源地址与目的地址中的内容互换。即(oprl)→←(opr2) 其中oprl和opr2表示操作数。该指令中必须有一个操作数是在寄存器中,可以是两个寄存器间,也可以是寄存器和存储单元之间。可以实现字节数据交换,也可以实现字数据交换。指令执行结果不影响标志位。 例如:XCHG AX,BX ;将寄存器AX内容与BX内容互相交换 若给定(AX)=325AH,(BX)=2130H 则指令执行后(AX) =2130H, (BX) =325AH。

  36. (3)堆栈操作指令 堆栈是存储器中的一个特殊区域,用于存入和取出数据。堆栈是以“先进后出”的方式进行数据操作的。从8086的堆栈组织来看,堆栈操作必须以“字”为单位进行,堆栈是从高地址向低地址方向生长的。它只有一个出入口,堆栈指针寄存器SP始终指向堆栈的栈顶单元。堆栈操作指令是用来完成压入和弹出堆栈操作的。8086/8088指令系统中提供了完成这两种操作的相应指令。

  37. ①.PUSH入栈指令 指令格式及操作: PUSH src ;SP←SP-2,((SP)+1, (SP))←(src) 指令完成的操作是“先移后入”,即先将堆栈指针SP减2,然后再将操作数src中的双字节数压入由SP指出的栈顶中。指令中的操作数src可以是通用寄存器和段寄存器,也可以是由某种寻址方式所指示的存储单元,但不能是立即数。 例如: PUSH AX ;SP←(SP)-2,((SP)+1)← (AH),((SP))←(AL) PUSH CS PUSH [SI]

  38. ②.POP出栈指令 指令格式及操作: POP dst ;(dst)←((SP)+1, (SP)),SP←SP+2 指令完成的操作是“先出后移”,即先将堆栈指针SP所指示的栈顶存储单元弹出一个双字节数到操作数dst中,然后将堆栈指针SP加2。指令中的操作数dst可以是通用寄存器和段寄存器(但不能是CS),也可以是存储单元,同样不能是立即数。 例如:POP BX 若给定(SS)=2000H,(SP)=0100H,(BX)=78C2H,(20100H)=6B48H 则指令执行后(BX)=6B48H., (SP) =0102H

  39. 2.累加器专用传送指令 累加器AX通常作为数据传输的核心,8086指令系统中的输入/输出指令和换码指令是专门通过累加器来执行的。 (1)输入指令 Ⅰ.直接寻址的输入指令:IN Acc,port ;Acc←(port) 此指令将8/16位数据直接经输入端口port(地址0~255)送入到AL/AX累加器中。Acc为8位或16位累加器。 例如:IN AL, 30H ;将端口地址为30H(宽度为8位)的端口中的数据读入到AL中。

  40. Ⅱ.间接寻址的输入指令:IN Acc, DX ;Acc←((DX)) 此指令是从DX 内容指定的端口中将8/16位数据送入到AL/AX累加器中。Acc为8位或16位累加器。当端口地址〉255时,必须用此方式。 例如:MOV DX, 1FFH ;将端口地址1FFH先送给DX寄存器 IN AL, DX ;将DX所指示的的端口中的数据读入到AL中。

  41. (2)输出指令 Ⅰ.直接寻址的输出指令:OUT port, Acc ;port← (Acc) 此指令将AL/AX累加器中8/16位数据输出到指令指定的I/O端口port(地址0~255)中。 例如:OUT 20H, AL ; AL中的内容输出到端口地址为20H的字节端口中。 Ⅱ.间接寻址的输出指令:OUT DX, Acc ;((DX))←(Acc) 此指令将AL/AX累加器中8/16位数据输出到DX内容指定的I/O端口中。当端口地址〉255时,必须用此方式。 例如:MOV DX, 1FFH ;

  42. (3)XLAT 换码指令 指令格式:XLAT  ;执行操作AL←(BX+AL) 换码指令可将(BX)为首址,(AL)为位移量的字节存储单元中的数据送AL寄存器。 一般用来实现码制之间的转换,又称为查表转换指令。可将AL中的一个值转换为内存表格中的某一个值,再送回AL中。

  43. 3.地址传送指令 (l)LEA有效地址送寄存器:LEA reg16,mem;将存储器操作数mem的有效地址传送到16位的通用寄存器reg16中。 例如:LEA BX,[SI+BP] ;执行后将(SI)+(BP)的结果送到BX中。 LEA BX,buffer ;执行后将符号地址buffer的有效地址送到BX中。 (2)LDS地址指针送寄存器:LDS reg16,mem32;其中mem为32位存储器操作数,reg16为16位通用寄存器。此指令执行的操作是将mem32指示的前两个字节单元的内容送入指令中指定的通用寄存器中,后两个字节的内容送入DS 中。 例如:LDS BX,ARR[SI] 若给定ARR=0010H,(SI)=0020H,(DS)=2000H, (BX)=6AE0H (20030H.) =0080H,(20032H)=4000H 则指令执行后(BX) =0080H, (DS)=4000H

  44. (3)LES地址指针送寄存器:LDS reg16,mem32;指令执行的操作与LDS指令大致相似,不同之处是以ES代替DS。 例如:LES DI,[BX] 若给定(DS)=2000H,(BX)=0020H,(20020H)=18H,(20021H)=A5H, (20022)=00H,(20023H)=50H,(ES)=4000H 则指令执行后(DI)=A518H,(ES)=5000H。

  45. 4.标志寄存器传送指令 标志寄存器传送指令共有4条。这些指令都是单字节指令,指令的操作数以隐含形式规定,字节操作数隐含为AH寄存器。 (1)取标志指令:LAHF ;将标志寄存器FLAG中的5个状态标志位SF, ZF, AF, PF及CF分别取出传送到累加器AH的对应位,如图4-9所示。 图4-9 LAHF 指令操作示意图

  46. (2)置标志位指令:SAHF ;SAHF指令的传送方向与LAHF方向相反,将AH寄存器中的第7, 6, 4, 2, 0位分别传送到标志寄存器对应位。SAHF指令将影响标志位,FLAG寄存器中的SF、 ZF、 AF、PF和CF将被修改成AH寄存器中对应位的值,但OF、 DF、IF和TF不受影响。 (3)标志压入堆栈指令:PUSHF ;PUSHF指令先将SP减2,然后将标志寄存器FLAG中的内容(16位)压入堆栈中。 (4)标志弹出堆栈指令:POPF ;POPF指令的操作与PUSHF指令相反,它将堆栈内容弹出到标志寄存器FLAG,然后加2。POPF指令对状态标志位有影响。 PUSHF和POPF指令可用来保护调用过程以前标志寄存器的值。过程返回后再恢复标志位,或用来修改标志寄存器中相应标志位的值。 返回本节

  47. 4.3.2 算术运算类指令 • 8086的算术运算类指令包括加、减、乘、除4种基本运算指令,以及进行BCD码十进制数运算的指令。 • 算术运算指令涉及无符号数和带符号数两种类型的数据,加减运算采取同一套指令,乘除运算有各自不同的指令。加减法运算在执行过程中有可能产生溢出,对于无符号数,如果加法运算最高位向前产生进位,减法运算最高位向前有借位,则表示出现溢出,用CF标志位可检测无符号数是否溢出;对于带符号数,采用补码运算,符号位参加运算,溢出则表示运算结果发生错误,用OF标志位可检测带符号数是否溢出。 • 算术运算指令会影响标志位,其规则如下: • 运算结果向前产生进位或借位时,CF=1; • 最高位向前进位和次高位向前进位不同时,OF=1; • 若运算结果为0, ZF=1; • 若运算结果最高位为1, SF=1; • 若运算结果中有偶数个1,PF=1。

  48. 1.加法指令 (1)不带进位加法指令:ADD dst, src ;(dst)←(dst)+(src) 将源操作数src和目的操作数dst数相加,结果放回目的操作数。 注意,两个存储器操作数不能直接相加,段寄存器不能参加运算。在使用时还要注意两个操作数类型保持一致。例如: ADD AL, BL ;两个寄存器字节数据相加 ADD AL, [0210H];内存单元与寄存器字节数据相加 ADD [SI],AX ;寄存器与内存单元字数据相加 ADD BYTE PTR[SI],34H;立即数与内存单元字节数据相加

  49. (2)带进位的加法指令:ADC dst, src ;(dst)←(dst)+(src)+ (CF)将源操作数与目的操作数及进位标志CF的值相加,结果放在目的操作数中。源操作数及目的操作数的类型与ADD指令相同。 ADC指令主要用于多字节(或多字)加法运算中。如果低字节(或字)相加时产生进位,则在下一次高字节(或字)相加时将这个进位加进去。 (3)加1指令:INC opr ;指令对opr中的内容加1。 opr只能为通用寄存器或存储器操作数,不能为立即数,也不能是段寄存器。该指令常用在循环程序中修改地址指针或用作循环计数器。 例如:INC AL INC CX INC BYTE PTR [SI+BX]

  50. 2.减法指令 (1)不带借位减法指令SUB dst, src ;(dst)←(dst)-(src) 将目的操作数dst减去源操作数src,结果放回目的操作数。 例如:SUB AX, BX ;执行AX内容减去BX内容,结果送到AX中。 (2)带借位的减祛指令:SBB dst, src ;(dst)←(dst)-(src)- (CF)被减数dst减去减数src,同时还要减去借位CF。SBB指令主要用于多精度数减法中。 例如:SBB DX, CX ;执行(DX)-(CX)-CF,结果送到DX中。 (3)减1指令: DEC opr ;(opr)←(opr)-1将操作数减1,结果送回操作数。此指令通常也用于循环程序中修改地址指针和循环次数。 例如:DEC CX ; CX中的内容减1后,送回CX DEC BYTE PTR[SI] ;将SI所指示字节单元中的内容减1后,送回该单元。

More Related