淮阴师范学院微机原理课件第三章.ppt

上传人:za****8 文档编号:14448519 上传时间:2020-07-21 格式:PPT 页数:187 大小:1.06MB
返回 下载 相关 举报
淮阴师范学院微机原理课件第三章.ppt_第1页
第1页 / 共187页
淮阴师范学院微机原理课件第三章.ppt_第2页
第2页 / 共187页
淮阴师范学院微机原理课件第三章.ppt_第3页
第3页 / 共187页
点击查看更多>>
资源描述
第3章指令系统,一、基本数据类型 二、指令格式 三、寻址方式 四、通用指令,3.1 基本数据类型,字、双字的对齐 数字数据类型 指针数据类型 串数据类型,字、 双字的对齐 数字数据类型: 整数(无符号及有符号数)、浮点数(单精度、双精度、双扩展精度) 指针数据类型(内存单元的地址): near、far 串数据类型 位、字节、字或双字的连续序列,3.2 指令及指令格式,3.2.1基本概念: 用编码表示CPU的一个基本操作,称为一条指令。 全部指令集称为指令系统。 指令系统反映 CPU的基本功能, 是硬件设计人员和程序员能见到的机器的主要属性,,一个CPU的指令系统是固定的,不同类型的CPU其指令系统不同; 同一系列向上兼容。 程序是为要解决的问题编写出来的指令集合。 用户为解决自己的问题所编写的程序称为源程序。,用二进制数编码表示的指令,称为机器指令或机器码。 机器语言是机器码及其使用的一组规则。 用机器语言编写的程序称为目标程序。,助记符是有助记忆、并能描述指令功能的符号。 通常是指令功能的英文单词的缩写。 例 数的传送指令用助记符MOV 加法用ADD,转移用JMP等 用助记符等表示的指令称为汇编格式指令 例 MOV AL, 0 汇编语言是汇编格式指令、伪指令及其使用的一组规则。 用汇编语言编写的程序称汇编语言程序。,3.2.2 指令格式,例 ADD AL,10H LOADREG: MOV EAX, SUBTOTAL,操作数 指明参与操作的数据或数据所在的地方。 了解操作数的来源、个数、类型、执行速度。,指令的一般格式是: 标号:助记符 操作数参数1,操作数参数2 80X86系列计算机通常使用单操作数和双操作数指令,标号,操作码的助记标识符,目的操作数,源操作数,操作数来源 指明操作数所在的地方 有三种来源: 操作数在指令中,称立即数操作数 如 MOV AL , 9 操作数在寄存器中,称寄存器操作数 指令中给出用符号表示的寄存器名。 如 MOV AL , BL 操作数在内存单元中,称存储器操作数或内存操作数 指令中给出该内存单元的地址。用 表示存储器操作数 如 MOV AL , 2000H , 无操作数: 指令只有一个操作码,没有操作数。,有两种可能: 有些操作不需要操作数。 如 HLT,NOP等处理机控制指令。 操作数隐含在指令中。 如 STC , CLC等处理机控制命令。 AAA , DAA等调整指令。, 单操作数: 指令中给出一个操作数。,有两种可能: 有些操作只需要一个操作数 如 INC AL ; (AL) (AL)+ 1 有些操作将另一个操作数隐含在指令中 如 MUL BL ; (AX) (AL)(BL),操作数类型,指令应指明参与操作的数是字节还是字,即操作数的类型。 通常操作数的类型可由操作数本身隐含给出。 只在特殊情况下需要指明。,8086/8088: 有的操作既可对字节操作,又可对字操作 有的操作只允许对字操作, 指令中有寄存器操作数,由寄存器操作数决定类型。,例 : MOV 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 寻址方式 指明操作数的来源,即寻找(得到)操作数的方法。,以数据传送指令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,源操作数和目的操作数能在以下寄存器中: 32 位操作数:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP 8 位操作数: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-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 源操作数为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 则内存操作数的物理地址为: 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 ,与寄存器间接寻址相同 如: MOV AL, BX +10H MOV AH, DI+20H MOV DL, 30H SI MOV DH, 40H BP ,默认段寄存器的关系与寄存器间接寻址相同 使用BX、SI、DI,默认段寄存器为DS (BX) PA = ( DS )10H + (SI) + 偏移量 (DI) 使用BP,默认段寄存器为SS PA = ( 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 ) = 200H 则内存操作数的物理地址为: 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)=0456H, (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 + SI + 1000H 若 ( DS ) = 3000H ( BX ) = 0700H ( SI ) = 0300H 则内存操作数的物理地址为: PA = ( DS )10H + ( BX ) + ( SI ) + 10H = 32000H,D:DEBUG -A 0AFA:0100 MOV CL, AX Error 0AFA:0100 MOV AX, DX Error 0AFA:0100 MOV AL, CX Error 0AFA:0100 MOV CX, BP+BX Error 0AFA:0100 MOV AH, SI+DI Error 0AFA:0100 MOV BL, AX+CX Error 0AFA:0100 -,利用DEBUG可判断下列寻址方式错:,1、设有关寄存器及存储器单元的内容如下: 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。 问下列各条指令执行完后,AL或 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、设有关寄存器及存储器单元的内容如下: 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, 31301H98H, 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指令的源操作数为基址变址寻址方式且为字操作,执行该指令时是将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,所以该指令执行完后,AL=6DH。,一. 数据传送指令 二. 算术运算指令 三. 逻辑运算指令 四. 控制转移指令 五. 处理机控制指令 六. 串操作指令,3.4 IA-32通用指令,概述 1. 指令助记符表 2. 学习指令的要点 3. 利用DEBUG程序,学习指令系统 4. 指令中操作数的表示 5. 书写指令注意事项,1. 指令助记符表,2. 学习指令的要点 从以下几个方面来掌握一条指令: 指令的助记符 指令的格式:操作数的个数、类型 执行的操作:指令执行后的结果 包括: 哪些寄存器、内存单元的值发生了变化,对标志位有无影响,哪些受影响 只介绍常用的指令,其他需要时可自学。,4. 指令中操作数的表示,对双操作数指令 不能两个同为存储器操作数 MOV DI , SI 目的操作数不能是立即数 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,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,3000H 4. 不允许在两个段寄存器之间传送数据 MOV DS, ES 5. MOV 指令不影响标志位。 例1: 把地址为AREA1(段内偏移量)的存储单元的内容,传送至同一 段内的地址为AREA2的存储单元中。,Mov AL, AREA1 Mov AREA2, AL,例2:若要传送的不是一个字节,而是一个数据块,(例如内有100个字 节),如何实现?,mov si, offset area1 mov di, offset area2 mov cx, 100 Again: mov al, si; mov di, al inc si inc di dec cx jnz again,几个不能送的解决办法: MOVAL,mem1;通过寄存器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 堆栈按照先进后出的原则组织的一段内存区域。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 reg PUSH mem/reg PUSH segreg POP指令的格式同PUSH指令,堆栈指令使用时应注意两点: 堆栈操作总是按字进行 不能从栈顶弹出一个字给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,220H INAL,DX;将220H端口内容读 入AL累加器,(2)输出指令OUT格式:OUT port,AL OUT DX,AX,5、扩展指令,(1)CWD CWD能把在AX中的字的符号扩展到DX中,形成32位的操作数。若AX8000,则0DX,否则FFFFH DX。,(2)CBW CBW把在寄存器AL中的字节的符号送至AH中。若AL=80H,则扩展后FFH AH。,三、 算术运算指令,算术运算指令涉及两种类型数据,即无符号数和有符号数。对加法指令和减法指令而言,无符号和有符号数可采用同一套指令,其条件有两个: 一是参加的操作数必须同为无符号数或同为有符号数。 二是要采用不同标志位来检查无符号数和有符号数的运算结果是否溢出。,下面看一下两个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 0111 +247 +(-9) 10111 1111 383 -129 结果127 CF=1 OF=1 上面四种情况清楚说明,CF标志可用来表示无符号数的溢出,OF标志可用来表示有符号数的溢出。 需要指出的是有符号数的溢出是一种出错,在运算过程中应当避免。,加法指令,减法指令,乘法指令,除法指令,十进制调整指令,不带进位的加法指令ADD. 格式有:ADDac,data ADDmem/reg,data ADD mem/reg1,mem/reg2 ADD指令对标志位(指状态标志)都有影响.,1. 加法指令,注意: 该指令适合有符号数和无符号数的运算。,例1:MOV DX, 4652H ADD DX, 0f0f0h,执行后: (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, First ADD AX, Second MOV Third, AX MOV AX, First+2 ADC AX, Second+2 MOV 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,First Second Third,65 F3 02 00 24 E0 05 00 89 D3 08 00,格式: INCreg INCreg/mem 功能: 用于在循环中修改地址指针及循环次数等。 例: INC AL INCBYTE PTRBX+4 本指令除CF外,对其余标志均有影响。 注意: (1) 该指令将操作数视为无符号数; (2) 该指令不影响 进位标志 C,(3) 加1指令INC(单操作数指令),2. 减法指令 SUB DST, SRC 源操作数:通用寄存器、存储器、立即数 目的操作数:通用寄存器、存储器 执行的操作: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,注意: 同加法指令 有符号数的溢出用溢出标志 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,X Y Z W,65 F3 02 00 24 E0 05 00 89 D3 08 00,MOV AX, X MOV DX, X+2 ADD AX, Y ADC DX, Y+2 ; X+Y ADD AX, 24 ADC DX, 0 ; X+Y+24 SUB AX, Z SBB DX, Z+2 ; X+Y+24-Z MOV W, AX MOV 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。 NEG BX 执行指令后(60010H)=B9H,CMP DST, SRC 源操作数:通用寄存器、存储器、立即数 目的操作数:通用寄存器、存储器 执行的操作: DST - SRC 注:该指令影响标志位 注意: (1) 该指令同 SUB , 但其不保存运算结果; (2) 该指令后面通常跟一条转移指令,根据标志位 产生不同的程序分支。,比较指令主要用于两个数之间的关系:大、小、相等。 如:A, B 1. 比较相等。 只要看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 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=-1 A=-1,B=1,8088中有几条用于判断有符号数大小的转移指令,如: JG / JNLE 大于则转移 条件为: O S =0 且 Z=0 JL / JNGE 小于则转移 条件为: O S =1 同样有几条用于判断无符号数大小的转移指令,如: JA / JNBE 高于则转移 条件为: C=0 且 Z=0 JBE / JNA 低于或等于则转移 条件为: C=1 或 Z=1 JNZ 不等于0则转移,JNC 若无进位则转移 即C=0则转移 JC 若有进位则转移 即C=1则转移,例4:比较两个无符号数的大小,并将大数存入AL中。,X Y,65 F3 02 00 24 E0 05 00 89 D3 08 00,MOV AL, X MOV BL, Y CMP AL,BL ;AL-BL JNC NEXT ;65-F3 MOV AL,BL NEXT: HLT,JNC 若无进位则转移 即C=0则转移,例5:比较两个带符号数的大小,并将大数存入AL中。,X Y,65 F3 02 00 24 E0 05 00 89 D3 08 00,MOV AL, X MOV BL, Y CMP AL,BL JG NEXT MOV AL,BL NEXT: HLT,JG 大于则转移 条件为: O S =0 且 Z=0,例6:若自Block开始的内存中有100个带符号数,找出最大值存入Max单元。,Block,65 F3 02 00 24 E0 05 00,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则转移,JG 大于则转移,例7:在分别由Data1和Data2开始的两个 内存区域中,分别存放着5个1字节 的无符号数,如果Data1中的第N个 数大于Data2中的第N个数,则进行 Data1N Data2N 运算,否则 进行 Data1N + Data2N 运算, 运算结果存回Data1中,Data1 Data2,65 F3 02 00 24 E0 05 00 89 D3,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: MOV SI, AL INC SI INC DI DEC CX JNZ Again HLT,Data1 Data2,65 F3 02 00 24 E0 05 00 89 D3,JC 若有进位/借位则转移 JNZ 若不为0则转移,3. 乘法指令 MUL SRC 无符号数乘法 源操作数:通用寄存器、存储器(不能是立即数) 目的操作数:DX, AX (隐含) 执行的操作:字节操作 (AH,AL) (AL)(SRC) 字操作 (DX,AX) (AX)(SRC) 注:该指令影响标志位,IMUL SRC 带符号数乘法 源操作数:通用寄存器、存储器(不能是立即数) 目的操作数:DX, AX (隐含) 执行的操作:字节操作 (AH,AL) (AL)(SRC) 字操作 (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) 十进制数的表示 BCD码 用二进制编码的十进制数。 压缩 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 0 1 2 3 4 5 6 7 8 9,(2)调整原理,MOV AL,48 ADD AL,27 DAA,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 加法后进行ASCII调整指令。,这条指令对在AL中的由两个未组合的十进制操作数相加后的结果进行校正,产生一个未组合的十进制数。 两个未组合的十进制数可以直接用ADD指令相加,但要得到正确的未组合的十进制结果,必须在加法指令以后,紧接着用一条AAA指令来加以校正,则在AX中就可以得到正确的结果。 所谓未组合的十进制数,就是一位十进制数,也即十进制数字的ASCII码的高四位置为0以后所形成的数码。即6为00000110,7为00000111等。当这样的两个数相加(必须有一个在AL中)以后,要在AX中得到正确的仍是未组合的十进制结果,就必须进行调整。因为6713,则应该在AL中为00000011,而在AH中(若初始值为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 右移一位 操作数2 算术移位指令适用于带符号数的运算。 逻辑移位指令适用于无符号数的运算。,例3:请求出AL中“1”的个数,存在AH中。 MOV AH, 0 Again: SHL AL, 1 ADC AH, 0 CMP AL, 0 JNZ AGAIN HLT MOV AH,0 MOV CL,8 Again: SHL AL,1 JNC Next INC AH Next: DEC CL JNZ Again HLT,JNC 若无进位则转移 JNZ 若不为0则转移,3. 循环移位指令 ROL OPRD, CNT 循环左移 操作数:通用寄存器、存储器 CNT:移位次数,当CNT1时,应将其赋给CL寄存器 执行的操作: 注:该指令影响标志位 C 视结果而定; O 只当CNT=1时有效, 移位后当最高有效位发生变化时(如 1变 0) O=1, 否则 O=0 。,C,OPRD,ROR OPRD, CNT 循环右移 操作数:通用寄存器、存储器 CNT:移位次数,当CNT1时,应将其赋给CL寄存器 执行的操作: 注:该指令影响标志位 C 视结果而定; O 只当CNT=1时有效, 移位后当最高有效位发生变化时(如 1变 0) O=1, 否则 O=0 。,C,OPRD,RCL OPRD, CNT 带进位的循环左移 操作数:通用寄存器、存储器 CNT:移位次数,当CNT1时,应将其赋给CL寄存器 执行的操作: 注:该指令影响标志位 C 视结果而定; O 只当CNT=1时有效, 移位后当最高有效位发生变化时(如 1变 0) O=1, 否则 O=0 。,C,OPRD,RCR OPRD, CNT 带进位的循环右移 操作数:通用寄存器、存储器 CNT:移位次数,当CNT1时,应将其赋给CL寄存器 执行的操作: 注:该指令影响标志位 C 视结果而定; O 只当CNT=1时有效, 移位后当最高有效位发生变化时(如 1变 0) O=1, 否则 O=0 。,C,OPRD,例4: 在内存某一缓冲区中,存 放着若干用BCD码表示的 十进制数,每一个单元中 存放两位,要求将它们转 换成ASC码,存放在缓 冲区,高4位的BCD码转换 的ASC码放在地址较高 的单元。,BCDBUF ASCBUF,65 23 02 00 24 35 36 33 32 32 30,综合例题,开始,设地址,设转换个数,转换低 4 位,取数,存结果,转换高 4 位,存结果,CX -1-CX,CX=0?,结束,流程图,MOV SI, Offset BCDBUF MOV DI, Offset ASC BUF MOV CH, Count Again: MOV AL, SI INC SI MOV BL, AL AND AL, 0FH OR AL, 30H MOV DI, AL INC DI MOV AL, BL ; 0 1 1 0, 0 1 0 1 MOV CL, 4 SHR AL, CL ; 0 0 0 0, 0 1 1 0 OR AL, 30H ; 0 0 1 1, 0 1 1 0 MOV DI, AL INC DI DEC CH JNZ Again HLT,BCDBUF ASCBUF,65 23 02 00 24 35 36 33 32 32 30,0 1 1 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 1 0 1,SI,DI,逻辑移位可用于无符号数乘除 算术移位 、 带符号数 、 左移一次,相当于乘2 右移一次,相当于除2 例 将AL中的带符号数乘10 , 若(AL)=X SAL AL ,1 ; (AL)=2X MOV BL ,AL ; (BL)=2X SAL AL ,1 ; (AL)=4X SAL AL ,1 ; (AL)=8X ADD AL ,BL ; (AL)=(8X+2X)=10X,分类,指令,功能,无条件转移指令,条件转移指令,循环指令,子程序调用及 返回指令,中断指令,JMP OPRD,JNZ OPRD(等),LOOP OPED LOOPE/LOOPZ OPRD LOOPNE/LOOPNZ OPRD,CALL OPRD RET,INT N INTO IRET,无条件转移,根据上一条指令设置的 标志位的情况转移,计数非零循环,计数非零循环且结果为0循环,计数非零循环且结果不为0循环,调用子程序,从子程序返回,软中断,溢出时中断,中断返回,重点掌握:JMP, JZ, JNZ, JC, LOOP CALL, RET, INT N, IRET,3.4.6 控制转移指令,段内转移,段间转移,段内直接短转移,段内直接近转移,段内间接转移,段间直接转移,段间间接转移,JMP SHORT OPRD,JMP NEAR OPRD,JMP WORD PTR OPRD,JMP FAR PTR OPRD,JMP DWORD PTR OPRD,1. 无条件转移指令,JMP ,分类,名称,指令,-128127,-3276832767,-3276832767,转移范围,段间,段间,2. 条件转移指令,根据上一条指令影响的状态位来判断是否转移。 特点: 1. 条件转移指令全部为段内转移 2. 目标地址在当前指令的 -128127 范围内。 3. 目标地址由操作数OPRD确定。 3. 条件转移指令不影响标志位。,05 10 01 D8 74 03 A2 00 20 F4,+127,-128,105 106 107 108 109 10a 10b 10c 10d 10e,Add ax,bx Jz next Mov 2000,ax Next: hlt,根据单个条件标志的设置情况转移,根据组合条件标志的设置情况转移 主要用来比较两个数的大小,无符号数大小的比较,带符号数大小的比较,例1:两无符号数相加,结果正确则Ax 中存入1,若溢出则AX中存入0。,Mov ax, x Mov bx, y Add bx, ax Jo error Mov ax, 1 Jmp exit error : mov ax, 0 exit: hlt,例2:有一组无符号数,与50比较,大于50 的存入另一存储区,小于或等于50的放弃。,MOV si, Offset array1 MOV di, Offset array2 Mov cx, n Again: Mov al,si Inc si Cmp al, 50 Jbe next Mov di, al Inc di next: Dec cx Jnz again Hlt,05 A2 00 10 85,array1,array2,A2 85,MOV SI, Offset String MOV CX, 0AH MOV AL, 20H ; 空格的ASCII码为20H MOV AH, 0H ; 结果在AH中 AGAIN: CMP AL, SI JZ ADDA JMP CONT ADDA: INC AH CONT: INC SI DEC CX JNZ AGAIN HLT,例3:数出长度为10的,以STRING为首地址的字符串中空格的个数。,41 42 43 20 45 46 20 48 20 49,string,3. 重复操作指令(循环指令) LOOP OPRD,CX 循环次数,循环体,LOOPZ (CX=0? Z=0?),Y,N,MOV SI, Offset STRING MOV CX, 0AH MOV AL, 20H ; 空格的ASCII码为20H MOV AH, 0H ; 结果在AH中 AGAIN: CMP AL, SI JZ ADDA JMP CONT ADDA: INC AH CONT: INC SI LOOP AGAIN HLT,例4:数出长度为10的,以STRING为首地址的字符串中空格的个数。,循环条件:CX0 (CX)-1 CX (CX)=0? 是,循环结束 否,继续循环,转向的地址范围在 -128 +127 之间,4. 子程序调用及返回指令,段内 调用,段间 调用,直接调用,间接转移,直接调用,间接调用,CALL NEAR PTR OPRD,CALL FAR PTR OPRD,CALL DWORD PTR OPRD,CALL RET,分类,名称,指令,CALL WORD PTR OPRD,CALL change,CALL BX,CALL far ptr tran,CALL DWORD PTRBX,举例,返回,返回,带立即数 返回,RET,RET EXP,RET,RET 6,near-标号,far-标号,16位寄存器 存储器,存储器(32位),操作数,操作: 段内调用:CALL 标号 段内返回: RET,CALL在很多方面与无条件指令相似它也使控制流发生转移,但是,CALL指令调用一个过程,通常是要返回的,为此,CALL指令要保存返回地址(CALL指令的下一条要执行的指令的地址)。以便返回.,传送程序控制至位于堆栈顶部的返回地址。此地址是由CALL指令放在堆栈上的。通常返回指令返回至CALL指令的下一条指令。,5. 中断指令,中断子程序: 是一种特殊的子程序, (DOS系统中有大量这样的子程,用户也可以编写这样的子程) 特殊在它的调用方法与普通的子程序不同。,中断调用指令INT,格式 INT N ;其中 N=0 FFH 即0255,中断返回指令IRET 格式
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!