指令系统与汇编基础.ppt

上传人:牧羊曲112 文档编号:5736183 上传时间:2023-08-15 格式:PPT 页数:201 大小:1.58MB
返回 下载 相关 举报
指令系统与汇编基础.ppt_第1页
第1页 / 共201页
指令系统与汇编基础.ppt_第2页
第2页 / 共201页
指令系统与汇编基础.ppt_第3页
第3页 / 共201页
指令系统与汇编基础.ppt_第4页
第4页 / 共201页
指令系统与汇编基础.ppt_第5页
第5页 / 共201页
点击查看更多>>
资源描述

《指令系统与汇编基础.ppt》由会员分享,可在线阅读,更多相关《指令系统与汇编基础.ppt(201页珍藏版)》请在三一办公上搜索。

1、2023/8/15,1,6.1 概述,6.2 8086的寻址方式,6.3 8086的指令系统,6.4 汇编语言程序设计基础,6.5 汇编语言程序设计,2023/8/15,2,6.1 概述,6.1.1 指令及指令系统概念,指令(Instruction):是要求计算机执行特定操 作的命令,通常一条指令对应一种特定操作。指 令的执行是在计算机的CPU中完成的。,指令系统(Instruction set):计算机所能执 行的全部指令的集合组成该计算机的指令系统。不同类型的计算机具有不同的指令系统。,2023/8/15,3,6.1.2 机器指令和汇编指令格式,高级语言脱离了具体的计算机,具有通用性。,1

2、机器指令,计算机编程语言有机器语言、汇编语言及高级语言等。,机器语言与计算机的核心CPU相对应,不同类 型的计算机有其独特的机器语言指令系统;,汇编语言仅是机器语言的英文助记符表示形式,也与相应的计算机系统相对应;,2023/8/15,4,计算机只能识别二进制代码,因此计算机能执行的指令必须以二进制代码的形式表示,这种以二进制代码形式表示的指令称为指令的机器码(Machine Code)。,2汇编指令格式,一条指令一般包含操作码和操作数两部分。,操作码用来表示该指令所要完成的操作,不同的指 令用不同的操作码表示;,操作数用来描述指令的操作对象,操作数可以是立即数、寄存器和存储器,不同的指令可以

3、有一个、二个、三个或无操作数,根据操作数个数的不同指令格式分为以下几种:,2023/8/15,5,(1)零操作数指令 格式:,操作码,(2)一操作数指令 格式:,即指令中只有操作码,没有操作数,也称为无操作数指令。有两种情况使用这种指令:,一是指令中不需要任何操作数,如空操作指令、停机指令等;,二是指令的操作数是默认,如加法的ASCII码 调整、十进制调整指令等。,2023/8/15,6,其中A为存储器地址或寄存器名指令中只给出一个地址,该地址既是操作数的地址,又是操作结果的存储地址。如增量、减量指令等。,(3)二操作数指令格式:,这是最常见的指令格式。A1、A2指出两个源操作数的地址,其中一

4、个还指出存放结果的目的地址。对两个操作数完成所规定的操作后,将结果存入目的地址。,2023/8/15,7,(4)三操作数指令 格式:,(5)多操作数指令,A1、A2指出两个源操作数的地址,A3指出存放结果的目的地址。,在某些性能较好的大、中型甚至高档微小型计算机中,往往设置一些功能很强的、用于处理成批数据的指令。为了描述一批数据,指令中需要多个操作数来指出数据存放的首地址、长度和下标等信息。,2023/8/15,8,6.2 8086的寻址方式,指令的寻址方式(Addressing mode):就是指令中操作数的表示方式。,8086的寻址方式有:与数据有关的寻址和与程序转移有关的寻址。,与数据有

5、关的寻址:立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址,与程序转移有关的寻址:段内直接寻址、段内间接寻址、段间接寻址及段间间接寻址,2023/8/15,9,6.2.1 立即寻址(Immediate Addressing),?,【例6.1】MOVAL,12H 则指令执行后,(AL)=12H,立即寻址方式所提供的操作数直接存在指令中,紧跟在操作码之后,操作数作为指令的一部分存放在代码段里,这种操作数称为立即数。立即数可以是8位的或16位的,若是16位数,则高位字节存放在高地址中,低位字节在低地址中。,【例6.2】MOVDS,3456H 则指令执行后

6、,DS)=3456H,2023/8/15,10,回顾8086的寄存器,寄存器是在 CPU 中一个暂时储存数据的地方。它有点儿像存储器(DRAM),但是不像存储器这么大,寄存器只有一个、两个或四个字节的大小而已。CPU 可以对寄存器作加、减、乘、除、且、或等等运算。8086/8088 共有 14 个 16 位的寄存器,其名称都以两个英文字表示,大致可分为以下四类。,2023/8/15,11,1.通用寄存器,共有四个,其名称分别是 AX、BX、CX、DX,在汇编语言程序中大致没有太大的差别,但是其中只有 AX(accumulator,也称为累加器)可作为除法或乘法中的被除数与被乘数,当 16 位不

7、够大时,常常用 DX:AX 来表示 32 位。此外这四个寄存器,只有 BX(base register,也称为基底寄存器)可以被作为地址存取之用。CX 也称为计数寄存器(count register),用于计算循环之次数或字串处理之计数。DX也称为数据寄存器(data register),可用来存取数据。这四个寄存器也可以分成两个 8 位的寄存器来使用,例如 AX 可被分成较低的 8 位称为 AL,以及较高的 8 位 AH 来使用。其余 BX、CX、DX 也都类似。,2023/8/15,12,2.指针与索引寄存器,有五个,其名称分别是 SP、BP、IP、SI、DI。前面两个 SP(stack

8、pointer,称为堆栈指针)与(base pointer,也称为基底指针)是与堆栈(stack)有关的寄存器。堆栈是一块区域,用来暂时存放数据用,在 8086中,堆栈是由最高地址中开始存放,每次都必须存入一个字节的长度,并用一组指针,来表示堆栈已经使用到那儿了,这组指针就是 SS:SP。也就是说,当要将数据存入堆栈时,该数据应该存放在 SS:SP 所指的地址再低 2 个字节,然后 CPU 再使 SP 之内容减 2,使 SP 再指到下一个未使用的空间 调用子程序时,会预先把返回地址存入堆栈;调用中断时也是如此。BP 通常用于调用子程序时,传递参数用。,2023/8/15,13,IP(instr

9、uction pointer,称为指令指针)配合 CS 变成 CS:IP,指向将要执行的 8086/8088 地址。当 CPU 要执行程序时,必须到存储器去提取要执行的指令,而要到那一个存储器地址去提取指令呢?这时 CPU 就会到 CS:IP 指到的地址去提取。在程序中,一般是没有办法改变 CS:IP 的值,除非是跳转(jmp、jz等)指令或是调用(call、ret等)指令。SI(source index,称为来源索引寄存器)和 DI(destination index,称为目的索引寄存器)通常是用来当作地址指针,也可用作加减法。这五个寄存器,每一个都不能分开来当作两个 8 位的寄存器使用。,

10、2023/8/15,14,3.段地址寄存器,有CS、DS、ES、SS 四个,分别表示程序码(code segment register)、数据(data segment register)、附加(extra segment register)、堆栈(stack segment register)段地址用。在 DOS 系统中,每一个段地址容量只有 64KBytes。当数据段地址不够用时,就可以用附加数据段地址来补足,例如想要将一个段地址的某些内容复制到另一段地址中,就可以同时指定 DS、ES 分别表示这两个段地址。,4.程序状态字PSW,2023/8/15,15,6.2.2 直接寻址(Direc

11、t Addressing),【例6.3】MOV AX,2000H如(DS)=3000H,则指令执行情况如图6-2-1所示。执行结果为(AX)=8060H。,?,直接寻址方式指令,操作数在存储器中,指令中直接提供操作数的16位偏移地址EA(Effective address),EA紧跟在指令操作码之后。由于操作数一般存放在数据段中,所以必须先计算出操作数的物理地址,再访问存储器才能取得数据。,2023/8/15,16,注意:,+,200 0,32000,在汇编语言中,可用符号地址代替数值地址,可 以写为:MOV AX,BLOCK 或MOV AX,BLOCK,如果数据在数据段以外的其它段中,应在指

12、令中指定段跨越前缀。如:MOV AX,ES:2000H,30000,2023/8/15,17,6.2.3 寄存器寻址(Register Addressing),【例6.4】MOV AX,BX如执行前(AX)=4567H,(BX)=1234H,则执行后,(AX)=1234H,(BX)保持不变。,?,寄存器寻址的指令,操作数在寄存器中,即寄存器的内容就是操作数的数值。由于这种寻址方式操作数就在寄存器中,不需访问存储器即可取得操作数,因而速度快。可使用的寄存器有通用寄存器和段寄存器。,2023/8/15,18,6.2.4 寄存器间接寻址(Register Indirect Addressing),【

13、例6.5】MOV AX,BX如果(DS)=3000H,(BX)=2000H,则物理地址=30000H+2000H=32000H,执行情况如图6-2-2所示。,?,寄存器间接寻址方式中,操作数存放在存储器中,但操作数的有效地址EA在基址寄存器BX、BP或变址寄存器SI、DI中。操作数的物理地址为:,物理地址=16(段寄存器)+(寄存器),如果寄存器是BX、SI、DI,则段寄存器用DS,如果寄存器是BP,则段寄存器用SS。,2023/8/15,19,指令中也可指定段跨越前缀以取得其它段中的数据。如:MOV AX,ES:BX指令,则从附加段中取得数据。,执行结果为:(AX)=8060H,30000,

14、+,200 0,32000,DS,BX,2023/8/15,20,6.2.5 寄存器相对寻址(Register Relative Addressing),【例6.6】MOV AX,COUNTSI 或写为 MOV AX,COUNT+SI若(DS)=3000H,(SI)=2000H,COUNT=3000H则:物理地址=30000H+2000H+3000H=35000H,?,操作数的有效地址EA由一个基址或变址寄存器的内容和指令中给出的8位或16位的位移量(displacement)相加得到。,物理地址=16(段寄存器)+(寄存器)+位移量,2023/8/15,21,6.2.6 基址变址寻址(Bas

15、ed Indexed Addressing),【例6.7】MOV AX,BXDI 或写为:MOV AX,BX+DI 若(DS)=3000H,(BX)=1000H,(DI)=2000H,则偏移地址=1000H+2000H=3000H,物理地址=30000H+3000H=33000H,?,操作数的有效地址为基址寄存器(BX或BP)和变址寄存器(SI或DI)的内容之和。两个寄存器由指令指定。,物理地址=16(段寄存器)+(基址寄存器)+(变址寄存器),2023/8/15,22,6.2.7 相对基址变址寻址(Relative Based Indexed Addressing),【例6.8】MOV AX

16、,MASKBXSI如(DS)=3000H,(BX)=1000H,(SI)=2000H,MASK=250H,则:物理地址=30000H+1000H+2000H+250H=33250H,?,操作数的有效地址为基址寄存器(BX或BP)和变址寄存器(SI或DI)的内容及8位或16位的位移量之和。,物理地址=16(段寄存器)+(基址寄存器)+(变址寄存器)+位移量,2023/8/15,23,6.2.8 程序转移寻址,指令在顺序执行时,下一条指令的地址总是由指令指针IP自动递增得到。若程序非顺序执行,将要执行的指令的地址如何得到呢?,又分为本段内转移和非本段内(段间)转移。若在本段内转移,需要给出即将执行

17、的那条指令的偏移地址,并用它取代IP的原有内容;若在段间转移,除了要给出偏移地址取代IP 外,还要给出新的代码段的段基址取代CS中原有的内容,此时操作数作为转移地址使用,分别赋予IP和CS。,2023/8/15,24,转移地址为当前IP内容加上指令中紧跟操作码之后的相对位移量(8位或16位),即转移的有效地址以相对于当前IP值的位移量来表示,因此也被称为相对寻址。,1段内直接寻址(Intrasegment Direct Addressing),该方式适用于条件转移和无条件转移。用于条件转移时,位移量只能为8位;用于无条件转移时,位移量可为8位或16位。,有效地址为:EA=(IP)+位移量,20

18、23/8/15,25,指令的汇编语言格式表示为:JMP NEAR PTR VALUE;位移量为16位在符号地址 前加NEAR PTRJMP SHORT TABLE;位移量为8位在符号地址前加 SHORT,2段内间接寻址(Intrasegment Indirect Addressing),转移的有效地址EA是一个寄存器或一个存储器单元的内容,其内容可用寄存器寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址等寻址方式获得,用所取得的内容取代IP寄存器的原有内容。该寻址方式只能用于段内无条件转移。,2023/8/15,26,指令的汇编语言格式表示为:JMP BX JMP WORD

19、 PTRBX+COUNT 其中WORD PTR用以指定所取得的转向地址是一个字的有效地址。,3段间直接寻址(Intersegment Direct Addressing)该寻址方式在指令中直接给出了转移到的段地址和偏移地址,第一个地址为偏移地址,第二个地址为段地址,这两个地址都是16位的地址,用于取代IP和CS,从而实现段间转移。,指令的汇编语言格式表示为:JMP FAR PTR VALUE;FAR PTR是表示段间转移 的操作符,2023/8/15,27,4段间间接寻址(Intersegment Indirect Addressing),指令的汇编语言格式表示为:JMP DWORD PTRB

20、X+DI;DWORD PTR说明转向 地址需取双字。,该寻址方式用存储器中的两个连续字单元的内容作为转移到的偏移地址和段地址,来取代IP和CS寄存器中的原有内容,从而达到段间转移的目的。这里存储器单元内容的取得,可以采用寄存器寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址中的任何一种。,2023/8/15,28,6.3 8086指令系统,8086的指令系统从功能上可以分为:数据传送指令算术运算指令逻辑运算指令串处理指令控制转移指令处理机控制指令,2023/8/15,29,数据传送指令又分为四小类:通用数据传送指令累加器专用传送指令地址传送指令标志寄存器传送指令。,1通用数

21、据传送指令 通用数据传送指令中包括最基本的传送指令MOV,入栈指令PUSH和出栈指令POP以及交换指令XCHG。,6.3.1 数据传送指令,2023/8/15,30,(1)最基本的传送指令MOV(Move)指令格式:MOV 目的操作数,源操作数指令功能:将源操作数内容传送到目的操作数,源操 作数内容不变。,注意事项:目的操作数和源操作数的搭配规则,如图6-3-1 所示。,特别说明的是,只有在通用数据传送指令中段寄存器(CS除外)才可以作为操作数使用,而其他的指令是绝对不能将段寄存器作为操作数使用的。,2023/8/15,31,由上图的搭配规则可知,还需注意以下几点:立即数只能作为源操作数,而不

22、能作为目的操作数;如:,A:MOV AX,1234H,B:MOV BX,1234H,C:MOV BX,AX,D:MOV AX,BX,存储器,寄存器,立即数,E:MOV AX,BX,MOV12H,AL,MOVAL,12H,2023/8/15,32,如:MOV DI,SI,CS不能作为目的操作数,即CS的值不能随意改变;,存储器单元之间不能直接传送数据;,正确写法如下:MOV AX,SI MOV DI,AX,不允许两个段寄存器之间直接传送信息;,如:MOV CS,AX,如:MOV DS,ES,2023/8/15,33,立即数不能直接送给段寄存器,要通过其它寄存器。,目的操作数和源操作数的类型要匹配

23、。,如:MOV DS,1234H,正确写法如下:MOV AX,1234H MOV DS,AX,如:MOV AX,BL MOV AL,DX MOV AL,BL MOV AX,DX,2023/8/15,34,在给SS用MOV指令赋值时,要紧接着给SP赋值,不能在修改SS和SP指令之间插入其它指令,系统在执行这两条语句时,自动禁止外部中断,以防止堆栈空间变动过程中出现中断,不影响标志寄存器的值。,?,【例6.9】执行下面程序段:MOV AX,5000H;(AX)=5000H MOV DS,AX;(DS)=5000H MOV 5000H,AL;(55000H)=00H MOV BX,AX;(BX)=5

24、000H MOV BX,56H;(55000H)=56H MOVBX+1,1234H;(55001H)=34H,(55002H)=12H MOV CX,BX;(CX)=3456H,2023/8/15,35,(2)入栈指令PUSH(Push Word Onto Stack)和 出栈指令POP(Pop Word Off Stack),【例6.10】若(AX)=1234H,(BX)=5678H,(SP)=1056H,执行下面四条指令:PUSH AX PUSH BX POP AX POP BX,?,指令功能:PUSH指令是把源操作数送入堆栈的顶部 POP指令是把栈顶内容弹出到目的操作数,指令格式:PU

25、SH 源操作数 POP目的操作数,2023/8/15,36,指令执行情况如图6-3-2所示:,图6-3-2 例6-10的执行过程,SP,SP,通过如上执行过程可知,执行后,(AX)=5678H,(BX)=1234H,(SP)=1056H,所以这四条指令完成的功能是交换寄存器AX和BX的内容。,2023/8/15,37,入栈操作是先改变指针SP再入栈;出栈操作是先出栈再改变指针SP。,入栈是SP逐渐靠近基地址的过程,SP始终指向最后 入栈所在地址单元;出栈是SP逐渐远离基地址的过 程,SP始终指向即将出栈的地址单元。,对栈操作时低字节放在低地址单元,高字节放在高 地址单元。,堆栈操作符合后进先出

26、(或先进后出)的原则。,注意事项:,2023/8/15,38,堆栈位置由SS决定,堆栈容量由SP决定,堆栈容量即为SP的初值与SS之间的距离,8086堆栈容量为64K。,堆栈指令只能对字操作而不能对字节进行操,堆栈指令的操作数可以是寄存器和存储器,但CS 只能作为源操作数入栈,而不能作为目的操作数从 堆栈中弹出一个值到CS寄存器。,如:PUSHBL POPDH PUSHSI POPES,2023/8/15,39,指令格式:XCHG 目的操作数,源操作数指令功能:将目的操作数内容和源操作数内容 相互交换。,【例6.11】若(AX)=1234H,(BX)=5678H,执行下面指令:XCHGAX,B

27、X 则执行后,(AX)=5678H,(BX)=1234H,【例6.12】若(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H,执行指令:XCHG BX,BP+SI 则执行后,(BX)=4154H,(2F246H)=6F30H,?,(3)交换指令XCHG(Exchange),2023/8/15,40,注意事项:目的操作数和源操作数的搭配规则,如下图:,段寄存器不能相互交换,寄存器,A:XCHG BX,AX,B:XCHG AX,BX,存储器,2累加器专用传送指令 在8086指令系统中,有两类指令是专门通过累加器来执行的,即输入/输出

28、指令和换码指令。,C:XCHG AX,BX,目的操作数和源操作数位数要统一,2023/8/15,41,(1)输入指令IN和输出指令OUT 指令格式:IN 累加器,端口地址 OUT 端口地址,累加器,指令功能:IN指令是从I/O端口读入信息到累加器 OUT指令是从累加器中输出信息到I/O端口指令用途:所有I/O端口与CPU之间的通信都由IN和 OUT指令来完成。,注意事项:累加器可以是16位的AX或8位的AL 分为直接输入输出指令和间接输入输出指令。,2023/8/15,42,直接输入输出指令在指令中直接指定端口号,寻址范围为0255,共256个端口;间接输入输出指令是先把端口号放到DX寄存器中

29、,即在指令中用DX代替端口号,寻址范围为065535,共65536个端口。,【例6.13】IN AX,70H;将70H、71H两个端口的值读入到AX IN AX,DX;将DX、DX+1所指两个端口的一个字读入 到AX OUT70H,AL;将AL中的一个字节输出到70H端口 OUTDX,AL;将AL中的一个字节输出到DX所指的端口,?,2023/8/15,43,【例6.14】若(90H)=12H,(91H)=34H,执行下面指令:INAX,90H 则执行后,(AX)=3412H,【例6.15】若(AL)=10H,(DX)=2000H,执行下面指令:MOVDX,2000H OUTDX,AL 则执行

30、后,(2000H)=10H,?,2023/8/15,44,指令格式:XLAT 符号地址 或 XLAT 指令功能:将一种代码转换成另一种代码。,【例6.16】若(BX)=0050H,(AL)=0BH,(DS)=8000H,(8005BH)=30H 执行指令:XLAT 则执行后,(AL)=30 执行情况如图6-3-4所示:,?,存储器执行操作:BX+AL AL,即将表格的首地址预先存到BX中,要查的表中数据距表首地址的位移量要预先存到AL寄存器中,根据BX和AL的内容将找到的数送到AL寄存器中。,(2)换码指令XLAT(Translate),2023/8/15,45,80050H,8005BH,(

31、AL)=0BH,BX,30H,图6-3-4 例6-16的执行过程,3地址传送指令 地址传送指令完成把地址传送到指定寄存器的功能,地址传送指令处理的是变量的地址,而不是变量的值或变量的内容。在8086指令系统中,有3条专用于传送地址的指令:取有效地址指令LEA,将地址指针送寄存器和DS指令LDS,将地址指针送寄存器和ES指令LES。,2023/8/15,46,指令格式:LEA 目的操作数,源操作数 指令功能:将源操作数的有效地址送到目的操作数中 注意事项:源操作数必为内存单元地址或符号地址,目的操作数必为一个16位的通用寄存器。,【例6.17】若(BX)=1200H,(SI)=0300H,执行下

32、面指令:LEADI,BX+SI+0100H 则执行后,(DI)=1600H,?,(1)取有效地址指令LEA(LOAD EFFECTIVE ADDRESS),2023/8/15,47,指令格式:LDS 目的操作数,源操作数指令功能:将源操作数指定的4个字节的地址指针(其中包括一个段地址和一个偏移量)传送到指令指定的寄存器及DS寄存器中,该指令常指定的寄存器一般为SI。,操作过程:源操作数 指定的寄存器SI 源操作数+2 DS,【例6.18】若(DS)=2000H,(20060H)=3000H,(20062H)=4000H,执行下面指令:LDS SI,60H 则执行后,(SI)=3000H,(DS

33、)=4000H,?,(2)地址指针送寄存器和DS指令LDS(Load Data Segment Register With Pointer),2023/8/15,48,指令格式:LES 目的操作数,源操作数 指令功能:将源操作数指定的4个字节的地址指针(其中包括一个段地址和一个偏移量)传送到指令指定的寄存器及ES寄存器中,该指令常指定的寄存器一般为DI。,操作过程:源操作数 指定的寄存器DI 源操作数+2 ES,?,【例6.19】若(DS)=5000H,(BX)=0200H,(50200H)=6000H,(50202H)=7000H,执行下面指令:LESDI,BX 则执行后,(DI)=6000

34、H,(ES)=7000H,(3)地址指针送寄存器和ES指令LES(Load Extra Segment Register With Pointer),2023/8/15,49,(1)标志送AH指令LAHF(Load AH With Flags)指令格式:LAHF 指令功能:将标志寄存器的低8位传送到AH中。传送 后,AH寄存器的D1、D3、D5位没有意义,如下图。,(2)AH送标志寄存器指令(Store AH Into Flags)指令格式:SAHF 指令功能:与LAHF相反,将AH寄存器的内容传送 到标志寄存器的相应位。,4标志传送指令,2023/8/15,50,指令格式:PUSHF 指令功

35、能:将标志寄存器的值推入堆栈顶部,但标 志寄存器的值不变,且使栈指针SP的值减2。注意事项:PUSHF一般用在子程序和中断处理程序之 首,用来保存主程序标志。,(4)标志出栈指令POPF(Pop The Flags)指令格式:POPF 指令功能:从堆栈中弹出一个字到标志寄存器,即 标志寄存器的值改变,且使栈指针SP的值加2。注意事项:POPF一般用在子程序和中断处理程序之 尾,用来恢复主程序标志。,(3)标志进栈指令PUSHF(Push The Flags),2023/8/15,51,6.3.2 算术运算类指令,1加法指令,(1)不带进位加法指令ADD(Addition)指令格式:ADD 目的

36、操作数,源操作数指令功能:源操作数内容+目的操作数内容目的操 作数注意事项:目的操作数和源操作数的搭配规则与MOV指令相同。对六个状态标志均有影响。,?,【例6.20】若(AL)=8EH,(BL)=0D6H,执行下面指令:ADD AL,BL 则执行后,(AL)=64H,且CF=1、AF=1、ZF=0、SF=0、PF=0、OF=1,2023/8/15,52,指令格式:ADC 目的操作数,源操作数指令功能:源操作数内容+目的操作数内容+CF 内容目的操作数注意事项:这条指令一般用在多字节加法中,从第 二字节以后的加法使用本条指令,?,【例6.21】若(AL)=0C8H,(BL)=5FH,CF=1,

37、执行下面指令:ADCAL,BL 则执行后,(AL)=28H 且CF=1、AF=1、ZF=0、SF=0、PF=1、OF=0,(2)带进位加法指令ADC(Add With Carry),2023/8/15,53,MOV AX,FIRSTADD AX,SECONDMOV THIRD,AXMOV AX,FIRST+2ADC AX,SECOND+2MOV THIRD+2,AX,【例6.22】若有两个四字节的数,分别存放在 FIRST和SECOND开始的存储区中,存 放时高字节在高地址中,低字节在 低地址中,实现这两个数相加,并 将结果保存在THIRD中。程序段如下:,?,2023/8/15,54,指令格

38、式:INC 操作数 指令功能:操作数内容+1操作数 其中,操作数可以是寄存器和存储器。注意事项:INC指令不影响CF标志。INC指令主要用于修改地址指针和循环中的计数次数。,?,【例6.23】若(CX)=6789H,执行下面指令:INC CX 则执行后,(CX)=678AH,(3)加1指令INC(Increment Destination By 1),2023/8/15,55,2减法指令 主要包括:不带借位减法指令SUB,带借位减法指令SBB,减1指令DEC,求补指令NEG,比较指令CMP。,(1)不带借位减法指令SUB(Subtract)指令格式:SUB 目的操作数,源操作数指令功能:目的操

39、作数内容源操作数内容目的 操作数注意事项:目的操作数和源操作数的搭配规则与MOV指令相同。对六个状态标志均有影响。,2023/8/15,56,【例6.24】若(AL)=7CH,(BL)=0E5H 执行下面指令:SUBAL,BL 则执行后,(AL)=97H 且CF=1、AF=0、ZF=0、SF=1、PF=0、OF=1,?,(2)带借位减法指令SBB(Subtract With Borrow)指令格式:SBB 目的操作数,源操作数指令功能:目的操作数内容源操作数内容CF 内容目的操作数 注意事项:这条指令一般用在多字节减法中,从 第二字节以后的减法使用本条指令。,2023/8/15,57,【例6.

40、25】有两个四字节的数,分别存放在数据段中偏移地址为1000H与2000H开始的存储单元中,存放时高字节在高地址中,低字节在低地址中,实现这两个数相减,并将结果保存在3000H开始的单元中。程序段如下:,?,MOVAX,1000H SUBAX,2000H MOV3000H,AX MOVAX,1002H SBBAX,2002H MOV3002H,AX,2023/8/15,58,指令格式:DEC 操作数 指令功能:操作数内容1操作数 其中操作数可以是寄存器和存储器。注意事项:DEC指令不影响CF标志。DEC指令主要用于修改地址指针和循环中的计数次数。,(4)求补指令NEG(Negate)指令格式:

41、NEG 操作数 指令功能:0操作数操作数,或将操作数按位 取反再加1。,(3)减1指令DEC(Decrement Destination By 1),2023/8/15,59,NEG指令影响标志位CF、AF、ZF、SF、PF、OF如果操作数的值为128(即80H)或32768(即8000H),则执行NEG指令后,结果不变,但使OF置1。NEG指令通常使CF为1,只有当操作数为0时,才使CF为0。,【例6.26】若(AL)=34H,执行下面指令:NEG AL 则执行后,(AL)=0CCH 且CF=1、AF=0、ZF=0、SF=1、PF=1、OF=0,?,注意事项:,2023/8/15,60,指令

42、格式:CMP 目的操作数,源操作数 指令功能:目的操作数内容源操作数内容,但 结果不回送,只是使结果影响标志 位,用以比较两数大小。注意事项:通过ZF标志来判断两数是否相等。若ZF=1则相等;ZF=0则不等。对于无符号数,通过CF标志来判断两数大小。若CF=0,则被减数大于减数;若CF=1,则被减数小于减数。,(5)比较指令CMP(Compare Two Operands),2023/8/15,61,对于有符号数,通过OF和SF两个标志来判断两数的大小。若OF和SF状态相同,则被减数大于减数;若OF和SF状态不同,则被减数小于减数。,【例6.27】判断AX与BX的内容是否相等,若相等则(CX)

43、=1,否则(CX)=0,编写程序段如下:CMP AX,BX JZ L1 MOV CX,0 JMP L2 L1:MOV CX,1 L2:HLT,2023/8/15,62,乘法指令包括无符号数乘法指令MUL和带符号数乘法指令IMUL。乘法指令中,有一个操作数总是放在AL(8位)或AX(16位)中,乘得结果总是放在AX(8位)或DX、AX(16位)中,其中DX存放高位字,AX存放低位字。,(1)无符号数乘法指令MUL(Unsigned Multiply)指令格式:MUL 源操作数 指令功能:字节操作数为(AL)源操作数内容(AX)字操作数为(AX)源操作数内容(DX、AX),3乘法指令,2023/8

44、/15,63,MUL指令影响CF、OF标志,而对AF、PF、SF、ZF是不确定的,因此这四个标志位无意义。如果乘积的高一半为0,即字节操作的(AH)或字操作的(DX)为0,则CF、OF均为0;否则CF、OF均为1。,(2)带符号数乘法指令IMUL(Signed Multiply)指令格式:IMUL 源操作数 指令功能:字节操作数为(AL)源操作数内容(AX)字操作数为(AX)源操作数内容(DX、AX),注意事项:,2023/8/15,64,MUL指令影响CF、OF标志,而对AF、PF、SF、ZF是不确定的,因此这四个标志位无意义。如果乘积的高一半是低一半的符号扩展,则CF、OF均为0;否则CF

45、、OF均为1。,?,【例6.28】若(AL)=0B4H,(BL)=11H 执行指令:MUL BL 则执行时,只需将(AL)和(BL)直接 相乘即可,执行后得(AX)=0BF4H,且 CF=OF=1,注意事项:,2023/8/15,65,则执行时,要将(AL)求补后再和(BL)相乘,乘得结果为050CH,再将其求补得(AX)=0FAF4H,且CF=OF=1,?,【例6.29】实现两个字相乘的程序段如下:MOV AX,FIRST MUL SECOND MOV THIRD,AX MOV FOURTH,DX,执行指令:IMUL BL,2023/8/15,66,除法指令包括无符号数除法指令DIV和带符号

46、 数除法指令IDIV以及符号扩展指令CBW、CWD。,(1)无符号数除法指令DIV(Unsigned Division)指令格式:DIV 源操作数指令功能:字节操作数:(AL)(AX)/(源操作数)的商(AH)(AX)/(源操作数)的余数 字操作数:(AX)(DX,AX)/(源操作数)的商(DX)(DX,AX)/(源操作数)的余数,4除法指令,2023/8/15,67,DIV指令要求除数只能是被除数的一半字长。当被除数为16位时,除数应为8 位;当被除数为32位时,除数应为16位。当被除数为16位时,应存放在AX中,除数为8位,可存放在寄存器或存储器中(不能为立即数),得到的8位商放在AL中,

47、8位余数放在AH中;当被除数为32位时,应存放在DX(高位)和AX(低位)中,除数为16位,可存放在寄存器或存储器中(不能为立即数),得到的16位商放在AX中,16位余数放在DX中。,注意事项:,2023/8/15,68,DIV指令对标志位CF、AF、ZF、SF、PF、OF都是不确定的,即没有意义。被除数位数和除数位数相同时,要对被除数进行扩展,对于无符号数来说,只需使AH或DX内容为0即可。,(2)带符号数除法指令IDIV(Signed Division)指令格式:IDIV 源操作数 指令功能:与DIV指令相同。注意事项:与DIV指令类似,但操作数必须是带符号数,商和余数也都是带符号数,且余

48、数的符号和被除数的符号相同。,2023/8/15,69,被除数位数和除数位数相同时,要对被除数进行扩展,对于有符号数来说,AH和DX的扩展就是低位字节或低位字的符号扩展,即把AL中的最高位扩展到AH的8位中,或把AX中的最高位扩展到DX的16位中。在8086中,有专用于有符号数扩展的指令CBW和CWD。,当字节操作时,被除数高8位的绝对值大于除数的绝对值(即商超过了8位);或当字操作时,被除数高16位的绝对值大于除数的绝对值(即商超过了16位);或当除数为0时,就产生0号中断进行处理。【0号中断(除数为0)、1号中断(单步执行程序)、4号中断(运算溢出)、3号中断(断点处理)】,2023/8/

49、15,70,指令格式:CBW 指令功能:将AL中的内容进行符号扩展。若(AL)的 最高位为0,则(AH)0;若(AL)的最高 位为1,则(AH)0FFH。注意事项:当遇到两个字节相除时,要先执行CBW指令,以便产生一个16位的被除数。该指令不影响标志位。,(3)字节转换为字指令CBW(Convert Byte To Word),2023/8/15,71,指令格式:CWD 指令功能:将AX中的内容进行符号扩展。若(AX)的 最高位为0,则(DX)0;若(AX)的最高 位为1,则(DX)0FFFFH。注意事项:当遇到两个字相除时,要先执行CWD指令,以便产生一个长为32位的被除数。该指令不影响标志

50、位。,(4)字转换为双字指令CWD(Convert Word To Double Word),2023/8/15,72,【例6.30】以BUFFER开始的缓冲区中,前两个字节是一个16位带符号的被除数,接着两个字节是一个16位带符号的除数,再接着的四个字节分别存放商和余数。程序段如下:LEABX,BUFFER MOVAX,BX CWD IDIV BX+2 MOV BX+4,AX MOV BX+6,DX,?,2023/8/15,73,在计算机中,可用4位二进制码表示1个十进制码,这种代码叫BCD码。BCD码有两类:一类叫压缩的BCD码,所谓压缩,就是用1个字节表示2位BCD码;另一类叫非压缩的B

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号