首页 微型计算机原理及应用课程教案5

微型计算机原理及应用课程教案5

举报
开通vip

微型计算机原理及应用课程教案5微型计算机原理及应用课程教案5 第5章 86系列微型计算机的指令系统 教学时数:8学时 教学目的与要求:掌握86系列汇编语言指令语句格式,正确使用86系列CPU的各 种寻址方式,掌握传送类指令的不同使用场合及使用方法,掌握数据操作类指令的使用方法,掌握串操作指令的使用。 教学重点:指令格式,各种寻址方式的不同使用情况,传送类指令的不同使用场合及使用方法,数据操作类指令的使用方法,串操作指令的使用。 教学难点:8086/8088CPU的指令系统及指令的应用。 指令是让计算机完成某种操作的命令,指令的集合...

微型计算机原理及应用课程教案5
微型计算机原理及应用课程教案5 第5章 86系列微型计算机的指令系统 教学时数:8学时 教学目的与要求:掌握86系列汇编语言指令语句格式,正确使用86系列CPU的各 种寻址方式,掌握传送类指令的不同使用场合及使用方法,掌握数据操作类指令的使用方法,掌握串操作指令的使用。 教学重点:指令格式,各种寻址方式的不同使用情况,传送类指令的不同使用场合及使用方法,数据操作类指令的使用方法,串操作指令的使用。 教学难点:8086/8088CPU的指令系统及指令的应用。 指令是让计算机完成某种操作的命令,指令的集合称作指令系统,不同系列计算机有不同的指令系统。指令是根据计算机CPU硬件特点研制出来的,指令的符号用规定的英文字母组成,称为助记符。指令系统与计算机硬件有着某些对应关系,用指令进行编程能够充分开发计算机硬件资源,它的程序目标代码短、运行速度快,因此,指令语言是面向机器的语言,它在自动控制、智能化仪器仪 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 、监测等领域应用非常广泛。 86系列指令系统是在8位微处理器86系列的指令系统基础上设计的,它兼容了86系列的全部指令,这部分对8位微处理器具有兼容性的指令往往是处理字节(8位)的。此外,86系列还有自己所特有的对字或字符串的处理指令,以及对带符号数的运算指令,中断指令和协处理器指令。 5.1 86系列汇编语言及指令的格式与寻址方式 5.1.1 86系列汇编语言指令语句格式 任何一种汇编语言的指令语句都是与机器指令一一对应的,它通过汇编程序将其翻译成机器指令代码(目标代码),让CPU执行某种操作。86系列汇编语言指令语句格式如图5.1所示。图中由前向后的箭头表示是可选项,由后向前的箭头表示是重复项,圆头方框表示是语句中的关键字。 图5.1 汇编语言指令语句格式 (1) 标号是给该指令所在地址取的名字,必须后跟冒号“:”,它可以缺省,是可供选择的标识符。86系列汇编语言中可使用的标识符必须遵循下列规则: ? 标识符由字母(a,z,A,Z)、数字(0,9)或某些特殊字符(@,-,?)组成。 ? 第一个字符必须是字母(a,z,A,Z)或某些特殊的符号(@,-,?),但“?”不能单独作标识符。 ? 标识符有效长度为31个字符,若超过31个字符,则只保留前面的31个字符为有效标识符。 101 下面是有效的标识符: START: MY-CODE: ALPHA: NUM@-1: LOOP1: X: ?MORE,350: BETA,1: DELAYIS: 下面是无效的标识符: 4LOOP: MAIN A/B: BETA*: START,3: GAMA,1: NUM+1: ?: ONE*TWO: (2) 指令助记符是指令名称的代表符号,它是指令语句中的关键字,不可缺省,它表示本指令的操作类型,必要时可在指令助记符的前面加上一个或多个“前缀”,从而实现某些附加操作。 (3) 操作数是参加本指令运算的数据,有些指令不需要操作数,可以缺省;有些指令需要两个操作数,这时必须用逗号(,)将两个操作数分开;有些操作数可以用表达式来表示。 (4) 注释部分是可选项,允许缺省,如果带注释则必须用分号(;)开头,注释本身只用来对指令功能加以说明,给阅读程序带来方便,汇编程序不对它做任何处理。 5.1.2 86系列 CPU的寻址方式 1. 立即数寻址 8086 CPU指令系统中,有一部分指令所用的8位或16位操作数就在指令中提供,这种方式叫立即数寻址方式。例如: MOV AL,80H;将十六进制数80H送入AL MOV AX,1090H;将1090H送AX,AH中为10H,AL中为90H 采用立即数寻址方式的指令主要用来对寄存器赋值。因为操作数可以从指令中直接取得,不需要运行总线周期,所以,立即数寻址方式的显著特点就是速度快。 立即数可以为8位,也可以为16位;规定立即数只能是整数,不能是小数、变量或者其他类型的数据;另外还要注意,立即数只能作为源操作数。 2. 寄存器寻址 如果操作数就在CPU的内部寄存器中,那么寄存器名可在指令中指出。这种寻址方式就叫寄存器寻址方式。 对16位操作数来说,寄存器可以为AX,BX,CX,DX,SI,DI,SP或者BP,而对8位操作数来说,寄存器可为AH,AL,BH,BL,CH,CL,DH,DL。例如: INC CX ;将CX的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 加1 ROL AH,1 ;将AH中的内容循环左移一位 采用寄存器寻址方式的指令在执行时,操作就在CPU内部进行,不需要使用总线周期,因此,执行速度快。在一条指令中,可以对源操作数采用寄存器寻址方式,也可以对目的操作数采用寄存器寻址方式,还可以两者都用寄存器寻址方式。 102 3. 直接寻址 使用直接寻址方式时,数据总是在存储器中,存储单元的有效地址由指令直接指出,所以直接寻址是对存储器进行访问时可采用的最简单的方式。例如: MOV AX,,1070H, ;将DS段的1070H和1071H两单元的内容取到AX中 要注意的是采用直接寻址方式时,如果指令前面没有用前缀指明操作数在哪一段,则默认为段寄存器是数据段寄存器DS。例如,上一条指令执行时,设DS,2000H,则执行过程是将绝对地址为21070H和21071H两单元的内容取出送AX。 如果要对其它段寄存器所指出的存储区进行直接寻址,则本条指令前必须用前缀指出段寄存器名。例如: CS:MOV BX,,3000H,;将CS段的3000H和3001H两单元的内容送BX 设CS为5100H,则本指令在执行时,将54000H和54001H两单元的内容取出送BX。 4. 寄存器间接寻址 采用寄存器间接寻址方式时,操作数一定在存储器中,存储单元的有效地址由寄存器指出,这些寄存器可以为BX,BP,SI和DI之一,即有效地址等于其中某一个寄存器的值: ,,BX,, ,,BP,,,, EA=,,SI,,,, ,,DI,,,, 和直接寻址的情况一样,如果指令前面没有用前缀指明具体的段寄存器,则寻址时默认的段寄存器通常为DS。如寄存器为BP时,则对应的段寄存器为SS。 采用寄存器间接寻址时,允许在指令中指定一个位移量,这样,有效地址通过将一个寄存器的内容加上一个位移量来得到。位移量可以为8位,也可以为16位。即: ,,BX,,,,BP,,8位位移量,,,, EA=,,,,,16位位移量SI,,,,,,,,DI,,,, 在有些资料中,将位移量看成是一个相对值,因此把带位移量的寄存器间接寻址叫寄存器相对寻址。 细分起来,寄存器间接寻址可分为以下4种: (1) 以BX寄存器进行间接寻址——数据段基址寻址。用BX寄存器进行间接寻址时,默认的段寄存器为DS,因为BX称为基址寄存器,所以这种寻址方式也叫数据段基址寻址。例如: AX,,BX, MOV 设DS,5000H,BX,3000H,则本指令在执行时,将53000H和53001H两单元的内容送AX。 103 如果要对其它段寄存器所指的区域进行寻址,则必须在指令前用前缀指出段寄存器名。例如: ES?MOV CX,,BX, 设ES,3000H,BX,4000H,则本指令在执行时,将34000H和34001H两单元的内容送CX。 (2) 以BP寄存器进行间接寻址——堆栈段基址寻址。如果以寄存器BP对操作数进行间接寻址,则必须注意,操作数默认在堆栈段中,因为BP称为基址寄存器,所以这种寻址方式通常称为堆栈段基址寻址。例如: MOV BX,,BP, 设SS,5000H,BP,4000H,则本指令在执行时,将54000H和54001H两单元的内容送BX。 (3) 以SI和DI寄存器进行间接寻址——变址寻址。SI和DI寄存器分别称为源变址寄存器和目的变址寄存器,所以用这两个寄存器来进行间接寻址也叫变址寻址。变址寻址通常用于对数组元素进行操作,另外,在“5 4串操作指令中还将讲到有些串操作指令要求用固定的变址寄存器对操作数进行寻址,操作过程中,指令会自动修改变址寄存器中的地址,以指向下一个操作数。 (4) 将BX,BP和SI,DI寄存器组合起来进行间接寻址——基址加变址的寻址。通常将BX和BP称为基址寄存器,将SI和DI称为变址寄存器。8086指令系统允许把基址寄存器和变址寄存器组成起来构成一种新的寻址方式,叫基址加变址的寻址。用这种寻址方式时,操作数的有效地址是1个基址寄存器(BX或BP)的内容加上一个变址寄存器(SI或DI)的内容。 ,,,,BXSI,,,,,,,,即: EA=+,,,,BPDI,,,,,,,,,,,, 例如: MOV AX,,BX+SI, 设DS,1000H,BX,5000H,SI,2000H,则上面指令在执行时,有效地址为7000H,本指令将17000H和17001H两单元的内容取到AX中。 图5.2对堆栈中数组的访问在基址加变址的寻址方式中,只要用上BP寄存器,那么默认的段寄存器就是SS;在其它情况下,默认的段寄存器均为DS。如果操作数不在默认段,则要用前缀指出相应的段寄存器名。用基址加变址的寻址方式时,与变址寻址、基址寻址的情况类似,也允许带一个8位或16位的位移量。带位移量的基址加变址的寻址,在有些资料中也称为相对的基址加变址寻址。例如: MOV AX,,BX+SI+0050,;将BX和SI中的内容与0050相加作为有效地址 由于基址加变址的寻址方式中,允许两个地址分量分别改变,而且有一个对段寄存器的约定规则——即如果基址寄存器用BX,则默认的段寄存器为DS;如果基址寄存器用BP,则默认的段寄存器为SS——这种寻址方式使用起来很灵活,特别是为堆栈中数组的访问过程 104 提供了极大的方便。 如图5.2所示,在访问堆栈数组时,可以在BP中存放堆栈顶的地址,位移量表示数组第一个元素到栈顶的距离,变址寄存器SI(也可为DI)指出数组元素。 图5.2 对堆栈中数组的访问 图5.3对8086有关操作数的各种寻址方式进行了 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 。图中不仅指出了每种寻址方式下操作数的来源,还表明了有效地址的计算方法。 图5.3 8086系列的操作数寻址方式 为了使读者对各种寻址方式有个比较,下面举一个综合性的例子。 【例5.1】设BX,0158H,DI,10A5H,位移量,1B57H,DS,2100H,并假定没有使用段 105 前缀,即把DS作为操作数对应的段寄存器。 在各种寻址方式下,这些寄存器和位移量所产生的有效地址和物理地址为: ?直接寻址: 有效地址,1B57H 物理地址,21000H+1B57H,22B57H ?寄存器间接寻址(寄存器为BX): 有效地址,0158H 物理地址,21000H+0158H,21158H ?BX寄存器相对间接寻址: 有效地址,0158H+1B57H,1CAFH 物理地址,21000H+1CAFH,22CAFH ?变址寻址(寄存器为DI): 有效地址,10A5H 物理地址,21000H+10A5H,220A5H ?DI寄存器相对变址寻址: 有效地址,10A5H+1B57H,2BFCH 物理地址,21000H+2BFCH,23BFCH ?基址加变址的寻址(BX为基址寄存器,DI为变址寄存器): 有效地址,0158H+10A5H,11FDH 物理地址,21000H+11FDH,221FDH ?相对的基址加变址的寻址(BX为基址寄存器,DI为变址寄存器): 有效地址,0158H+10A5H+1B57H,2D54H 物理地址,21000H+2D54H,23D54H 5.2 传送类指令 传送类指令是指令系统中最活跃的一类指令,也是条数最多的一类指令,主要用于数据的保存及交换等场合。我们把这类指令分为4种,并把各种指令操作码助记符和对应的操作数列表格如表5.1所示。 的内部寄存器或者内存单元。例如:在子程序调用和中断处理过程时,分别要保存返回地址和断点地址,在进入子程序和中断处理后,还需要保留通用寄存器的值;子程序返回和中断处理返回时,则要恢复通用寄存器的值,并分别将返回地址或断点地址恢复到指令指针寄存器中。这些功能都要通过堆栈来实现,其中寄存器的保存和恢复需要由堆栈指令来完成。 86系列指令系统中提供了专用的堆栈操作指令,其中PUSH是把字压入堆栈,POP是把字弹出堆栈。在程序中采用堆栈操作指令时,应预置堆栈段寄存器SS、堆栈指示器SP的值,同时,使SP的内容为当前堆栈段的栈顶。 5.2.1 通用数据传送指令 106 通用传送指令中包括最基本的传送指令MOV,堆栈指令PUSH和POP,数据交换指令XCHG。 1. 最基本的传送指令 MOV指令是形式最简单、用得最多的指令。它可以实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU在执行PUSH指令时,首先,堆栈指示器SP自动减2;然后,将一个字以源操作数传送至栈顶。POP指令的执行过程正好与PUSH指令相反,它把由SP指出的当前堆栈段的栈顶的一个操作数(一个字),传送到目的操作数中,然后,SP自动加2,指向新的栈顶。POP指令中的目的操作数可以是除代码段寄存器CS之外的其它寄存器和存储器。在86系列指令系统中,不允许CS寄存器作为目的操作数使用。这是因为,一旦改变了代码段寄存器CS的内容,使程序有了新的当前代码段,就会导致CPU从新的CS和IP给出的毫无意义的地址中去取下一条指令,使程序错误运行。 例如,将16位通用寄存器CX的内容压入堆栈,然后,弹出栈顶至CX中,已知:(SS),0200H,(SP),0008H,(CX),12FAH,其示意图如图5.4和图5.5所示。 图5.4 PUSH CX指令的操作过程示意图 堆栈中的内容是按后进先出的次序进行传送的,因此,保存内容和恢复内容时,要按照对称的次序执行一系列压入指令和弹出指令。例如,在一段子程序中需要保护段寄存器DS和ES的内容,在子程序结束时,则要恢复相应的DS和ES内容,程序如下: PUSH DS PUSH ES …… POPES POPDS 107 图5.5 POP CX指令的操作过程示意图 3. 交换指令 交换指令XCHG可以实现字节交换,也可以实现字交换。交换过程可以在CPU的内部寄存器之间进行,也可以在内部寄存器和存储单元之间进行,但不能在两个存储单元之间执行数据交换过程。例如: XCHG AL,BL ;AL和BL之间进行字节交换 XCHG BX,CX ;BX和CX之间进行字交换 XCHG ,2530,,CX ;CX中的内容和2530,2531两单元的内容交换 4. 换码指令 XLAT是一条完成字节翻译功能的指令,称为换码指令。它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。使用换码指令时,要求BX寄存器指向表的首地址,AL中为表中某一项与表格首地址之间的偏移量,指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中去。图5.6表示了换码指令的功能。XLAT指令就是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。 图5.6 换码指令的功能 执行XLAT指令可将任意一个十进制数翻译成7段显示码,其操作步骤如下: (1) 将译码表定位到某个逻辑段的一片连续地址中,并将其表首址的偏移地址置入BX 108 寄存器中。 (2) 将待翻译的十进制数字送入AL寄存器中。 (3) 执行XLAT指令。 例如,假设这段数据存放在偏移地址为2000H开始的内存中,取出“3”所对应的7段码,用如下几条程序助记符即可完成: MOV BX,2000H MOV AL,3 XLAT 5.2.2 目标地址传送指令 这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏移地址,共包含以下3条指令: 1. 取有效地址指令 取有效地址指令LEA的功能是将存储器地址送到一个寄存器。LEA指令格式中,要求源操作数必须为内存单元地址,目的操作数必须为一个16位的通用寄存器。这条指令常用来使一个寄存器作为地址指针。例如: LEA AX,,2728, ;将2728单元的偏移量送AX,指令执行后,AX中为2728 LEA BX,,BP+SI, ;指令执行后,BX中的内容为BP+SI的值 LEA SP,,0482, ;使堆栈指针SP为482 2. 将地址指针装到DS和另一个寄存器的指令 LDS指令的功能是把4个字节的地址指针(其中包括一个段地址和一个偏移量)传送到两个目的寄存器,其中,地址指针的后两个字节即段地址一定送到DS中。 比如,设2130H,2133H这4个单元中存放着一个地址,2130H和2131H中为地址的偏移量,2132H和2133H中为地址的段值,执行指令: LDS DI,,2130H, 使2130H和2131H中的偏移量送到DI,2132H和2133H中的段值送到DS。 3. 将地址指针装到ES和另一个寄存器的指令 LES指令与LDS指令的操作基本相同,所不同仅在于将源操作数所指向地址指针中的段基址(后两个字节)传送到ES段寄存器,而不是DS段寄存器。 5.2.3 标志位传送指令 可完成标志位传送的指令共有4条: 1. 读取标志指令 读取标志指令LAHF被执行时,将标志寄存器中的低8位传送到AH中,如图5.7所示。 2. 设置标志指令 设置标志指令SAHF被执行时,将AH寄存器的相应位传送到标志寄存器的低8位。用图表示,就是将图5.7的5个箭头方向反过来。 109 图5.7 LAHF指令的功能 3. 对标志寄存器的压入堆栈指令和弹出堆栈指令 PUSHF指令将标志寄存器的值压入堆栈顶部,同时,堆栈指针SP的值减2,此指令在执行时标志寄存器的值不变。POPF指令的功能正好相反,此指令在执行时从堆栈中弹出一个字送到标志寄存器中,同时堆栈指针SP的值加2。PUSHF和POPF指令一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。 5.2.4 输入/输出数据传送指令 输入/输出指令用来完成累加器(AX/AL)与I/O端口之间的数据传送功能。 执行输入指令时,CPU可以从一个8位端口读入一个字节到AL中,也可以从两个连续的8位端口读一个字到AX中。 执行输出指令时,CPU可以将AL中的一个字节写到一个8位端口中,或者将AX中的一个字写到两个连续的8位端口中。例如: AL,50H ;将50H端口的字节读入AL IN IN AX,70H ;将70H、71H两端口的值读入AX,70H端口的内容读入AL,71H ;端口的内容读入AH IN AL,DX ;从DX所指的端口中读取一个字节 IN AX,DX ;从DX和DX+1所指出的两个端口中读取一个字,较低地址端口 ;中的值读到AL中,较高地址端口中的值读到AH中 OUT 44H,AL ;将AL中的一个字节输出到44H端口 OUT 80H,AX ;将AX中的内容输出到80H,81H两端口,AL中的内容输出到 ;80H,AH中的内容输出到81H OUT DX,AL ;将AL中的字节输出到DX所指的端口中 OUT DX,AX ;将AL中的字节输出到DX所指的端口中,同时将AH中的字节输 ;出到DX+1所指的端口中 5.3 数据操作类指令 5.3.1 算术运算类指令 86系列 CPU指令系统中,具有完备的加、减、乘、除算术运算指令,可处理不带符号或带符号的8/16位二进制整数,以及不带符号的装配型/拆开型十进制整数。 1. 加法指令 (1) 不带进位位的加法指令: ADD用来执行两个字或两个字节的相加操作,结果放在原来存放目的操作数的地方。例如: ADD AL,50H ; AL和50H相加,结果放在AL中 110 ADD CX,1000H ; CX中的内容和1000H相加,结果放在CX中 ADD DI,SI ; DI和SI的内容相加,结果放在DI中 ADD ,BX+DI,,AX ; BX+DI和BX+DI+1两个存储单元的内容和AX中的内容 ; 相加,结果放在BX+DI和BX+DI+1所指的存储单元中 ADD AX,,BX+2000H, ; BX+2000H和BX+2001H所指的两单元的内容和AX的内 ; 容相加,结果放在AX中 (2) 带进位位的加法指令: ADC在形式上和功能上都和ADD指令类似,只有一点区别, 就是ADC指令被执行时,将进位标志CF的值加在和中。例如: ADC AX,SI ; AX和SI中的内容以及CF的值相加,结果放在AX中 ADC DX,,SI, ; SI和SI+1所指的存储单元的内容和DX的内容以及CF的值相加, ; 结果放在DX中 ADC BX,3000H ; BX的内容和立即数3000H以及CF的值相加,结果放在BX中 ADC AL,5 ; AL的内容和立即数5以及CF的值相加,结果送AL中 ADC指令为实现多字节的加法运算提供了方便。比如,有两个4字节的无符号数相加, 这两个数分别放在2000H和3000H开始的存储单元中,低位在前,高位在后,要求进行运算 后,得到的和放在2000H开始的内存单元中。 可以用如下程序段实现这种多字节的加法: CLC ; 清进位位CF MOV SI,2000H ; 取第一个数的首地址 MOV AX,,SI, ; 将第一个数的低16位取到AX MOV DI,3000H ; 取第二个数的首地址 ADD AX,,DI, ; 第一个数和第二个数的低16位相加 MOV ,SI,,AX ; 低16位相加的结果送到2000H,2001H单元 MOV AX,,SI+2, ; 取第一个数的高16位送到AX中 ADC AX,,DI+2, ; 两个数的高16位连同进位位相加 MOV ,SI+2,,AX ; 高16位相加的结果送到2002H,2003H单元 (3) 增量指令: INC只有1个操作数,指令在执行时,将操作数的内容加1,再送回该 操作数。这条指令一般用在循环程序中修改指针和循环次数。例如: INC AL ; 将AL中的内容加1 INC CX ; 将CX中的内容加1 INC BYTE PTR,BX+DI+500, ; 将BX+DI+500所指的存储单元的 ; 内容加1 在编程中要注意,INC指令不影响进位标志CF的状态。 2. 减法指令 (1) 不带借位的减法指令: SUB完成两个字节或两个字的相减。例如: 111 SUB BX,CX ; 将BX中的内容减去CX中的内容,结果放在BX中 SUB ,BP+2,,CL ; 将SS段的BP+2所指的单元中的值减去CL中的值, ; 结果放在BP+2所指的堆栈单元中 SUB AL,20 ; AL中的数减去20,结果放在AL中 SUB SI,5010H ; SI中的数减去5010H,结果放在SI中 SUB WORD PTR ,DI,,1000H ;DI和DI+1所指的两单元中的数减去1000H,结果放 ; 在DI和DI+1所指的单元中 (2) 带借位的减法指令: SBB在形式上和功能上都和SUB指令类似,只是SBB指令在执行减法运算时,还要减去CF的值。在减法运算中,CF的值就是两数相减时,向高位产生的借位,所以,SBB在执行减法运算时,是用被减数减去减数,并减去低位字节相减时产生的借位。和带进位位的加法指令类似,SBB主要用在多字节减法运算中。例如: SBB AX,2030H ; 将AX的内容减去立即数2030H,并减去进位位CF的值 SBB WORD PTR ,DI+2,,1000H ;将DI+2和DI+3所指的两单元的内容减去立即数 ;1000H,并减去CF的值,结果放在DI+2和DI+3所 ;指的单元中 (3) 减量指令: DEC只有1个操作数,执行时,将操作数的值减1,再将结果送回操作数。例如: DEC AX ; 将AX的内容减1,再送回AX中 DEC BL ; 将BL的内容减1,结果送回BL中 DEC BYTE PTR ,DI+2, ; 将DI+2所指的单元的内容减1,结果送回此单元 (4) 取补指令: NEG对指令中给出的操作数取补码,再将结果送回。因为对一个操作数取补码相当于用0减去此操作数,所以NEG指令执行的也是减法操作。例如: NEG AL ; 将AL中的数取补码,送回AL NEG CX ; 将CX中的内容取补码,送回CX (5) 比较指令: CMP也是执行两个数的相减操作,但不送回相减的结果,只是使结果影响标志位。例如: CMP AX,2000H ; 将AX的内容和2000H相比较,结果影响标志位 CMP AL,50H ; 将AL中的数和50H比较,结果影响标志位 CMP AX,,BX+DI+100, ; 将累加器和两个存储单元的数相比,单元地址由BX+DI+ ; 100和BX+DI+101指出 CMP DX,DI ; 将DX和DI的内容相比 一般情况,CMP指令后面经常会有一条条件转移指令,用来检查标志位的状态是否满足了某种关系。 3. 乘法指令 乘法运算是双操作数运算,但是,在指令中却只指定一个操作数,另一个操作数是隐含 112 规定的,乘法运算的隐含规则如图5.8所示。其中的操作数可以是寄存器操作数或存储器操作数,而隐含的为AL或AX。从图5.8中可以看出,两个8位数相乘,其结果是16位数;两个16位数相乘,其结果是32位数。 图5.8 乘法运算规则图 图5.9 除法运算规则图 4. 除法指令 除法运算也是双操作数运算,它的隐含规则如图5.9所示,其中的操作数与乘法指令相同。在除法运算中,如果除数8位的,则要求被除数是16位的;如果除数是16位的,则要求被除数是32位的。如果被除数的位数不够,则应在进行除法以前,预先将被除数扩展到 包括符号位)不变,因此应所需要的位数。对于带符号数,这种扩展应该保持被扩展数的值( 该是带符号位的扩展。例如,0111 0000B应扩展成0000 0000 0111 0000B,1111 0000B应扩展成1111 1111 1111 0000B。CBW和CWD指令就是分别用于这两种扩展的。 5.3.2 逻辑运算和移位指令 1. 逻辑运算指令 8086的逻辑运算指令包括AND(与),OR(或),NOT(非),XOR(异或)指令和TEST(测试)指令。 AND,OR和XOR指令的使用形式很相似,它们都是双操作数指令,即可对8位数操作,也可对16位数操作。例如: AND AL,0FH ; AL中的内容和0FH相与,结果在AL中 AND AX,1000H ; AX中的16位数和1000H相与,结果在AX中 AND AX,BX ; AX和BX中的内容相与,结果在AX中 AND DX,,BX+SI, ; DX和两个存储单元的内容相与,单元地址由BX+ ; SI和BX+SI+1指出,结果在DX中 OR AL,30H ; AL和30H相或,结果在AL中 OR AX,00F0H ; AX和00F0相或,结果在AX中 XOR AL,0FH ; AL和0FH相异或,结果在AL中 XOR AX,AX ; AX的内容本身进行异或,结果AX清零 XOR CX,1000H ; CX的内容和1000H异或,结果在CX中 TEST指令和AND指令执行同样的操作,但TEST指令不送回操作结果,而仅仅影响标志 113 位。例如: TEST AX,8000H ; 如AX的最高位为1,则ZF,0,否则ZF,1 TEST AL,01 ; 如AL的最低位为1,则ZF,0,否则ZF,1 NOT指令的操作数只有一个,它求出指令所给的操作数的反码,再送回。例如: NOT AL ; AL中内容求反码,结果在AL中 NOT BX ; BX中内容求反码,结果在BX中 NOT WORD PTR,1000H, ; 将1000H和1001H两单元中的内容求反码,再送回 ; 这两单元中 在程序设计中,一般用AND指令对一个数据的指定位清0。例如,AND AL,0FH指令就实现将高4位清0。 OR指令常常用来对一些指定位置1。例如,指令OR AL,02实现对累加器中的D1位置1。 XOR指令常常用在一些程序的开头使某个寄存器清0,以配合初始化工作的完成。例如,XOR AX,AX,使累加器清0。 NOT指令常用来将某个数据取成反码,再加上1,便得到补码。 TEST指令一般用来检测指定位是1还是0,而这个指定位往往对应一个物理量。例如,某一个状态寄存器的最低位反映一种状态,为1时,说明状态信号满足要求,于是,就可以先将状态寄存器的内容读到AL中,再用TEST AL,01指令,此后就可以通过对ZF的判断来 ,说明结果为0,即最低位为0,条件不满足;如果ZF了解此状态位是否为1。如果ZF,1 ,0,说明结果不为0,即最低位不为0,而为1,所以条件满足。 2. 移位指令 (1) 非循环移位指令: 8086指令系统中有4条移位指令,即算术左移指令SAL(shift arithmetic left)、逻辑左移指令SHL(shift logic left)、算术右移指令SAR(shift arithmetic right)和逻辑右移指令SHR(shift logic right)。通过这些指令,可以对寄存器或者内存单元中的8位或16位操作数进行移位。4条非循环移位指令所执行的操作如图5.10所示。 逻辑移位指令在执行时,实际上是把操作数看成无符号数来进行移位,所以右移时,最高位添0;算术移位指令在执行时,则将操作数看成有符号数来进行移位,所以,右移时保持最高位的值不变,这里的最高位就是符号位。 SHL和SAL这两条指令的功能完全一样,因为对一个无符号数乘以2和对一个有符号数乘以2没有什么区别,每移一次,最低位补0,最高位进入CF。在左移位数为1的情况下,移位后,如果最高位和CF不同,则溢出标志OF置1,这样,对有符号数来说,可以由此判断移位后的符号位和移位前的符号位不同;反过来,如果移位后的最高位和CF相同,则OF为0,这表示移位前后符号位没有变。 SAR和SHR的功能不同。SAR指令在执行时最高位保持不变,因为算术移位指令将最高 114 位看成符号位,而SHR指令在执行时最高位补0。 所有的移位指令在执行时,都会影响标志位CF,OF,PF,SF和ZF。 SAL,SHL,SAR和SHR指令的形式是类似的,下面以SAL指令为例来说明这些指令的使用格式。 SAL DX,1 ; 将DX中的值左移1位,最低位补0 SAL AX,CL ; 将AX中的值左移若干位,CL中指出所移的位数,比如CL中为4 ; 则AX的值左移4位 SAL AL,CL ; AL中值左移若干位,CL中指出所移位数 非循环移位指令的功能 图5.10 上述4条移位指令使用时要注意:如果只移1位,那么,指令中直接用1指出移动位数;如果左移或右移若干位,那么必须用CL寄存器预先指定所移的位数。 (2) 循环移位指令: 8086指令系统中有4条循环移位指令,即不带进位位的循环左移指令ROL(rotate left),不带进位位的循环右移指令ROR(rotate right),带进位位的循环左移指令RCL(rotate through CF left)和带进位位的循环右移指令RCR(rotate through CF right)。这4条指令的功能如图5.11所示。 图5.11 循环移位指令的功能 从功能示意图上可以看到,ROL和ROR指令在执行时,没有把CF套在循环中,而RCL和RCR指令在执行时,则连同CF一起循环移位。 这4条循环移位指令可以对字节进行操作,也可以对字进行操作,操作数可以是寄存器, 115 也可以是存储单元。和非循环移位指令一样,如果循环移位指令只移动1位,则在指令中直接指出,如果要移动若干位,则必须在CL中指定移动位数。例如: ROL BX,1 ;BX中的内容不带进位位循环左移1位 ROL WORD PTR ,DI,,CL ;DI和DI+1所指单元中的数不带进位位循环左移几位 ;CL中为移动次数 ROL和RCL指令在执行一次左移后,如果操作数的最高位和CF不等,则OF置1。因为CF是由最高位移入的,而对有符号数来说,最高位即符号位,所以CF代表了数据原来的符号。这就是说,如果一个有符号数在左移之后,新的符号位和原来的符号不同了,则会使OF为1,于是,可以根据OF的值判断循环左移操作是否造成了溢出。同样,ROR和RCR指令在执行一位右移时,如果使操作数的最高位和次高位不等,则表示移位后的数据符号和原来的符号不同了,此时也会使OF为1。因此,循环移位指令在执行后,标志位OF表示数据的符号是否有了改变。 用移位指令时,左移1位相当于将操作数乘2,右移1位相当于将操作数除2。用乘法指令和除法指令来直接执行乘、除运算,一般所需要的时间比较长,如果用移位指令来编制一些常用的乘除法程序,由于移位指令执行速度快,所以常常可以将计算速度提高五、六倍之多。 例如,下面的程序段将AL中的数乘以10: SAL AL,1, ; 将AL中数左移1位,得2X MOV BL,AL ; 2X保存在BL中 MOV CL,2 ; 移位次数置入CL中 SAL AL,CL ; 2X左移2位,得8X ADD AL,BL ; 2X加上8X,所以AL中为10X 5.4 串操作指令 串操作指令就是用一条指令实现对一串字符或数据的操作。 图5.12 字符串传送方向示意图 8086的串操作指令有如下特点: 116 (1) 通过加重复前缀来实现串操作。 (2) 可以对字节串进行操作,也可以对字串进行操作。 (3) 所有的串操作指令都用寄存器SI对源操作数进行间接寻址,并且假定是在DS段中;此外,所有的串操作指令都用寄存器DI为目的操作数进行间接寻址,并且假定是在ES段中。串操作指令是唯一的一组源操作数和目的操作数都在存储单元的指令。 (4) 串操作时,地址的修改往往与方向标志DF有关,当DF,1时,SI和DI作自动减量修改,当DF,0时,SI和DI作自动增量修改。 (5) 在同一个段内实现字符串传送时,应该将数据段基址和附加段基址设置成同一数值,即(DS),(ES),此时,仍由SI和DI分别指出源串操作数和目的操作数的偏移地址。 一条带重复前缀的串操作指令的执行过程往往相当于一个循环程序的运行。在每次重复之后,地址指针SI和DI都会受到修改,不过指令指针IP保持指向重复前缀(前缀本身也是一条指令)的偏移地址。所以,如果在执行串操作指令的过程中,有一个外部中断进入,那么,在完成中断处理以后,将返回去继续执行串操作指令。 字符串指令有许多参数是隐含约定的,如表5.8所示。 5.4.1 字符串的传送 在使用MOVS指令进行字符串传送时,要注意传送方向,其方向标志的作用如图5.12所示。如果源字符串与目标字符串不重迭(如图5.12(a)),则传送方 向没有任何影响。如果源字符串与目标字符串部分重迭(如图5.12(b)和(c)),则传送方向要特别注意。表5.8字符串指令的隐含参数隐含参数[]对应的单元源字符串的起始地址 DS:SIES:DI重复次数 CXSCAS指令的扫描值 AL/AXLODS指令的目的操作数 AL/AXSTOS指令的源操作数 AL/AX传送方向 DF,0,SI、DI自动增量 DF,1,SI、DI自动减量 如果源字符串的地址低于目标字符串的地址,则应该自动减量(DF,1);如果源字符串的地址高于目标字符串的地址,则应该自动增量(DF,0)。 5.4.2 字符串的存和取 STOS指令是把累加器AL/AX中的内容存到内存中去,如果使用了重复前缀,则可以方便地使内存的某一区域初始化为某一数值(以字节或字为单位),即顺利地完成块的填充。 例如, 使0404H开始的256个单元清0。程序如下: CLD ; 清除方向标志DF LEA DI,,0404, ; 将目的地址0404H送DI MOV CX,0080H ; 共有128个字 XOR AX,AX ; AX清0 REP STOSW ; 将256个字节清0 LODS指令是把内存中的值取到累加器AL/AX中去的。因为目标只是一个累加器,所以LODS指令前加重复前缀是没有意义的。 5.4.3 字符串的扫描和比较 117 SCAS指令是用来从目标串中查找某个关键字,要求查找的关键字应事先置入AX或AL寄存器中。SCAS指令的操作是将AX/AL寄存器中的关键字减去由DI所指向的目标串中一个元素,不传送结果,只根据结果置标志位,修改DI寄存器内容指向下一元素。通常在SCAS指令之前加重复前缀REPNE/REPNZ,用来从目标串中寻找关键字,操作一直进行到ZF,1或(CX),0为止。 例如,在某字符串中查找是否存在“,”字符。若存在,则将“,”字符所在地址送入BX寄存器中,否则将BX寄存器清“0”。程序如下: CLD ;清除方向标志DF MOV DI,0100H ;送目标串首元素偏移地址 MOV AL,′,′ ;关键字?AL REPNE SCASB ;找关键字 AND CX,0FFH JZ ZER DEC DI MOV BX,DI ;关键字所在地址?BX JMP ST0 ZER:MOV BX,0 ;未找到,0?BX ST0:HLT CMPS指令是用来将源串的一个元素减去目标串中相对应的一个元素,不回送结果,只根据结果特征置标志,并修改SI和DI内容指向下一元素。通常在CMPS指令前加重复前缀REPE/REPZ,用来寻找两个串中的第一个不相同数据。 例如, 检验一段被传送过的数据是否与源串完全相同,程序如下: CLD MOV CX,100 ;初始化 MOV SI,2400H MOV DI,1200H; REPE CMPSB ;串比较,直到ZF,0或CX,0 AND CX,0FFH JZ EQQ DEC SI MOV BX,SI ;第一个不相同字节偏移地址?BX MOV AL,,SI, ;第一个不相同字节内容?AL JMP STOP EQQ:MOV BX,0 ;两串完全相同,BX,0 STOP:HLT 118 执行完上述程序,若两串相同,则BX寄存器内容为0;若两串不同,则BX指向源串中第一个不相同字节的地址,该字节的内容保留在AL寄存器中。 5.4.4 重复前缀 字符串指令前面可以加重复前缀,重复前缀有3种:REP,REPE/REPZ和REPNE/REPNZ。REP是REPEAT的缩写,意为无条件重复CX寄存器中指定的次数。如果不使用重复前缀,各种字符串指令则将执行一次,并只执行一次。如果在CMPS和SCAS指令前使用REPE/REPZ前缀,则只有在同时满足如下两个条件时,才重复进行扫描和比较: (1) CX?0;表示重复次数还未满; (2) ZF,1,表示目的操作数等于源操作数(CMPS指令)或等于扫描值(SCAS指令)。 反过来也就是说,两个条件中只要有一个不满足(或者重复次数已满,或者是目的操作数不等于源操作数或扫描值),则重复停止,字符串指令结束。 与此类似,如果在CMPS和SCAS指令前使用REPNE/REPNZ前缀,则只有在同时满足如下两个条件时,才重复进行扫描或比较:? CX?0;? ZF,0。 这两个条件重复前缀各有用途。如果已知两个数据块的内容基本上是相同的(例如数据块搬移之后),若要找出其中不一致的地方,则应在CMPS指令前使用REPE/REPZ前缀。如果已知两个数据块的内容基本是不相同的,若要找出其中相一致的地方,则应在CMPS指令前使用REPNE/REPNZ前缀。 5.5 控制类指令 控制类指令包括程序转移指令和处理机控制指令。 凡属能改变指令执行顺序的指令,统称为程序转移指令。86系列指令系统中,程序转移指令可分成4种类型。 5.5.1 程序转移的地址 在86系列系统中,程序的寻址是由CS和IP两部分组成的。为了使程序转移到一个新的地址去执行,或者改变CS和IP(即改变段和偏移量),或者仅改变IP(即改变偏移量),都可以达到这个目的。其中,前者称为段间转移或段间调用,可用FAR来表示,这时需要将目标标号的段基址和偏移地址分别置入CS和IP中;后者称为段内转移或段内调用,可用 NEAR来表示,这时只需将目标标号的偏移地址置入IP寄存器中。为了进一步节省目标码的长度,对于很短距离内的段内转移(-128,+127),86系列又把它进一步分别开来,称为短转移,用SHORT来表示。 无论是段内转移还是段间转移,都还有直接和间接转移之分。所谓直接转移,就是转移的目标地址信息直接出现在指令的机器码中。所谓间接转移,就是转移的目标地址信息间接存储于某一个寄存器中或某一个内存变量中。当通过寄存器间接转移时,因为寄存器只能是16位的,所以只能完成段内间接转移。 计算段内转移地址有两种方法:一种是把当前的IP值增加或减少某一个值,也就是以当前指令为中心往前或往后转移,称为相对转移;另一种是以新的值完全代替当前的IP值, 119 称为绝对转移。在86系列中,所有的段内直接转移都是相对转移,所有的段内间接转移和段间转移都是绝对转移。由于相对转移指令及其目标地址是相对于该指令本身而言的,因而适用于与位置无关(即动态浮动)的程序。这种程序中,相对转移指令及其目标都在同一段中,并一起浮动。JMP指令具有所有这些转移地址的功能,CALL和RET指令没有短转移的功能。 5.5.2 条件转移指令 条件转移指令是根据执行该指令时CPU标志的状态而决定是否发生控制转移的指令。所有条件转移指令完成的都是短距离相对转移,因此适用于与位置无关的程序。如果转移距离超过短距离范围,则必须使用两级跳转才能达到目的。 第1类和第2类是测试各种标志的组合,其中,第1类是为无符号数设计的,第2类是为带符号数设计的,这两类条件转移指令前面都要求是一条SUB或CMP指令。第3类是测试单个标志。 5.5.3 循环控制指令 循环控制指令LOOP也是短距离相对转移指令,可用来控制软件循环的重复过程。LOOP指令用CX寄存器作为计数器,它首先使CX减1,若减1后不为0,则转移到目标地址;否则就执行LOOP指令之后的指令。 如果在进入LOOP指令时,CX寄存器已经为0,则LOOP指令执行的是最大限度次数(65 536次)的循环。有时候这是程序员故意设计的,有时候却是不慎发生的,特别是当CX的内容是来自某一变量或某一计算结果时。如果希望在进入LOOP指令时,当CX,0,则不进行循环,那就可以在LOOP指令前再增加一条JCXZ指令。循环控制指令LOOP,LOOPE/LOOPZ, LOOPNE/LOOPNZ之间的差别类似于REP,REPE/REPZ,REPNE/REPNZ之间的差别。 5.5.4 处理机控制指令 处理机控制指令只是完成简单的控制功能,指令中不需要设置地址码,因此又称为无地址指令。 1. 对标志位操作指令 标志操作指令的作用是分别用来置位或复位进位标志、方向标志、中断允许标志。在这些指令中,没有直接置位和复位单步执行标志位TF的指令,如果要对TF标志位进行操作,应该先用PUSHF指令将标志寄存器的内容压入堆栈,在堆栈中设定TF位的值,然后再从堆栈中弹回标志寄存器。 2. 同步指令 86系列 CPU构成最大模式系统时,可与别的处理机一起构成多微处理机系统,当CPU需要协处理器帮助它完成某个任务时,CPU可用同步指令向协处理器发出请求,待它们接受这一请求后,CPU才能继续执行程序。为此,86系列 指令系统中专门设置了3条同步控制指令: (1) WAIT指令,使CPU进入等待状态。每隔5个时钟周期,测试一次86系列芯片上的TEST状态,直到TEST线上的信号变为有效为止。WAIT指令与ESC指令联合使用,提供了一 120 种存取8087数值的能力。 (2) ESC指令的作用是不用修改处理机就可以扩充86系列的指令集。该指令中的外部操作码是外部协处 理机的操作码,它是一个6位的立即数,由汇编程序将其编入这条指令的机器码中。协处理机可监视系统总线,并在当主处理机读取ESC指令时获得这个外部操作码。若源操作数是一个寄存器,则处理机不做任何工作;若源操作数是存储变量,则主处理机就从存储器取出这个操作数并丢弃它,但与此同时,外部协处理机可从总线上获取这个操作数。 (3) LOCK指令实际上是一个前缀。它使86系列在执行下一条指令期间发出总线封锁(LOCK)信号,所以,在该指令执行过程中禁止其它协处理机使用总线。这条前缀指令在构成多处理机系统时尤为重要。 习题 5.1 分别指出下列指令中的源操作数和目的操作数的寻址方式: (1) MOV SI,200 (2) MOV CX,DATA,SI, (3) ADD AX,,BX,,DI, (4) AND AX,BX (5) MOV ,SI,,AX (6) PUSHF 5.2 试述指令MOV AX,2010H和MOV AX,DS:,2010H,的区别。 5.3 写出以下指令中内存操作数的所在地址。 (1) MOV AL,,BX+5, (2) MOV ,BP+5,,AX (3) INC BYTE PTR,SI+3, (4) MOV DL,ES?,BX+DI, (5) MOV BX,,BX+SI+2, 5.4判断下列指令书写是否正确: (1) MOV AL,BX(6) MOV BL,F5H (2) MOV AL,CL(7) MOV DX,2000H (3) INC ,BX,(8) POP CS (4) MOV 5,AL(9) PUSH CS (5) MOV ,BX,,,SI, 5.5 设堆栈指针SP的初值为2000H,AX,3000H,BX,5000H,试问: (1) 执行指令PUSH AX后SP,? (2) 再执行PUSH BX及POP AX后SP,?AX,?BX,? 121 5.6 要想完成把,2000H,送,1000H,中,用指令: MOV ,1000H,,,2000H,是否正确?如果不正确,应用什么方法? 5.7 假如想从100中减去AL中的内容,用SUB 100,AL是否正确?如果不正确,应用什么方法? 5.8 用两种方法写出从88H端口读入信息的指令。再用两种方法写出从42H口输出100H的指令。 5.9 假如AL,20H,BL,10H,当执行CMP AL,BL后,问: (1) 若AL,BL中内容是两个无符号数,比较结果如何?影响哪几个标志位? (2) 若AL,BL中内容是两个有符号数,结果又如何?影响哪几个标志位? 122
本文档为【微型计算机原理及应用课程教案5】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_589748
暂无简介~
格式:doc
大小:182KB
软件:Word
页数:34
分类:互联网
上传时间:2018-07-10
浏览量:17