《淮阴师范学院微机原理课件第三章.ppt》由会员分享,可在线阅读,更多相关《淮阴师范学院微机原理课件第三章.ppt(187页珍藏版)》请在三一办公上搜索。
1、第3章指令系统,一、基本数据类型 二、指令格式 三、寻址方式 四、通用指令,3.1 基本数据类型,字、双字的对齐数字数据类型指针数据类型串数据类型,字、双字的对齐数字数据类型:整数(无符号及有符号数)、浮点数(单精度、双精度、双扩展精度)指针数据类型(内存单元的地址):near、far串数据类型位、字节、字或双字的连续序列,3.2 指令及指令格式,3.2.1基本概念:用编码表示CPU的一个基本操作,称为一条指令。全部指令集称为指令系统。指令系统反映 CPU的基本功能,是硬件设计人员和程序员能见到的机器的主要属性,,一个CPU的指令系统是固定的,不同类型的CPU其指令系统不同;同一系列向上兼容。
2、程序是为要解决的问题编写出来的指令集合。用户为解决自己的问题所编写的程序称为源程序。,用二进制数编码表示的指令,称为机器指令或机器码。机器语言是机器码及其使用的一组规则。用机器语言编写的程序称为目标程序。,助记符是有助记忆、并能描述指令功能的符号。通常是指令功能的英文单词的缩写。例 数的传送指令用助记符MOV 加法用ADD,转移用JMP等 用助记符等表示的指令称为汇编格式指令例 MOV AL,0 汇编语言是汇编格式指令、伪指令及其使用的一组规则。用汇编语言编写的程序称汇编语言程序。,3.2.2 指令格式,例 ADD AL,10H LOADREG:MOV EAX,SUBTOTAL,操作数指明参与
3、操作的数据或数据所在的地方。了解操作数的来源、个数、类型、执行速度。,指令的一般格式是:标号:助记符 操作数参数1,操作数参数280X86系列计算机通常使用单操作数和双操作数指令,标号,操作码的助记标识符,目的操作数,源操作数,操作数来源 指明操作数所在的地方有三种来源:操作数在指令中,称立即数操作数 如 MOV AL,9 操作数在寄存器中,称寄存器操作数指令中给出用符号表示的寄存器名。如 MOV AL,BL 操作数在内存单元中,称存储器操作数或内存操作数 指令中给出该内存单元的地址。用 表示存储器操作数 如 MOV AL,2000H,无操作数:指令只有一个操作码,没有操作数。,有两种可能:有
4、些操作不需要操作数。如 HLT,NOP等处理机控制指令。操作数隐含在指令中。如 STC,CLC等处理机控制命令。AAA,DAA等调整指令。,单操作数:指令中给出一个操作数。,有两种可能:有些操作只需要一个操作数 如 INC AL;(AL)(AL)+1有些操作将另一个操作数隐含在指令中 如 MUL BL;(AX)(AL)(BL),操作数类型,指令应指明参与操作的数是字节还是字,即操作数的类型。通常操作数的类型可由操作数本身隐含给出。只在特殊情况下需要指明。,8086/8088:有的操作既可对字节操作,又可对字操作 有的操作只允许对字操作,指令中有寄存器操作数,由寄存器操作数决定类型。,例:MOV
5、 BX,AL;字节操作,BX AL MOV BX,AX;字操作,BX AL,BX+1 AH,指令操作数中无寄存器,则由内存操作数的类型决定。,例 MOV BX,0,指令中无类型的依据,需对存储器操作数加类型说明。,用 PTR 属性伪操作说明类型。MOV byte PTR BX,0 字节操作,BX 0 MOV word PTR BX,0 字操作,BX 0,BX+1 0,执行速度,寄存器操作数 立即数操作数 存储器操作数,三条指令:操作类型相同,都是传送指令,且目的操作数相同,不同的是源操作数。,对同一类型指令,执行速度:,3.3 寻址方式指明操作数的来源,即寻找(得到)操作数的方法。,以数据传送
6、指令MOV为例介绍寻址方式。指令 MOV dst,src 执行(dst)(src)即:源操作数的内容不变,目的操作数 源操作数,一、立即数寻址(P45)例1:MOV AX,1090H(若CS=1000H,IP=100H),所有的算术指令都允许源操作数是立即数(DIV、IDIV除外),这种寻址方式所提供的操作数直接放在指令中,紧跟在操作码的后面,与操作码一起放在码段区域中。立即数可以是8位的,也可以是16位.立即寻址主要是用来给寄存器赋初值.,二、寄存器寻址(P46),MOV AX,BX,若 AX=1234H,BX=4567H,4567H,4567H,AX,BX,源操作数和目的操作数能在以下寄存
7、器中:32 位操作数:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP8 位操作数:AH,BH,CH,DH,AL,BL,CL,DL 16 位操作数:AX,BX,CX,DX,SI,DI,SP,BP CS,DS,ES,SS,FS,SG,EFLAGS,系统寄存器GDTR、IDTR,如:MOV AX,BX MOV AL,BH*SRC 和 DST的字长一致 MOV AH,BX,操作数在指定的寄存器中,例1 MOV AX,2056H 执行后:(AX)=2056H例2 MOV BL,AH 执行前:(BL)=12H,(AH)=78H 执行后:(BL)=78H(AH)=78H,三、直接寻址(P47
8、-48“位移量”),存储器操作数的有效地址EA在指令中直接给出。例1 MOV AL,2000H 默认段寄存器为DS。操作数所在内存单元的物理地址为:PA=(DS)10H+EA,MOV AX,2000H(若DS=3000H)DS 30000偏移量 2000+实际地址 32000H,内存操作数的物理地址为:PA=(DS)10H+EA=3000H 10H+2000H=32000H,执行后(AX)=7A54H,在汇编语言程序中,不直接用数值 表示偏移地址,而用符号代替数值表示地址,称符号地址(变量名)。,例 符号buffer表示一个地址。MOV AX,buffer或写成 MOV AX,buffer 源
9、操作数为buffer指向的内存单元的内容,符号地址(变量名)经汇编连接后,与一个确定的数值地址相对应可用操作符Offset 获取变量的偏移地址。故 PA=(DS)10H+Offset buffer 指令执行结果(AX)=0B0A H,存储器操作数的有效地址EA由寄存器给出,寄存器的内容为操作数的有效地址。可用的寄存器有 BX、SI、DI、BP 如:MOV AL,BX MOV AH,SI MOV DL,DI MOV DH,BP,四、寄存器间接寻址(P48“基地址”),另参见92页寄存器间接寻址示意图,例1,例2:MOV AX,DI 若(DS)=3000H(DI)=2000H 则内存操作数的物理地
10、址为:PA=(DS)10H+(DI)=32000H 执行后(AX)=(32000H)=400BH,例3:MOV AX,BP 若(SS)=4000H(BP)=3000H 则内存操作数的物理地址为:PA=(SS)10H+(BP)=43000H 指令执行后(AX)=(43000H)=0102H,五、寄存器相对寻址(P48“基地址+位移量”)又称变址寻址,即以基准寄存器BX、BP、SI、DI加上给定的8位或16位偏移量作为操作数的有效地址。操作数的有效地址由一个寄存器与一个偏移量相加得到,偏移量(相对量)在指令中给出,范围在0000 FFFFH可用的寄存器有 BX、DI、SI、BP,与寄存器间接寻址相
11、同 如:MOV AL,BX+10HMOV AH,DI+20H MOV DL,30H SI MOV DH,40H BP,默认段寄存器的关系与寄存器间接寻址相同使用BX、SI、DI,默认段寄存器为DS(BX)PA=(DS)10H+(SI)+偏移量(DI)使用BP,默认段寄存器为SSPA=(SS)10H+(BP)+偏移量,例1:MOV AX,BX+30H 若(DS)=2000H(BX)=1000H 则内存操作数的物理地址为:PA=(DS)10H+(BX)+30H=21030H 指令执行后:(AX)=(21030H)=8976H,例2:MOV AX,60H BP 若(SS)=3000H(BP)=200
12、H 则内存操作数的物理地址为:PA=(SS)10H+(BP)+60H=30260H 指令执行后:(AX)=(30260H)=0ABCH,六、基址加变址寻址 操作数的有效地址由 一个基址寄存器与一个变址寄存器之和给出。可用的基址寄存器为 BX、BP 变址寄存器为 SI、DI 如 MOV AL,BX+SI MOV AX,BXDI MOV DL,BP+SI MOV DX,BPDI,基址加变址寻址即以某一基地址寄存器(通常为BX、BP)的内容,加上某 一变址寄存器(通常为SI,DI)的内容,形成操作数的有效地址。段地址规则同上。,例1:MOV AX,BX+SI 若(DS)=3200H,(BX)=045
13、6H,(SI)=1094H,其寻址示意图如图3-5所示,7、相对基址加变址寻址(P49“基地址+索引+位移量”),操作数的有效地址由 基址寄存器、变址寄存器、偏移量三者之和给出。可用的寄存器与基址加变址寻址方式相同 基址寄存器有 BX、BP 变址寄存器有 SI、DI如 MOV AL,BX+SI+10H MOV AX,20H BXDI MOV DL,BP+SI+30H MOV DX,40H BPDI,相对基址加变址寻址即以某一基地址寄存器(通常为BX、BP)的内容,加上某 一变址寄存器(通常为SI,DI)的内容,再加上给定的8位或16位偏移量,形成了操作数的有效地址。,例1:MOV AX,BX+
14、SI+1000H 若(DS)=3000H(BX)=0700H(SI)=0300H 则内存操作数的物理地址为:PA=(DS)10H+(BX)+(SI)+10H=32000H,D:DEBUG-A 0AFA:0100 MOV CL,AX Error0AFA:0100 MOV AX,DX Error0AFA:0100 MOV AL,CX Error0AFA:0100 MOV CX,BP+BX Error0AFA:0100 MOV AH,SI+DI Error0AFA:0100 MOV BL,AX+CX Error0AFA:0100-,利用DEBUG可判断下列寻址方式错:,1、设有关寄存器及存储器单元的
15、内容如下:DS3000H,BX0200H,SI0002H,30200H24H,30202H0ACH,30203H=0F0H,31300H54H,31301H98H,31302H6DH。问下列各条指令执行完后,AL或 AX寄存器的内容各是什么?,分析:(1)Mov AX,1300H指令的源操作数为立即寻址方式且为字操作,所以该指令执行完后,AX=1300H。,1、设有关寄存器及存储器单元的内容如下:DS3000H,BX0200H,SI0002H,30200H24H,30202H0ACH,30203H=0F0H,31300H54H,31301H98H,31302H6DH。问下列各条指令执行完后,A
16、L或 AX寄存器的内容各是什么?,(2)MOV AL,BL指令的源操作数为寄存器寻址方式址为字节操作,所以该指令执行完后,AL00H,1、设有关寄存器及存储器单元的内容如下:DS3000H,BX0200H,SI0002H,30200H24H,30202H0ACH,30203H=0F0H,31300H54H,31301H98H,31302H6DH。问下列各条指令执行完后,AL或 AX寄存器的内容各是什么?,(3)Mov AX,1300H指令的源操作数为直接寻址方式且为字操作,执行该指令时,是将DS10H+1300H31300的字内容送Ax,所以该指令执行完后,AX=9854H。,1、设有关寄存器
17、及存储器单元的内容如下:DS3000H,BX0200H,SI0002H,30200H24H,30202H0ACH,30203H=0F0H,31300H54H,31301H98H,31302H6DH。问下列各条指令执行完后,AL或 AX寄存器的内容各是什么?,(4)MOV AL,BX指令的源操作数为寄存器间接寻址方式且为字节操作,执行该指令时,是将DS10H+BX30200H的内容送AL,所以该指令执行完后,AL24H。,1、设有关寄存器及存储器单元的内容如下:DS3000H,BX0200H,SI0002H,30200H24H,30202H0ACH,30203H=0F0H,31300H54H,3
18、1301H98H,31302H6DH。问下列各条指令执行完后,AL或 AX寄存器的内容各是什么?,(5)MOV AL,1100HBx指令的源操作数为寄存器加位移量寻址方式且为字节操作,执行该指令时,是将DS*10H+BX+1100H31300H的内容送AL,所以该指令执行完后,AL=54H。,1、设有关寄存器及存储器单元的内容如下:DS3000H,BX0200H,SI0002H,30200H24H,30202H0ACH,30203H=0F0H,31300H54H,31301H98H,31302H6DH。问下列各条指令执行完后,AL或 AX寄存器的内容各是什么?,(6)MOV AX,BXSI指令
19、的源操作数为基址变址寻址方式且为字操作,执行该指令时是将DS10H+BX+SI30202H的内容送AX,所以该指令执行完后,AXF0ACH。,1、设有关寄存器及存储器单元的内容如下:DS3000H,BX0200H,SI0002H,30200H24H,30202H0ACH,30203H=0F0H,31300H54H,31301H98H,31302H6DH。问下列各条指令执行完后,AL或 AX寄存器的内容各是什么?,(7)MOV AL,1100HBxSI指令的源操作数为基址变址加位移量寻址方式且为字节操作,执行该指令时,是将DS10H+BX+SI+1100H31302H的内容送AL,所以该指令执行
20、完后,AL=6DH。,一.数据传送指令二.算术运算指令三.逻辑运算指令四.控制转移指令五.处理机控制指令六.串操作指令,3.4 IA-32通用指令,概述1.指令助记符表2.学习指令的要点 3.利用DEBUG程序,学习指令系统4.指令中操作数的表示5.书写指令注意事项,1.指令助记符表,2.学习指令的要点从以下几个方面来掌握一条指令:指令的助记符 指令的格式:操作数的个数、类型 执行的操作:指令执行后的结果包括:哪些寄存器、内存单元的值发生了变化,对标志位有无影响,哪些受影响只介绍常用的指令,其他需要时可自学。,4.指令中操作数的表示,对双操作数指令 不能两个同为存储器操作数 MOV DI,SI
21、 目的操作数不能是立即数 ADD 3,AL 两个操作数的类型应相同 SUB AX,BL,一、数据传送指令,通用数据传送指令,地址传送指令,累加器专用指令,标志寄存器传送指令,1.通用数据传送指令(1)基本传送指令 MOV DST,SRC 源操作数寄存器、存储器、立即数 目的操作数 寄存器、存储器 执行的操作:DST SRC CPU内部寄存器之间的数据传送(除CS,IP外)MOV AL,BL MOV DS,BX MOV DX,DI MOV AX,DX MOV SI,BP,传送的是字节还是字取决于指令中涉及的寄存器是8位还是16位。,立即数传送到CPU内部通用寄存器组(AX,BX,CX,DX,BP
22、,SP,DI,SI)MOV CL,4 MOV DX,03FFH MOV DI,04BFH CPU内部寄存器(除CS,IP外)与存储器(所有寻址方式)之间的数据传送 MOV BX,BUFFER MOV DI,CX MOV AL,2000 MOV SI,BLOCKBP MOV AX,SI MOV DS,DATSI+BX 立即数给存储单元赋值 MOV WORD PTR2000,10 MOV BYTE PTRBX+DI,30,注意事项:1.立即数不能直接送段寄存器 MOV DS,3000H 2.目标操作数不允许用立即数方式 MOV 2000H,AL 3.不允许在两个存储单元间传送数据 MOV2000H
23、,3000H 4.不允许在两个段寄存器之间传送数据 MOV DS,ES 5.MOV 指令不影响标志位。例1:把地址为AREA1(段内偏移量)的存储单元的内容,传送至同一 段内的地址为AREA2的存储单元中。,Mov AL,AREA1Mov AREA2,AL,例2:若要传送的不是一个字节,而是一个数据块,(例如内有100个字 节),如何实现?,mov si,offset area1 mov di,offset area2 mov cx,100Again:mov al,si;mov di,al inc si inc di dec cx jnz again,几个不能送的解决办法:MOVAL,mem1
24、;通过寄存器AL作桥梁MOVmem2,AL;用来解决存存MOVAX,DS;通过AX解决:MOVES,AX;段寄段寄MOVAX,data;通过AX解决:MOVDS,AX;段寄立即数,2、交换指令 XCHG OPRD1,OPRD2 在寄存器间或寄存器与存储器间交换信息(不允许使用段寄存器)。源操作数:寄存器、存储器 目的操作数:寄存器、存储器 执行的操作:(OPRD1)(OPRD2)例:XCHG BX,BP+SI(BX)=6F30H(BP)=0200H(SI)=0046H(SS)=2F00H(2F246H)=1234H,3、堆栈操作指令 PUSH OPRD POP OPRD 堆栈按照先进后出的原则
25、组织的一段内存区域。8088中规定堆栈设 置在堆栈段(SS段)内,堆栈指针SP的初值决定了堆栈的大小。SP始终指向堆栈的顶部,即始终指向最后推入堆栈的信息所在 的单元。操作数:16位通用寄存器;段寄存器;16位内存操作数(除立即数之外的 任何寻址方式)。执行的操作:,设(AX)=1020H,执行示意图如图,(SP),低地址,存储区(SS段),执行前(AX)=1020,(SP),低地址,存储区(SS段),执行后,20,10,AH,AL,2-8,(SP)-1,(SP)-2,作用:,压栈指令的格式为:PUSH regPUSH mem/regPUSH segregPOP指令的格式同PUSH指令,堆栈指
26、令使用时应注意两点:堆栈操作总是按字进行不能从栈顶弹出一个字给CS,4、累加器专用传送指令IN,OUT,所谓专用只限于用累加器AL或AX来传送信息。完成的操作:CPUI/O端口(1)输入指令IN格式:IN AL,port;port端口号0255H IN AX,DX;DX表示的端口范围达64K例:IN AL,80H;(AL)(80H)IN AX,DX;(AX)((DX)+1,(DX)),例:OUT 68H,AX;(68+1,68H)(AX)OUT DX,AL;(DX)(AL)在使用间接的IN/OUT指令时,在指令执行前,应先用传送指令对DX寄存器设置好端口号,如:MOVDX,220HINAL,D
27、X;将220H端口内容读 入AL累加器,(2)输出指令OUT格式:OUT port,AL OUT DX,AX,5、扩展指令,(1)CWDCWD能把在AX中的字的符号扩展到DX中,形成32位的操作数。若AX8000,则0DX,否则FFFFH DX。,(2)CBWCBW把在寄存器AL中的字节的符号送至AH中。若AL=80H,则扩展后FFH AH。,三、算术运算指令,算术运算指令涉及两种类型数据,即无符号数和有符号数。对加法指令和减法指令而言,无符号和有符号数可采用同一套指令,其条件有两个:一是参加的操作数必须同为无符号数或同为有符号数。二是要采用不同标志位来检查无符号数和有符号数的运算结果是否溢出
28、。,下面看一下两个8位数相加时的4种情况:,无符号数和有符号数均不溢出二进制相加 无符号数加有符号数加 0000 1000 8+8+0001 1110+30+(+30)0010 0110 38+38 结果38 CF=0 OF=0,无符号数溢出 0000 1000 8+8+1111 1101+253+(-3)10000 0101 261+5 结果5 CF=1OF=0 有符号数溢出 0000 1000 8+8+0111 1101+125+(+125)1000 0101 133+133结果-123 CF=0 OF=1(补码表示),无符号数和有符号数均溢出 1000 1000 136-120+1111
29、 0111+247+(-9)10111 1111 383-129 结果127 CF=1 OF=1上面四种情况清楚说明,CF标志可用来表示无符号数的溢出,OF标志可用来表示有符号数的溢出。需要指出的是有符号数的溢出是一种出错,在运算过程中应当避免。,加法指令,减法指令,乘法指令,除法指令,十进制调整指令,不带进位的加法指令ADD.格式有:ADDac,data ADDmem/reg,data ADD mem/reg1,mem/reg2ADD指令对标志位(指状态标志)都有影响.,1.加法指令,注意:该指令适合有符号数和无符号数的运算。,例1:MOV DX,4652H ADD DX,0f0f0h,执行
30、后:(DX)=3742H z=0 s=0 c=1 o=0 对无符号数 溢出 结果错 对有符号数 不溢出 结果正确 问:对带符号数和无符号数怎样判断是否溢出?,有符号数的溢出用溢出标志 o 判断;无符号数的溢出用进位标志 c 判断。,(2)带进位位的加法指令ADC,ADC指令在形式上和功能上都有与ADD类似,只是在相加时要把进位标志的现行值CF加到和中,例如:ADC AL,68H ADC AX,CX ADC BX,DI,ADC指令主要用于多字节加法运算中.,MOV AX,FirstADD AX,SecondMOV Third,AXMOV AX,First+2ADC AX,Second+2MOV
31、Third+2,AX,2 F 3 6 5 F 3 6 5+5 E 0 2 4+E 0 2 4 8 D 3 8 9 D 3 8 9 1 0 0 0 2+0 0 0 5 0 0 0 8,2,1,FirstSecondThird,65F302 0024E0050089D30800,格式:INCreg INCreg/mem功能:用于在循环中修改地址指针及循环次数等。例:INC AL INCBYTE PTRBX+4本指令除CF外,对其余标志均有影响。注意:(1)该指令将操作数视为无符号数;(2)该指令不影响 进位标志 C,(3)加1指令INC(单操作数指令),2.减法指令SUB DST,SRC 源操作数
32、:通用寄存器、存储器、立即数 目的操作数:通用寄存器、存储器 执行的操作:DST DST-SRC 注:该指令影响标志位,例:SUBAL,60H SUBBX+20H,5678H SUBAX,CX,SBB DST,SRC 源操作数:通用寄存器、存储器、立即数 目的操作数:通用寄存器、存储器 执行的操作:DST DST-SRC C 注:该指令影响标志位,注意:该指令适合有符号数和无符号数的运算。,例:SBB AX,CX SBB WORD PTRSI,2080H SBB指令主要用于多字节的减法。因无符号数的小数减大数时,不够减而产生借位,此时进位标志CF=1,注意:同加法指令 有符号数的溢出用溢出标志
33、 o 判断;无符号数的溢出用进位标志 c 判断。例:SUB DH,BP+4(DH)=41H(SS)=0000H(BP)=00E4H(00E8H)=5AH,结果:(DH)=0E7H S=1 Z=0 C=1 O=0 如果为有符号数则结果正确(无溢出)如果为无符号数则结果错误(有溢出),举例:双精度数运算 编程实现W=X+Y+24-Z,XYZW,65F302 0024E0050089D30800,MOV AX,X MOV DX,X+2ADD AX,YADC DX,Y+2;X+YADD AX,24ADC DX,0;X+Y+24 SUB AX,Z SBB DX,Z+2;X+Y+24-ZMOV W,AXM
34、OV W+2,DX;送入w,DEC OPRD 操作数:通用寄存器、存储器(不能是段寄存器或立即数)执行的操作:OPRD OPRD-1 功能:用于在循环中修改地址指针及循环次数等。例:DEC BX DEC SI 注意:(1)该指令将操作数视为无符号数;(2)该指令不影响 进位标志 C,NEG OPRD 操作数:通用寄存器、存储器 执行的操作:求补指令,用零减去操作数,再送回操作数。,例:NEG AL;对AL中的数取补码 若(AL)=0,执行后(AL)=0,CF=0 若(AL)=FCH,执行后(AL)=04H,CF=1,例:设(DS)=6000H,(BX)=0010H,(60010H)=47H。N
35、EG BX执行指令后(60010H)=B9H,CMP DST,SRC 源操作数:通用寄存器、存储器、立即数 目的操作数:通用寄存器、存储器 执行的操作:DST-SRC 注:该指令影响标志位 注意:(1)该指令同 SUB,但其不保存运算结果;(2)该指令后面通常跟一条转移指令,根据标志位 产生不同的程序分支。,比较指令主要用于两个数之间的关系:大、小、相等。如:A,B1.比较相等。只要看Z(零标志)标志。Z=1相等 Z=0不相等。2.比较大小。分两种情况。无符号数 看进(借)位C 标志。C=1,有借位,则 AB A=A0H 1 0 1 0 0 0 0 0 A=53H 0 1 0 1 0 0 1
36、1 B=53H 0 1 0 1 0 0 1 1 B=A0H 1 0 1 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 1 1 0 0 1 1 AB AB,1,带符号数*同号:A=24H,B=44H A=-24H,B=-44H 不会溢出O=0,用符号位 S 判断 O=0 S=0 AB S=1 AB S=0 AB S=1 AB,结论:O S=0 AB O S=1 AB,A=1,B=-1A=-1,B=1,8088中有几条用于判断有符号数大小的转移指令,如:JG/JNLE 大于则转移 条件为:O S=0 且 Z=0 JL/JNGE 小于则转移 条件为:O S=1 同样有几条用于判断无符号
37、数大小的转移指令,如:JA/JNBE 高于则转移 条件为:C=0 且 Z=0 JBE/JNA 低于或等于则转移 条件为:C=1 或 Z=1 JNZ 不等于0则转移,JNC 若无进位则转移 即C=0则转移JC 若有进位则转移 即C=1则转移,例4:比较两个无符号数的大小,并将大数存入AL中。,XY,65F302 0024E0050089D30800,MOV AL,X MOV BL,Y CMP AL,BL;AL-BL JNC NEXT;65-F3 MOV AL,BLNEXT:HLT,JNC 若无进位则转移 即C=0则转移,例5:比较两个带符号数的大小,并将大数存入AL中。,XY,65F302 00
38、24E0050089D30800,MOV AL,X MOV BL,Y CMP AL,BL JG NEXT MOV AL,BLNEXT:HLT,JG 大于则转移 条件为:O S=0 且 Z=0,例6:若自Block开始的内存中有100个带符号数,找出最大值存入Max单元。,Block,65F302 0024E00500,MOV BX,Offset Block MOV AX,BX INC BX MOV CX,99 Again:CMP AX,BX JG Next MOV AX,BX Next:INC BX DEC CX JNZ Again MOV MAX,AX HLT,Max,JNZ 若不为0则转移
39、,JG 大于则转移,例7:在分别由Data1和Data2开始的两个 内存区域中,分别存放着5个1字节 的无符号数,如果Data1中的第N个 数大于Data2中的第N个数,则进行 Data1N Data2N 运算,否则 进行 Data1N+Data2N 运算,运算结果存回Data1中,Data1Data2,65F302 0024E0050089D3,MOV SI,Offset Data1 MOV DI,Offset Data2 MOV CX,5 Again:MOV AL,SI CMP AL,DI JC Adddat SUB AL,DI JMP Next Adddat:ADD AL,DI Next
40、:MOV SI,AL INC SI INC DI DEC CX JNZ Again HLT,Data1Data2,65F302 0024E0050089D3,JC 若有进位/借位则转移 JNZ 若不为0则转移,3.乘法指令 MUL SRC 无符号数乘法 源操作数:通用寄存器、存储器(不能是立即数)目的操作数:DX,AX(隐含)执行的操作:字节操作(AH,AL)(AL)(SRC)字操作(DX,AX)(AX)(SRC)注:该指令影响标志位,IMUL SRC 带符号数乘法 源操作数:通用寄存器、存储器(不能是立即数)目的操作数:DX,AX(隐含)执行的操作:字节操作(AH,AL)(AL)(SRC)字
41、操作(DX,AX)(AX)(SRC)注:该指令影响标志位,4.除法指令 DIV SRC 无符号数除法 IDIV SRC 带符号数除法 源操作数:通用寄存器、存储器(不能是立即数)目的操作数:DX,AX(隐含)执行的操作:字节操作(AL)(AX)/(SRC)商(AH)(AX)/(SRC)余数 字操作(AX)(DX,AX)/(SRC)商(DX)(DX,AX)/(SRC)余数 注:该指令对各标志位均无定义。,注意:SRC的类型决定是字或字节相除。,5.十进制调整指令 前面提到的所有运算指令都是二进制数的运算指令,怎样得到十进制的运算结果呢?8088提供了一套十进制调整指令。(1)十进制数的表示 BC
42、D码 用二进制编码的十进制数。压缩 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 0 1 2 3 4 5 6 7 8 9,(2)调整原理,MOV AL,48ADD AL,27DAA,ADD指令的运算过程为:,0 1 0 0 1 0 0 0+0 0 1 0 0 1 1 1 0 1 1 0 1 1 1 1,BCD数48+27=75但ADD指令执行的结果却是6F,所以要用DAA指令进行调整。调整的方法是:因为低4位9,故进行加6调整,0 1 1 0 1 1 1 1+0 0 0 0 0 1 1 0 0 1 1 1 0 1 0 1,AAA 加法后进行
43、ASCII调整指令。,这条指令对在AL中的由两个未组合的十进制操作数相加后的结果进行校正,产生一个未组合的十进制数。两个未组合的十进制数可以直接用ADD指令相加,但要得到正确的未组合的十进制结果,必须在加法指令以后,紧接着用一条AAA指令来加以校正,则在AX中就可以得到正确的结果。所谓未组合的十进制数,就是一位十进制数,也即十进制数字的ASCII码的高四位置为0以后所形成的数码。即6为00000110,7为00000111等。当这样的两个数相加(必须有一个在AL中)以后,要在AX中得到正确的仍是未组合的十进制结果,就必须进行调整。因为6713,则应该在AL中为00000011,而在AH中(若初
44、始值为0)为00000001。,0 0 0 0 0 1 1 0+0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 1,但加法是按二进制规则进行的,在未调整前AL中的值为:,若(AL&0FH)9,或AF=1,则AL AL+6AH AH+1AF 1CF 1AL AL&0FH,(3)调整指令 加法:DAA 加法后进行十进制调整指令。AAA 加法后进行ASCII调整指令。减法:DAS 减法后进行十进制调整指令。AAS 减法后进行ASCII调整指令。乘法:AAM 乘法后进行ASCII调整指令。除法:AAD 除法前进行调整指令。,四、逻辑运算指令,逻辑运算指令,移位指令,循环移位指令,1.逻辑运
45、算指令 AND DST,SRC 逻辑与 源操作数:通用寄存器、存储器、立即数 目的操作数:通用寄存器、存储器 执行的操作:DST DST and SRC 功能:实现两个操作数的按位与运算。注:该指令影响标志位 使 O=0,C=0,P,S,Z反映操作的结果。,例1:屏蔽AL寄存器的低四位。MOV AL,FF 1 1 1 1 1 1 1 1 AND AL,F0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 例2:屏蔽AL寄存器的高两位。MOV AL,FF 1 1 1 1 1 1 1 1 AND AL,3F 0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1,使一立 即
46、 数的该位为 0 即可,使一立 即 数的该位为 0 即可,AND通常用于使某些位置0,其它位不变的情况。,OR DST,SRC 逻辑或 源操作数:通用寄存器、存储器、立即数 目的操作数:通用寄存器、存储器 执行的操作:DST DST or SRC 功能:实现两个操作数的按位或运算。注:该指令影响标志位 使 O=0,C=0,P,S,Z反映操作的结果。,例3:使某数的第4、5位置1。MOV AL,03H 0 0 0 0 0 0 1 1 OR AL,30H 0 0 1 1 0 0 0 0 0 0 1 1 0 0 1 1,使一立 即 数的该位为 1 即可,OR指令通常用于将某些位置1,XOR DST,
47、SRC 异或 源操作数:通用寄存器、存储器、立即数 目的操作数:通用寄存器、存储器 执行的操作:DST DST xor SRC 功能:实现两个操作数的按位异或运算。注:该指令影响标志位 使 O=0,C=0,P,S,Z反映操作的结果。,例6:使某数的D1、D0位取反,其它位不变。MOV AL,11H 0 0 0 1 0 0 0 1 XOR AL,03H 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 例7:测试AX中的数与42H是否相同,相同则转移。XOR AX,0042H JZ Next Next:MOV BX,30H例8:给某寄存器清0。XOR AX,AX AX=0,结果,给
48、寄存器 清 0,测试两操作数是否相等,使一操作数 若干位维持不变,若干位取反,使一立 即 数的相应位为 1 即可,JZ结果为0则转移,TEST DST,SRC 测试 源操作数:通用寄存器、存储器、立即数 目的操作数:通用寄存器、存储器 执行的操作:DST and SRC 功能:实现两个操作数的按位与运算,结果不保存,只影响标志位。注:该指令影响标志位 使 O=0,C=0,P,S,Z反映操作的结果。,例4:检测AL中的最低位是否位1,若为1则转移。MOV AL,41H 0 1 0 0 0 0 0 1 TEST AL,01H 0 0 0 0 0 0 0 1 JNZ Next 0 0 0 0 0 0
49、 0 1 Next:MOV BL,0,TEST 通常用于检测一些条件是否满足,但又不希望改变原来操作数的情况,该指令后通常带有条件转移指令。,JNZ结果不为0则转移,例5:检测CX内容是否位 0,为 0 则转移。TEST CX,0FFFFH JZ Next Next:MOV AX,1 CMP CX,0 JZ Next Next:MOV AX,1,JZ结果为0则转移,NOT OPRD 逻辑非 操作数:通用寄存器、存储器 执行的操作:OPRD not OPRD 功能:实现操作数的按位取反运算。注:该指令不影响标志位。例如:NOT AL NOT BX,例题:NOT AL 若执行前:(AL)=0011
50、1100B,则执行后:(AL)=11000011B。,2.移位指令 SAL OPRD,CNT 算术左移 SHL OPRD,CNT 逻辑左移 操作数:通用寄存器、存储器 CNT:移位次数,当CNT1时,应将其赋给CL寄存器 执行的操作:注:该指令影响标志位 C,S,Z,P 视结果而定;O 只当CNT=1时有效,移位后当最高有效位发生变化时(如 1变 0)O=1,否则 O=0。,C,OPRD,0,例1:某数10 MOV AL,X MOV BL,10 MUL BL MOV AL,X SHL AL,1;X*2 MOV BL,AL;BL=X*2 SHL AL,1;X*4 SHL AL,1;X*8 ADD