微机原理第3章 全套课件_第1页
微机原理第3章 全套课件_第2页
微机原理第3章 全套课件_第3页
微机原理第3章 全套课件_第4页
微机原理第3章 全套课件_第5页
已阅读5页,还剩202页未读 继续免费阅读

下载本文档

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

文档简介

戴小文 邮箱:,第三章 8086/8088的寻址方式和指令系统,2,本章内容,3,第一节 指令的基本格式,机器指令:以二进制数即机器码形式存在的指令,操作码(OP)指明计算机所要执行的操作类型。,一、机器指令的基本格式,操作数(OD)指明指令操作对象或操作对象的 地址信息。,机器指令基本格式:,4,二、8086/8088符号指令的书写格式,符号指令:用指令助记符来书写的指令,与机器码指令一一对应。,注意:操作数字段可以是操作数本身,也可以是操作数地址,或者操作数地址的运算方法,还可以是指向操作数地址的指针或其它的有关操作数的信息。,5,目的操作数(dst)、源操作数(src),操作数的分类:,8位操作数、16位操作数,操作数的数量:,0个、1个、2个,操作数的可能存放位置:,立即数,寄存器操作数,存储器操作数,二、8086/8088符号指令的书写格式,6,第二节 8086/8088的寻址方式,注意:要说明一条指令为何种寻址方式,应就目的操作数和源操作数分别加以说明。,指令的寻址方式分类:,7,例如:MOV AX, 1000H,操作数直接包含在指令中,它是一个8位或16位的常数,也叫立即数。立即数作为指令的一部分,紧跟在操作码之后,存放在代码段内。,一、立即数寻址,注意:在任何指令中,目的操作数都不能采用立即数寻址方式。,8,立即数寻址方式的特点:,执行速度快 主要用来给寄存器或存储器赋初值。,例如: MOV SS , AX,操作数包含在CPU内部的8位或16位寄存器中, 指令直接给出寄存器的名称。,二、寄存器寻址,16位寄存器:AX,BX,CX,DX,SI,DI,SPBP,8位寄存器:AH, AL,BH,BL,CH,CL,DH,DL,9,源操作数的长度必须与目的操作数一致,否则会出错。,例如: MOV AX , BL,注意:, CS和IP不能做目的操作数。,例如: MOV CS,AX, 若源操作数为立即寻址,则目的操作数不能是段寄存器。,例如: MOV DS,1234H,寄存器寻址方式的特点:执行速度快,10,三、固定(隐含)寻址, PUSH DS,例如:目的操作数为固定寻址的两个例子:, MUL BL,某些指令的操作数有固定的存放位置(寄存器或内存中),且其存放位置的信息被隐含在指令中。,另如:DAA、POP DX、PUSHF等,11,四、存储器寻址,操作数一般位于代码段之外的数据段、堆栈段或附加段的存储器中,指令中给出的是存储器单元的地址或产生存储器单元地址的信息。,存储器寻址的特点:,段基值一般不直接在指令中给出,而采用默认规定;,指令中采用逻辑地址来寻址操作数;,指令中一般只给出有效地址(EA)或其计算方法;,所寻址单元的物理地址,12,操作数所在内存单元的16位有效地址(EA)直接由指令给出。有效地址紧跟在操作码之后存放在代码段中;如果没有段超越前缀,则操作数本身默认位于数据段,段基值在DS中;否则位于段超越前缀指定的段中。,1. 直接寻址,若要强制指定操作数所在的段,可采用段超越前缀。,EA2000H,PA16DS2000H,则,四、存储器寻址,13,EA2000H,PA16DS2000H,则,EA2000H,PA16ES2000H,则,当操作数位于数据段以外的其它段时,应在操作数地址前使用段超越前缀指出段寄存器名。,四、存储器寻址,14,MOV AX,2000H指令的解释过程:,BIU取指令机器码A1H、00H、20H,EU分析操作码A1H后得知本指令功能为直接寻址的数据传送指令;,BIU计算操作数所在内存单元的物理地址PA16DSEA, BIU执行读操作,从PA地址单元取得数据送到AX寄存器。,四、存储器寻址,15, 在直接寻址方式下,默认操作数位于数据段中,缺省的段基值由DS给出。,注意:,PA=16 DS +AREA2, 在小汇编语言程序中,有效地址EA用数值表示,被包括在方括号 之中,称为数值地址;在宏汇编语言程序中,有效地址用符号表示,称其为符号地址。,例如:MOV AX,AREA2;,四、存储器寻址,16,直接寻址方式常用于寻址存储器中的单个操作数。,操作数的有效地址EA为基址寄存器BX、BP或变址寄存器SI、DI中的任一个寄存器的内容,称这四个寄存器为间址寄存器 。,2. 寄存器间接寻址,四、存储器寻址,17, 当指令指定BX、SI、DI为间址寄存器时,则操作数在数据段中,DS中内容为段基值。操作数的物理地址为:, 指令中若指定BP为间址寄存器,则操作数在堆栈段中。这种情况下,用SS寄存器内容作段基值,操作数的物理地址为:,PA16SSBP,段基值的确定采用默认规定:,四、存储器寻址,18,例如:MOV AX, SI ;,PA16DSSI,四、存储器寻址,19,在指令中,也可指定段超越前缀来取得其它段中的操作数。,注意:,例如:MOV AX,ES:BX,采用寄存器间接寻址方式,可以通过改变间址寄存器BX、BP、SI、DI中的内容,来对一段地址连续的存储器单元进行存取操作。因此,此方式常用于寻址一维数组或表格。,在处理数组时,SI常用于源数组的变址寻址;DI则用于目的数组的变址寻址。,四、存储器寻址,20,在指令中,也可指定段超越前缀来取得其它段中的操作数。,注意:,例如:MOV AX,ES:BX,采用寄存器间接寻址方式,可以通过改变间址寄存器BX、BP、SI、DI中的内容,来对一段地址连续的存储器单元进行存取操作。因此,此方式常用于寻址一维数组或表格。,在处理数组时,SI常用于源数组的变址寻址;DI则用于目的数组的变址寻址。,四、存储器寻址,21,3. 寄存器相对寻址,指定由间址寄存器BX,BP,SI,DI的内容及一个8位或16位的位移量(DISP)共同进行间接寻址,操作数的有效地址EA等于间址寄存器内容和位移量之和,结果按16位归算,即,22, 指令指定BX、SI、DI为间址寄存器时,则操作数在数据段中,用DS寄存器中内容做段基值。操作数的物理地址为:, 指令中若指定BP为间址寄存器,则操作数在堆栈段中。这种情况下,用SS寄存器中内容作段基值,操作数的物理地址为:,段基值的确定采用默认规定 :,23,例如 MOV AX,AREASI ;位移量用符号AREA代表的值表示。,则 PA=DS16+AREA+SI,其寻址的示意图如下图所示:,24,而 MOV AX,AREABP;,PA=SS16+AREA+BP,采用寄存相对寻址的指令,也可使用段超越前缀。,注意:,例如: MOV DL,DS:COUNTBP,寄存器相对寻址通常也用来访问一段地址连续的存储器单元(如数组)中的元素,其中位移量用于定位数组的起点,间址寄存器的值用于选择数组中的某个元素。,25,4. 基址变址寻址,段基值的确定采用默认规定:,当用BX为基址寄存器时:,存储器操作数的有效地址EA由指定的一个基址寄存器(BX或BP)和一个变址寄存器( SI或DI)的内容之和确定,结果按16位归算,即,26,例如: MOV AX,BXSI,或写为: MOV AX,BX+SI,例如 DS2000H,BX0020H,SI10FEH,,则,EA BXSI 0020H10FEH,PA2000H16EA2111EH,111EH,27,当用BP为基址寄存器时,例如: MOV AX,BPSI,或写为: MOV AX,BP+SI,则 EA BP+SI,PASS16EA,28, BX可与SI或DI组合,BP也可与SI或DI组合,但BX不可与BP组合, SI不可与DI组合。即不允许将两个基址寄存器和两个变址寄存器组合在一起寻址。, 基址变址寻址方式同样适合数组或表格的处理,由于基址和变址寄存器中的内容都可以修改,因而在处理二维数组时特别方便。,注意:,例如: MOV AX,BXBP,MOV AX,SIDI, 基址变址寻址方式也可使用段超越前缀;,例如: MOV CX,ES:BXSI,29,5. 相对的基址变址寻址,在基址变址寻址基础上,再加上个8位或16位的位移量,共同确定有效地址EA,其他规定与基址变址寻址方式相同。其物理地址计算公式如下:,或:,30,例如: MOV AX,AREABPSI,或写为: MOV AX,AREA BPSI,也可写为: MOV AX,BXSPAREA,若设SS4000H,BP1000H,SI2000H,AREA0204H,则源操作数的物理地址为:,PA40000H(1000H2000H0204H) 43204H,显然,寻址的是堆栈段;,31,MOV BP,SP MOV AX,BP ;寻址栈顶单元 或MOV AX,DISPBP ;寻址栈中其他单元,PUSH、POP;寻址栈顶单元,存储器寻址:,固定寻址:,注意: 对于堆栈段的寻址,有两种方法:,或MOV AX,DISPBPSI,五、固定寻址,32,数据串操作指令所采用的寻址方式,应用了一种隐含的变址寄存器寻址。用源变址寄存器SI寻址源串,用目的变址寄存器DI寻址目的串。,MOVSB ;隐含使用SI和DI分别指向源串和目的串,实现字节串的传送 MOVSW ;隐含使用SI和DI指向源串和目的串,实现字串的传送,例如:,6. 串寻址,五、固定寻址,33,当8086采用独立编址的I/O端口时,可有64K个字节端口或32K个字端口,用专门的IN和OUT指令访问。I/O端口寻址只用于这两种指令中。,直接端口寻址方式能够寻址的端口地址范围为00H FFH,端口数为0255个。,又称为长格式的I/O指令。,1. 直接端口寻址,六、I/O端口寻址,34,IN AL,50H;字节输入指令,将50H端口的字节输入到AL。 IN AX,60H;字输入指令,将60H端口的数据输入到AL,61H端口的数据输入到AH。,例如:,六、I/O端口寻址,35,2. 寄存器间接端口寻址,寄存器间接端口寻址方式能够寻址的端口地址范围为00000FFFFH,端口数为216个。当端口地址256时,只能采用寄存器间接端口寻址。,又称为短格式的I/O指令。,先把端口号放到寄存器DX中,然后再进行间接寻址。,六、I/O端口寻址,36,例如:,MOV DX,383H ;将端口号383H放入DX。,OUT DX,AL;将AL中的内容输出到DX所指 的端口(383H)中。,六、I/O端口寻址,37,1. 在未加段超越前缀时,方括号 内若包含BP,则隐含段寄存器为SS,否则为DS。,2. 只有BX、BP、SI、DI这四个寄存器可以出现在 内,其他寄存器不能。,3. 方括号有相加的含义,下面几种写法都是等价的:,七、8086CPU寻址方式小结,38,4. 一条指令中的源操作数与目的操作数可使用不同的寻址方式,所以要说明一条指令的寻址方式,需就源操作数、目的操作数分别加以说明。,5.若操作数为存储器操作数,在不太清楚它为那一小类时,可统称为存储器寻址方式,并写出其EA和PA。,39, 数据传送类; 算术运算类; 逻辑运算与移位类; 串操作类; 控制转移类; 处理器控制类。,第三节 8086/8088指令系统,8086/8088指令系统包含133条基本指令这些指令按功能可分为六类:,40,一些符号的含义:,R 通用寄存器。,如果是8位操作,则表示是AH、AL、BH、BL、CH、CL、DH、DL; 若是16位操作,则表示是AX、BX、CX、DX、SP、BP、SI、DI。,M 存储器操作数。 port 输入输出(I/O)端口,端口号255。,段R 段寄存器CS、DS、ES、SS。,41,Im 8位或16位立即数。 src 源操作数 dst 目的操作数。 ( ) 用来表示存储单元或I/O端口中的内容。,disp 8位或16位位移量,在汇编语言中常用符号地址来表示。,42,一、数据传送(Data Transfer)类指令,特点: 含两个操作数; 除SAHF和POPF指令外,数据传送指令不影响标志寄存器内容。,功能: 实现CPU内部寄存器之间、CPU和存储器之间以及CPU和I/O端口之间的数据传送。,注意:数据传送类指令不能在存储器单元间进行数据传送!,43,1. 通用传送指令,(1) MOV 传送指令 指令格式: MOV dst ,src ;dst src 指令功能: 寄存器(R) 寄存器(R); 寄存器(R) 段寄存器(段R); 寄存器(R) 立即数(Im); 存储器(M) 立即数(Im); 寄存器(R) 存储器(M); 段寄存器(段R) 存储器(M)。,44,MOV AX,BX ;BX中16位数据传送到AX MOV SI,BP ;BP中16位数据传送到SI MOV AH,BL ;BL中8位数据传送到AH, RR传送实例,MOV DS,AX ;AX中16位数据传送到DS MOV AX,ES ;ES中16位数据传送到AX, R 段R 传送实例,1. 通用传送指令,45, R Im传送实例,MOV CL,* ;执行后CL2AH(*的ASCII码),MOV AX,03FFH ;执行后AX03FFH MOV SP,2000H ;执行后SP2000H MOV BX,1000 ;执行后BX03E8H MOV SI,057BH ;执行后SI057BH,注:字符串用 括起来,表示该字符串的ASCII码。西文文本可采用ASCII码存储 。,1. 通用传送指令,46, M 立即数Im,MOV WORD PTR2000H,6789H ;执行后(2000H)89H,(2001H)67H MOV WORD PTRSI,1234H ;立即数1234H 送DS段SI和SI+1所指的两存储单元,注: 运算符 PTR 用于修改存储器操作数的类型属性,如例中的 WORD PTR2000H 将2000H单元开始的连续两个单元定义为字变量。,1. 通用传送指令,47, R M传送实例,MOV AL,BUFFER ;将DS段BUFFER单元 的内容送AL MOV AX,SI ;将DS段SI和SI+1所指单元 的内容送AX MOV DI,CX ;将CX的内容送DS段DI和 DI+1 所指的存储单元 MOV SI,BLOCKBP ;将SS段EA为 BP+BLOCK字单元的内容送SI,1. 通用传送指令,48, 段RM传送实例,MOV DS,2000H ; MOV BXSI,CS ; MOV DS,DATABX+SI MOV DESTBP+DI,ES ;,将2000H和2001H两存储 单元的内容送DS。,将CS内容送DS段中BX+SI所指的字存储单元。,;将DS段BX+SI+DATA 所指的字单元的内容送DS。,将ES内容送SS段BP+DI+DEST所指的字存储单元。,1. 通用传送指令,49, 操作数的类型要匹配,要么8位,要么16位,这决定于R是8位还是16位,也决定于立即数的形式。 例如: MOV BX,AL MOV CL,1234H MOV CX,12H; 高字节自动补0,对于MOV指令的使用,有几点需要注意:,立即数送存储器时,必须在存储器操作数前加属性修改运算符,指明存储器操作数的类型。,MOV BYTE PTR2000H,12H,50, MOV指令中的dst和src不能同时为M。,那么如何实现两存储单元间的信息传送呢?,以R 为桥梁 使用串操作指令,两种方法:,51, 不允许用立即数作dst。, 不能用CS和IP作目的操作数,CS和IP的内容可以了解,但不能随便修改。,例如:MOV DS,SS , 不允许在段寄存器之间直接传送信息。, 不能向段寄存器送立即数。,例如:对DS赋初值,可通过下面两条指令实现,将段基值DATA通过AX赋给DS,MOV DS,AX,MOV AX,DATA ;,均需以R 为桥梁。,52,(2)堆栈操作指令,入栈指令格式: PUSH src 功能: SP SP-2 (SP) src,出栈指令格式: POP dst 功能: dst (SP) SP SP+2,53, CPU通用寄存器入出栈(PUSH/POP R),根据操作数类型的不同,入栈和出栈指令又可分为四类:, 段寄存器入出栈(PUSH/POP 段R),(2)堆栈操作指令,54, 存储器单元入出栈(PUSH/POP M),例如:, 标志F的内容也可以入出栈:,POP 2000H,POPF,PUSH SI,PUSHF,例如:,入栈和出栈指令用于保存或恢复数据,或用于转移或中断时保护现场和恢复现场。,(2)堆栈操作指令,55,堆栈指令使用注意事项:, 8086/8088堆栈操作总是以字为单位进行; 堆栈操作指令中,有一个操作数是隐含了的,这个操作数就是SP指示的栈顶存储单元。另一个操作数可以是R、段R、存储器(可使用各种存储器寻址方式)或标志寄存器; CS寄存器可进栈,但不能随意弹出一个数据到CS。 8086/8088栈顶是所谓的实栈顶;,(2)堆栈操作指令,56, POPF执行后,要影响F的当前状态。, 在使用堆栈操作保存多个寄存器内容和恢复多个寄存器时,要按“先进后出”原则来组织进栈和出栈的顺序。 堆栈的容量有限,因此进栈和出栈要成对出现,否则将有数据残留在堆栈中,时间一长,堆栈会满的!,(2)堆栈操作指令,57,例 利用堆栈指令实现 AX BX CX,解: PUSH AX PUSH BX PUSH CX POP AX POP CX POP BX,进栈,出栈,没有设中间变量,即完成了AX、BX和CX的循环交换。,(2)堆栈操作指令,58,(3)交换指令(Exchange),指令格式: XCHG dst,src 功能: dst src,例如:,XCHG BX,CX ;BX与CX间进行字交换。,XCHG DX ,2000H,;DX存储器DS段中偏移地址为2000H的字单元。,可实现CPU内部R之间,或内部R与M之间的内容(字节或字)交换;,59,需要通过累加器(AX)来执行数据传送的指令.,2. 累加器专用传送指令,使用注意事项:, dst 和src不能同时为存储器操作数M;, 任何一个操作数都不能使用段寄存器和IP,也不能使用立即数。,XCHG SI0400H ,AX,;AX 存储器DS段中偏移地址为 SI0400H的字单元。,(3)交换指令(Exchange),60,(1)输人输出指令,长格式I/O指令,如:IN AL,PORT 短格式I/O指令,如:IN AL,DX 使用I/O指令时应注意: 这类指令只能用累加器AL/AX作I/O操作的机构,不能用其它寄存器; 长格式的I/O指令,PORT范围为000FFH,大于此范围要用短格式; 在使用短格式I/O指令时,应先将端口地址赋给DX,而且只能用DX。,2. 累加器专用传送指令,需要通过累加器(AX)来执行数据传送的指令.,61,(2) 换码(TranslateTable)指令,格式: XLAT,功能: 将数据段中偏移地址为BX+ AL的单元的数据送AL。, 隐含寻址; 常用于简单的代码转换。BX中存放代码表首单元的偏移地址,AL中存放待查代码的序号。,特点:,2. 累加器专用传送指令,62,首先在存储器数据段中建立十六进制数的ASCII码表,,30,31,32,.,39,41,42,.,45,46,.,42000H+0H,42000H+0BH,存储器,0,1,2,9,A,B,E,F,例 用换码指令将任意一个一位十六进数转换为对应的ASCII码。,设:要转换的十六进制数为0BH,设DS=4000H; 表首单元地址为42000H。,63,可用如下几条指令实现:,MOV BX,2000H ;BX表首地址 MOV AL,0BH ;AL序号 XALT ; 查表转换,执行后得到:AL= 42H = B,注意:转换表长度最大为256个表项(字节)。,64,例 用换码指令将任意一位十进制数转换为对应的七段显示码,并送端口2E0H显示。,(a)七段LED,(b) 共阴极接法,共阴七段显示码表,首先在存储器中建立七段显示码表,设表首单元地址为TABLE。,65,MOV BX , OFFSET TABLE ;将表首单元的偏移地址送BX,XLAT,MOV DX , 2E0H ;给DX赋端口地址,OUT DX , AL ;送2E0H端口显示,MOV AL , 9H,通过软件的方式实现了硬件的功能,设要转换的数为9,则程序如下:,共阴七段显示码表,;执行后,AL=6FH= 9的七段显示码,66,是用来对寻址机构进行控制的指令,这类指令传送到16位目标寄存器中的是存储器操作数的地址,而不是它的内容。主要有以下三条:,3. 地址目标传送指令,(1)有效地址送寄存器指令,格式: LEA R,src,功能:R src的有效地址EA,其中,src为M,dst是16位通用R,,该指令常用来设置一个16位的R作为地址指针。,67,LEA BX,BPSI,例如:,LEA BX,BUFR,;执行后,BXBPSI,LEA SP,2000H ,;执行后,使堆栈指针SP2000H,;执行后,BXSI,LEA BX,SI,;将BUFR的EA BX,68,(2)指针送寄存器和DS的指令,格式:LDS R,src,把src所指向的内存单元中的连续4字节内容(通常为一个地址指针,包含一个段基值和一个段内偏移量)传送到两个目标寄存器,,其中:低字 dst所指R,高字 DS。,该指令中的R常采用SI。,功能:,其中src为M,R为16位寄存器,69,在指令执行前,设DS3000H,在DS段中,有效地址EA为2100H2103H的连续4个单元中存放着一个32位的地址指针,如图所示。,例如: LDS SI,2100H,SI0140H DS2000H,则指令执行后:,70,(3)指针送寄存器和ES的指令,该指令和LDS R,src 功能类似,不同的只是用ES代替DS,而且常指定DI作R。,格式: LES R,src,使用地址目标传送指令时需注意:, R是16位通用寄存器,不能使用段寄存器;, src一定是存储器操作数,其寻址方式可以是24种当中的一种。,例如: LES DI, BUFR,71,LEA SI,BUFR;,LDS SI, BUFR ;,LES SI, BUFR ;,例如:,72,4. 标志传送指令,(1)读取标志指令(Load AH from Flags),(2)设置标志指令(Store AH into Flags),格式: LAHF,功能: AHFL , 即标志寄存器低8位送AH,73,二、算术运算(Arithmetic)类指令及应用,8086的算术运算类指令包括加、减、乘、除四种基本运算指令,以及为适应进行BCD码十进制数运算而设置的各种调整指令。,根据参加运算的操作数的类型的不同,算术运算类指令又可分为无符号数运算指令和带符号数运算指令两大类。,对于无符号数加、减法和带符号数的加、减法,8086采用同一套指令,但判断无符号数或带符号数的运算结果是否发生溢出时,要根据不同的状态标志。而对乘法和除法,无符号数和带符号数各有各的指令,74, 在加、减、乘、除基本运算指令中,除1指令外,都具有两个操作数; 这类指令执行后,除1指令不影响CF标志外,对CF、OF、ZF、SP、PF和AF等6位标志均可产生影响,由这6位状态标志反映的操作结果的性质如下:,算术运算类指令的特点:, 当无符号数运算产生溢出时,CF1;,75, 当运算结果为负,SF1;, 当运算结果中有偶数个1,PF1;, 当操作数为BCD码,半字节间出现进位,需要进行BCD码调整,AF1。,算术运算类指令的操作数及结果的存放:, 当运算结果为零,ZFl;, 当带符号数运算产生溢出时,OF1;,加减运算指令的操作数及结果的存放,76,参加加减运算的操作数可以是寄存器、立即数和存储器操作数三种,即R、Im和M。R和 M都可做dst,但Im不行。,当R为dst时,运算结果存放在R中:,当M为dst时,运算结果存放在M中:,77,对于乘除运算,操作数只能是R和 M,而不能是Im。且被乘数和被除数及运算结果都隐含并固定存放于某寄存器中(如AL、AX或DX)中。,1. 加法类指令,加法类指令共有5条,其中3条为基本加法指令,2条为加法的十进制调整指令。,(1)不带进位加法指令: ADD dst,src ;,乘除运算指令的操作数及结果的存放,功能: dst dstsrc,78,ADD BX,3FFH,ADD BETASI,100 ADD BX2000H,AX,ADD BP,3AH,ADD DX,DATABXSI ;DX DX(BXSIDATA),为RM R(16位),例如:,;DI DISI,为RR R(16位),ADD DI,SI,;MIm M,;MR M,;MIm M,;BX BX3FFH,为RIm R(16位),79,(2)带进位的加法指令,ADC dst,src ;dst dstsrcCF,例如:ADC AX,DX:AX AXDXCF。,第一次用带进位加法时,应将CF清零。,ADC指令常用于两个多倍精度数的非最低字或非最低字节的相加。,ADD和ADC指令执行后对各状态标志OF、SF、ZF、AF、PF和CF均可产生影响。,注意:,80,LEA SI , FIRST ;取被加数的EA LEA DI , SECOND ;取加数的EA LEA BX , SUM ;取和的EA,例 现有两个双倍精度字FIRST(1234FEDCH)和SECOND(11228765H),分别放在数据段中,低位在前,高位在后。要求相加之后所得的和放在从SUM开始的内存单元中。,MOV AX , SI ;取第一数的低位字到AX,MOV BX , AX;存低位字相加之和,MOV AX , SI2 ;取第一数的高位字到AX,MOV BX2 , AX;存高位字相加之和,ADD AX , DI ;低位字相加,ADC AX , DI2; 两高位字连同进位相加,86,41,57,23,81,LEA SI,FIRST ;取被加数的EA LEA DI,SECOND ;取加数的EA LEA BX,SUM ;取和的EA CLC MOV CX,2 AGN :MOV AX,SI ;取字到AX ADC AX,DI ;字相加 MOV BX,AX ;存字相加之和 INC SI INC SI INC DI INC DI INC BX INC BX DEC CX JNZ AGN,也可采用循环结构存取数据:,当数据所占用的存储单元较多时,常采用循环结构。,82,单操作数指令。src可以为R/M,但不能为Im,该指令将src当成无符号数,完成加1操作。常用在循环结构中修改指针或用作循环计数。,(3)加1指令,例如: INC SI ;将SI的内容加1后再送回SI中 INC CX;将CX的内容加1后再送回CX中,格式:INC src;srcsrc+1,83,(4)压缩BCD码加法调整指令,用于对压缩BCD(又称组合BCD)码相加的结果进行调整,使结果仍为压缩BCD码。,DAA,格式:,注意:INC指令只影响OF、SF、ZF和PF,而不影响CF。,INC BYTE PTRBX100H ;将有效地址为BX100H的单元内容加1后,再送回此单元。,84,对压缩BCD码相加的结果需进行调整的原因:,例:148?,MOV AL, 14D ADD AL, 8D,MOV AL, 14H ADD AL, 08H,14822,或16H或00010110B 或22HBCD,计算机运算过程及结果:,编程实现形式:,22H,;或0EH ;或08H,85,若AL6H AL,则可得到正确的BCD码结果,DAA指令的调整过程:,先对AL的内容 (相加结果)进行测试:,如果只有AL的低四位9 或 AF=1,ALAL+06H 如果只有AL的高四位9 或 CF=1,ALAL+60H 如果两个条件均满足,则ALAL+66H,即 :,86,用DAA调整前,必须先把加法运算结果放在AL中。DAA指令紧跟在加法指令之后,调整只能在AL中进行。,DAA指令执行后,将影响除OF之外的其它标志。,注意:,87,(5)非压缩BCD码加法调整指令,AAA指令用于对放于AL中的非压缩BCD码的相加结果进行调整,调整操作仍在AL中进行,调整后的结果在AX中。,格式:AAA,如果 AL的低四位 9 或 AF=1,则,调整过程:,ALAL+06H, AHAH+01H, ALAL&0FH,88,0000 011006 ;非压缩BCD, 0000 011107 ;执行加法指令 0000 11010D ;不是非压缩BCD 0110 ;执行AAA,即AL AL06H AL 0001 0011=13H ; 压缩 BCD, AF 1,AL,例 两非压缩BCD码06和07相加并进行AAA调整的执行过程如下:,89,对应的ASCII为30H39H,也是一种非压缩BCD码,也可用AAA指令对09的ASCII码相加结果进行调整。因此AAA指令又称为ASCII码加法调整指令。,09的ASCII码格式为:,例如:,从键盘键入的每个十进制数,都先是以ASCII码形式被存放在内存指定单元中,对其进行处理时有两个途径:,注意:,90,2. 减法类指令(Subtract),减法指令共有7条,其中5条为基本减法指令,2条为十进制减法调整指令。,直接进行运算,再用非压缩BCD码调整指令进行调整,结果为非压缩BCD码。,先转换为二进制数,再进行运算,结果为二进制数。,(1)不带借位的减法指令,SUB dst,src ;dst dstsrc,91,SBB dst,src ; dst dstsrcCF,(2)带借位的减法指令,以上两指令中dst、src的定义与加法指令完全相同。指令执行后对各状态标志OF、SF、ZF、AF、PF和CF均可产生影响。,其中,src的定义及指令执行后对标志位的影,响方式与INC指令完全相同,即DEC指令也只影响OF、SF、ZF和PF,而不影响CF。,92,(4)求变补指令,NEG指令将src(M/R操作数)中的内容逐位取反后再在最低位加1(即求变补)后,结果送回src中。,src 既是源操作数又是目的操作数,故src不能是立即数。,注意:,求变补与求补码是两种不同的运算,要注意两者间的区别。,格式:NEG src ;,93,在大多数情况下:NEG指令将src当成一个带符号数的补码, srcX补, 则执行NEG src 指令后,src变为-X补。,例如: 设AL00000100B4补, 则NEG AL后, AL11111100B4补; 设 AL11101110B18补, 则NEG AL后, AL00010010B18补18。,NEG指令可用于求一个负数(以补码形式存放)的绝对值。,94,NEG指令执行后,对OF、SF、ZF、AF、PF和CF均产生影响。且当操作数为0时,CF0, 其余情况下CF=1(0减某不等于0的操作数,必然产生借位)。,格式:CMP dst,src 功能: dstsrc,不回送结果,只影响标志位OF、SF、ZF、PF和CF。,(5)比较指令,src可以为8/16位R/M或Im,但dst只可为8/16位R/M,并且src与dst不能同时为M。,95,说明:dst和src即可同时为无符号数,也可同时为有符号数,操作数类型不同,判断方法也不同。,例如: CMP AX,BX CMP AL,100 CMP CX,COUNTBP CMP POINTERDI,BX,指令执行后,由受影响的标志位状态便可判断出两操作数的大小关系。,判断两操作数大小关系的方法:,96,无符号数的比较(判断依据为ZF、CF):,带符号数的比较(判断依据为SF、OF、ZF):,若ZF1,表明AXBX;,CF0,无借位,则AXBX; CF1,有借位,则AXBX。,若ZF0,表明AXBX,以CMP AX,BX为例,,以CMP AX,BX为例,,此时,AX,BX中为带符号数。,此时, AX,BX中为无符号数。,97,若AX和BX中数同号,即AX0、BX0或AX0、BX0,则AXBX不会产生溢出,即OF=0,,若SF0,则AXBX;若SF1,则AXBX。,若AX和BX中数异号,即AX0、BX0或AX0、BX0,那么AXBX则可能产生溢出。,如果AXBX没有产生溢出,即OF0,,若SF0,则AXBX;若SF1,则AXBX。,如果AXBX产生溢出,即OF1,,若SF1,则AXBX;若SF0,则AXBX。,98,综上所述,关于带符号数的比较(如CMP AX,BX),可得出如下结论:,OFSF0 AXBX,OFSF1 AXBX,判断两个带符号数的大小,应由符号标志SF和溢出标志OF综合进行判断。,关于CMP指令的注意事项:,两个数比较时一定要分清是无符号数还是带符号数,两者判断的条件不同,且其对应的条件转移指令也不同。,99,(6)压缩BCD码减法调整指令 DAS,调整过程:,如果只有AL的低四位9 或 AF=1,ALAL06H 如果只有AL的高四位9 或 CF=1,ALAL60H 如果两个条件均满足,则ALAL66H,用于对压缩BCD码相减结果进行调整,使压缩BCD码相减结果也为压缩BCD码。,对标志的影响与DAA相同。,两个数比较以后,对两个数本身没有任何影响,仅影响标志位;,100,(7)非压缩BCD码减法调整指令AAS,如果AL的低四位 9 或 AF=1,则,调整过程:,ALAL06H, AHAH01H, ALAL&0FH,用于对非压缩BCD码相减结果进行调整,使非压缩BCD码相减结果也为非压缩BCD码。,对标志的影响与AAA相同。,101,3. 乘法类指令(Multiplication),乘法类指令共有3条,其中2条为基本乘法指令,即无符号数乘法指令和带符号数乘法指令,还有1条是非压缩BCD相乘调整指令。,进行乘法时,如果两个8位数相乘(88),乘积将是一个16位的数;如果两个16位数相乘(1616) ,则乘积将是一个32位的数。,乘法类指令的特点:,乘法指令中有两个操作数,乘数由指令给定,但被乘数总是隐含固定在AL或AX中。,102,若是88,被乘数总是先放入AL中,所得乘积在AX中;若是1616,被乘数总是先放入AX中,乘积在DX和AX两个16位的寄存器中,且DX中为乘积的高16位,AX中为乘积的低16位。,(1)无符号数的乘法指令,src(乘数)可以是R/M中的8位或16位的无符号数,不可为立即数Im。被乘数固定放在AL(8x8)或AX(16x16)中,结果存放在AX或DX与AX中,操作数和结果均为无符号数。,格式:MUL src;,103,MUL WORD PTR SI,例如:,;AX AL CL, 8位无符号数 8位无符号数,结果为16位无符号数。,;DX和AX AX CX,16位无符号数 16位无符号数,结果为32位。,;将AX中的16位无符号数和与SI所指向的字单元中的16位无符号数相乘,结果为32位,在DX和AX中。,MUL CX,MUL CL,若被乘数事先未在AL或AX中,则在执行乘法指令前,应先用MOV指令将被乘数传送到位。,注意:,104,例,因AH0,故 CF1,OF1,而其它标志位不受影响(不确定,无意义)。,MOV AX,5612H MOV BL,66H MUL BL,对于88,若运算结果中的AH0,对于1616,若运算结果中的DX0,则CF和OF两标志同时置1,而不影响其它标志位(其它标志不确定,无意义)。,MUL指令对标志位的影响:,;88,AXBLAL,积AX=072CH,105,(2)带符号数的乘法指令,与MUL指令在功能和格式上类似,即先将8位的无符号数扩展成16位的无符号数(高8位补0),然后再用MUL进行1616的运算。,如何实现16位无符号数8位无符号数呢?,方法:将168 转换为1616,格式:IMUL src,不同之处在于两个操作数均必须为带符号数。,106,IMUL WORD PTR SI,;AX AL CL, 8位带符号数(补码) 8位带符号数(补码) ,结果为16位(补码) 。,;DX和AX AX CX,16位带符号数 16位带符号数,结果为32位。,;将AX中的16位带符号数与SI所指向的字单元中的16位带符号数相乘,结果为32位,在DX和AX中。,IMUL CX,IMUL CL,例如:,107,IMUL对标志位的影响:,IMUL指令执行后,如果乘积的高半部分不是低半部分的符号扩展(不是全零或全1),则视高位部分为有效位,表示它是积的一部分,于是置CF1,OF1。若结果的高半部分为全零或全1,表明它仅包含了符号位,那么使CF0,OF0。利用这两个标志状态可决定是否需要保存积的高位字节或高位字。,IMUL指令执行后,AF、PF、SF和ZF不确定(无意义)。,108,思考题:如何实现带符号数补码的16 8 ?,例,因AH为全1,故 CF0,OF0,而其它标志位不受影响(不确定,无意义)。,MOV AX,5612H ; AL=18补 MOV BL,F6H ; BL=-10补 IMUL BL,;AXBLAL,积AXFF4CH,为-180补,方法:对操作数长度进行扩展,将8位带符号数补码扩展成16位补码(符号位扩展),然后进行16 16运算。,109,(3)非压缩BCD码乘法调整指令 AAM,用于对非压缩BCD码相乘结果进行调整,使非压缩BCD码相乘结果也为非压缩BCD码。,注意:非压缩BCD码相乘结果应先放在AL中,调整后的结果放在AX中。,调整过程:把AL寄存器内容除以10,商放在AH中,余数在AL中,即,AH AL/10所得的商,AL AL/10所得的余数,110,例 求两个非压缩BCD码09和08之乘积。,最后可在AX中得到正确结果:AX0702H,即十进制数72的非压缩BCD码。,MOV AL,09H MOV BL,08H MUL BL AAM,;调整得AH=07H(十位),AL=02H(个位),;赋初值,;AX 09H08H,执行后AL=48H,指令执行后,将影响ZF、SF和PF,其他无定义。,111,4. 除法类指令(Division),无符号数除法指令、带符号数除法指令、非压缩BCD码除法十进制调整指令、2条带符号数长度扩展指令。,被除数 商 余数 字节除法 AX AL AH 字除法 DX:AX AX DX,进行除法时:,除数由指令给出,被除数、商及余数隐含存放位置为:,16位8位8位商 32位16位16位商,112,指令中的源操作数(除数)不能为立即数。,除法运算后,所有标志位都是不确定的(无意义)。,若除数为零或AL中商大于FFH(或AX中商大于FFFFH),则CPU产生一个类型0的内部中断。,(1)无符号数除法指令 DIV src,对两个无符号数进行除法操作。src是8位或16位的 R/M。,113,DIV CX,例如:,;无符号数相除,3216,,AX 商,DX 余数。,DIV CL ,;无符号数相除,168,,DIV WORD PTRDI,114,(2)带符号数的除法指令 IDIV src,操作数都必须是带符号数,商和余数也都是带符号数,而且规定余数的符号和被除数的符号相同。,用于两个带符号数相除,其功能和对操作数长度的要求和DIV指令类似。,带符号数在除法运算过程中均以补码形式出现,运算结果也为补码。,注意:,115,;带符号数相除, 168,将AX中的16位数除以SI所指单元中的8位数, AL 商,AH 余数。,IDIV BYTE PTRSI,例如:,IDIV CX,;带符号数相除,3216,DX及AX中的32位数除以CX中的16位数, AX 商,DX 余数。,如何实现带符号数的328、1616及88 呢?,116,方法:对操作数长度进行扩展(符号位扩展),转化为3216或168形式再进行运算。,用于扩展带符号数(补码)的长度。,(3)扩展操作数长度指令,功能:将AL中的带符号数(补码)的符号位扩展到AH中,从而使AL中的8位带符号数扩展成AX中的16位带符号数。,CBW,; 8 位带符号数长度扩展指令(8位16位),117,功能:将AX中的带符号数(补码)的符号位扩展到DX中,从而得到DX及AX组成的32位双字带符号数。,; 16 位带符号数长度扩展指令(16位32位),CWD,例两带符号数分别位于AL和BX中, ALF6H,BX=FFFEH,求两带符号数的乘积(816)。,CBW ; ALF6H AXFFF6H IMUL BX ;1616,(DX,AX)AXBX,118,AAD要在DIV指令之前使用; 隐含的操作寄存器为AH,AL; 影响标志位PF、SF、ZF,其它无定义,(4)非压缩BCD除法调整指令,对非压缩BCD除法运算进行调整。,注意:,119,三、逻辑运算和移位循环指令,逻辑运算和移位循环指令对字节或字操作数进行按位操作。,逻辑运算指令,0 0 * * * 无定义,规则:按位操作,无进/借位,对标志位的影响(除NOT指令外):,CF OF SF ZF PF AF,120,(1)逻辑“与”指令 指令格式: AND dst,src ;dst dstsrc,主要用途:使操作数的若干位维持不变; 另外的位清0。,指令功能:对两个操作数进行按位逻辑“与”操作。,例1:将AH中数的符号位清0,维持不变的位跟“1”相“与”; 清0的位跟“0”相“与”。,AND AH,7FH ; 7FH=0111111

温馨提示

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

评论

0/150

提交评论