指令系统与汇编语言程序设计.ppt_第1页
指令系统与汇编语言程序设计.ppt_第2页
指令系统与汇编语言程序设计.ppt_第3页
指令系统与汇编语言程序设计.ppt_第4页
指令系统与汇编语言程序设计.ppt_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

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

文档简介

1,本章主要教学内容 指令格式及寻址的有关概念 8086CPU指令系统的寻址方式及其应用 8086CPU各类指令的表示、功能、特点及其应用 常用的DOS和BIOS中断调用简介 Pentium微处理器新增指令和寻址方式介绍,第3章,寻址方式和指令系统,2,本章教学目的及要求 通过学习,使学生掌握指令的寻址方式、指令系统及其应用;学会程序设计的基本方法;掌握程序设计的技巧,保证程序设计的质量。,第3章,寻址方式和指令系统,第3章,3.1 指令格式及寻址 1. 指令系统与指令格式 在计算机中要执行的各种操作命令称为指令。计算机所能执行的全部命令的集合即为该计算机的指令系统。 计算机指令以二进制编码的形式存放在存储器中,用二进制编码形式表示的指令称为机器指令,CPU可以直接识别机器指令。人们采用一些助记符通常是指令功能的英文单词的缩写,如数据传送指令用助记符MOV(MOVE的缩写),这样表示的指令称为符号指令,也称为汇编指令。汇编指令具有直观、易理解、好记忆的特点。,寻址方式和指令系统,4,第3章,寻址方式和指令系统,计算机中的汇编指令由操作码字段和操作数字段两部分组成。 (1)操作码字段:操作码表示计算机要执行的某种指令功能,由它来规定指令的操作类型,说明计算机要执行的具体操作,例如传送、运算、移位、跳转等操作。同时还指出操作数的类型、操作数的传送方向、寄存器编码或符号扩展等,是指令中必不可少的组成部分。 (2)操作数字段:操作数表示计算机在操作中所需要的数据,或者所需数据的存放位置(也称为地址码),还可以是指向操作数的地址指针或其它有关操作数据的信息。,5,8086的指令格式如图3-1所示,指令的长度范围是16个字节。其中,操作码字段为12个字节(B1、B2),操作数字段为04个字节(B3B6)。每条具体指令的长度将根据指令的操作功能和操作数的形式而定。 图3-1 8086的指令格式,第3章,寻址方式和指令系统,6,第3章,寻址方式和指令系统,2. 寻址及寻址方式的概念 计算机的指令中通常要指定操作数的位置,即给出操作数的地址信息,在执行时需要根据这个地址信息找到需要的操作数,这种寻找操作数的过程称为寻址。寻址方式就是寻找操作数或操作数地址的方式。 不同机器的指令系统都规定了一些寻址方式以供编程时选择使用,根据给定的寻址方式,就可以方便地访问各类操作数。,7,第3章,寻址方式和指令系统,8086指令中的操作数有三种可能的存放位置: (1)操作数直接在指令中,即跟随在指令操作码之后,指令的操作数部分就是操作数本身,这种操作数叫立即操作数。 (2)操作数存放在CPU的某个内部寄存器中,这时指令的操作数部分是CPU内部寄存器的一个编码,称为寄存器操作数。 (3)操作数存放在内存储器的数据区中,这时指令的操作数部分包含此操作数所在的内存地址,称为存储器操作数。,8,第3章,寻址方式和指令系统,3.2 8086 CPU的寻址方式 3.2.1 与操作数有关的寻址方式 1.立即数寻址方式 立即数寻址方式是指操作数直接存放在给定的指令中,紧跟在操作码之后。 立即数可以是8位或16位二进制数。例如,给定如下指令,采用立即数寻址: MOV AL, 10 ; 十进制数() MOV AL, 00100101B ; 二进制数() MOV AX, 263AH ; 十六进制数(),9,例: MOV AL, 80H MOV AX, 1234H, 立即操作数可以是8、16、32位, 若是16或32位的,则存放时必须满足低对低,高对高的原则。 此指令中的立即数只能是源,不能是目的。 常用于给Reg.赋初值。,第3章,寻址方式和指令系统,10,第3章,寻址方式和指令系统,2. 寄存器寻址方式 寄存器寻址方式是在指令中直接给出寄存器名,寄存器中的内容即为所需操作数。在寄存器寻址方式下,操作数存在于指令规定的8位、16位寄存器中。寄存器可用来存放源操作数,也可用来存放目的操作数。 寄存器寻址方式是CPU内部的操作,不需要访问总线周期,因此指令的执行速度比较快。 对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP等。 对于8位操作数,寄存器可以是AH、AL、BH、BL、CH、CL、DH、DL等。,11,例: INC SI MOV AX,BX, Reg是任何CPU中的通用Reg AX,BX,CXBP AH,AL 等 操作数在Reg中,无需访问存贮器,执行速度快。 若选用AX,执行指令时间更短。,指令执行后,源操作数不变,目的操作数为源的内容。,12,第3章,寻址方式和指令系统,3. 存储器寻址方式 计算机中访问内存的寻址方式有多种,不管哪一种寻址方式,最终都将得到存放操作数的物理地址。采用存储器寻址时,指令中需要给出操作数的地址信息。 存储器操作数的有效地址EA的计算方法和寻址方式有着密切地联系,而操作数物理地址PA的计算则和操作数的具体存放位置有关。,13,第3章,寻址方式和指令系统,(1)直接寻址方式 直接寻址方式是一种针对内存的寻址方式。在这种寻址方式下,指令中给出的地址码即为操作数的有效地址EA,它是一个8位或16位的位移量。在默认方式下,操作数存放在数据段DS中,如果要对除DS段之外的其他段如CS、ES、SS中的数据寻址,应在指令中增加前缀,指出段寄存器名,这称为段跨越。 在直接寻址方式的指令中,操作数的有效地址EA已经给出,那么操作数的物理地址为:PA(DS)10HEA。,14,将ES段中2000H、2001H单元内容分别送AL,AH(低对低,高对高) 不管数据在那个段内存放,只要不是DS,一定要加段超越前缀。, 允许段超越 例:MOV AX,ES:2000H (或 ES:MOV AX,2000H),例:MOV AL,2000H; 将DS段中2000H单元的内容送AL 若DS4000H,则物理地址为: 4000H16+2000H42000H。见右图., 直接寻址中EA可以以变量名的形式给出。 例:VALUE DB 12H MOV AL,VALUE 或 MOV AL,VALUE ;VALUE又称为符号地址,15,第3章,寻址方式和指令系统,(2)寄存器间接寻址方式 寄存器间接寻址方式是指操作数的有效地址EA在指定的寄存器中,这种寻址方式是在指令中给出寄存器,寄存器中的内容为操作数的有效地址。,Reg使用规定如下: 16位寻址时,EA在DI、SI、BP、BX中, 这时: 若以DI、SI、BX间接寻址,则默认操作数在数据段中. 操作数物理地址DS16BX(或SI、DI) 若以BP间接寻址,则默认操作数在堆栈段内. 操作数物理地址SS16BP 若操作数不在以上规定段内,则必须在指令中加上段超越前缀。,16,寄存器间接寻址示意图,例:MOV AX, BX 设DS4000H, BX=0100H 寄存器间接寻址示意 图如左。,例:MOV AX,SI ;将DS段SISI1的内容送AL,AH MOV BH,BP ;将SS段BP的内容送BH MOV CX,ES:BX ;将ES段BXBX1内容送CL,CH,17,第3章,寻址方式和指令系统,(3)寄存器相对寻址方式 这种寻址方式是在指令中给定一个基址寄存器或变址寄存器和一个8位或16位的相对偏移量,两者之和作为操作数的有效地址。当选择间址寄存器BX、SI、DI时,指示的是数据段中的数据,选择BP作间址寄存器时,指示的是堆栈段中的数据。 有效地址计算为:EA(reg)8位或16位偏移量;其中reg为给定寄存器。 物理地址计算为: PA(DS)10HEA (使用BX、SI、DI间址寄存器) PA(SS)10HEA (使用BP作为间址寄存器) 例子 P53 MOV AX,BX+10H EA=(BX)+10H PA=(DS) 10H+EA,18,第3章,寻址方式和指令系统,(4)基址变址寻址方式 在基址变址寻址方式中,有效地址EA是基址寄存器加变址寄存器,即两个寄存器的内容之和为操作数的有效地址。在该寻址方式中,当基址寄存器和变址寄存器的默认段寄存器不同时,一般由基址寄存器来决定默认用哪一个段寄存器作为段基址指针。若在指令中规定了段跨越,则可以用其他寄存器作为段基地址。 基址变址寻址方式的物理地址计算公式为: 物理地址PA(DS)10H(BX)(SI) 物理地址PA(SS)10H(BP)(DI) 例子 P53 MOV AX,BX+SI EA=(BX)+(SI) PA=(DS) 10H+EA,19,第3章,寻址方式和指令系统,(5)相对基址变址寻址方式 这种寻址方式是在指令中给出一个基址寄存器、一个变址寄存器和8位或16位的偏移量,三者之和作为操作数的有效地址。 基址寄存器可取BX或BP,变址寄存器可取SI或DI。 如果基址寄存器采用BX,则段寄存器使用DS; 如果基址寄存器采用BP,则段寄存器使用SS。 其物理地址计算为: PA(DS)10H(BX)(SI)或(DI)偏移量 PA(SS)10H(BP)(SI)或(DI)偏移量,20,第3章,寻址方式和指令系统,3.2.2 与I/O端口有关的寻址方式 由于8086CPU的I/O端口采用独立编址方式,可有64K个字节端口或32K个字端口。指令系统中设有专门的输入指令IN和输出指令OUT来进行访问,I/O端口的寻址方式有直接端口寻址和寄存器间接端口寻址两种。,21,第3章,寻址方式和指令系统,1直接端口寻址 直接端口寻址是在指令中直接给出要访问的端口地址,一般采用2位十六进制数表示,可访问的端口数为0255个。 例如:IN例如:IN AL,30H ;表示从I/O端口地址为30H的端口中取出字节数据送到8位寄存器AL中。 IN AX,50H ;表示从I/O端口地址为50H和51H的两个相邻端口中取出字数据送到16位寄存器AX中。,22,第3章,寻址方式和指令系统,2间接端口寻址 当访问的端口地址数256时,直接端口寻址不能满足要求,要采用I/O端口的间接寻址方式。它是把I/O端口的地址先送到寄存器DX中,用16位的DX作为间接寻址寄存器。此种方式可访问的端口数为065535个。 例如:MOV DX,283H ;将端口地址283H送到DX寄存器。 OUT DX,AL ;将AL中的内容输出到DX所指定的端口中。,23,第3章,寻址方式和指令系统,3.3 8086 CPU的指令系统 8086指令系统是80X86/Pentium微处理器的基本指令集。指令的操作数可以是8位或16位,偏移地址是16位。按功能可将指令分成六大类,即:数据传送类指令、算术运算类指令、逻辑运算与移位类指令、串操作类指令、控制转移类指令和处理器控制类指令。,24,第3章,寻址方式和指令系统,3.3.1 数据传送类指令 数据传送类指令的基本功能是把操作数或操作数的地址传送到指定的寄存器或存储单元中。数据传送类指令共有14条,根据传送的内容可分成以下4组: (1)通用数据传送指令; (2)累加器专用传送指令; (3)地址传送指令; (4)标志寄存器传送指令。,25,第3章,寻址方式和指令系统,1. 通用数据传送指令 (1)传送指令MOV 格式:MOV dst,src MOV 指令的功能是把源操作数src传送至目的操作数dst,执行后源操作数内容不变, 目的操作数内容与源操作数内容相同。 源操作数可以是通用寄存器、段寄存器、存储器以及立即数,目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。,26,数据之间的传送关系如图3-5所示。,图3-5 数据之间的传送关系,27,第3章,寻址方式和指令系统,使用MOV指令进行数据传送时要注意以下几点: (1) 段寄存器CS及立即数不能作为目标操作数; (2) 两个存储单元之间不允许直接传送数据; (3)立即数不能直接传送到段寄存器; (4)两个段寄存器之间不能直接传送数据; (5)传送数据的类型必须匹配; (6)MOV指令不影响标志位。,28,例: MOV AL,CH ;通用寄存器之间传送字节数据 MOV DS,AX ;通用寄存器段寄存器(CS不能是目标) MOV AX,0FF3BH ;立即数通用寄存器 MOV AL,BUFFER ;存储器通用寄存器 MOV DATBP+DI,ES ;段寄存器存储器 MOV 1000H,25H ;立即数存储器 MOV CX, 1000H ;存储器通用寄存器,29,第3章,寻址方式和指令系统,(2)堆栈操作指令PUSH/POP 进栈指令:PUSH opr ;SPSP2,将源操作数opr压入堆栈 出栈指令:POP opr ;栈顶弹出字数据到目标操作数opr,SPSP+2 堆栈是存储器中的一个特殊区域,主要用于存入和取出数据,堆栈是以“先进后出”的方式进行数据操作的。在8086的堆栈组织中,堆栈从高地址向低地址方向生长,它只有一个出入口,堆栈指针寄存器SP始终指向堆栈的栈顶单元,30,具体的入/出栈指令如下: PUSH reg16 ; POP reg16 PUSH Sreg ; POP Sreg PUSH mem16 ; POP mem16,注:1. 程序中有一个PUSH,必有一个对应的POP。 2. 遵循后进先出原则。 3. 按字进行操作(PUSH AH ; POP BL (错误) 4. PUSH CS ; POP CS (可以) (错误),指令PUSH AX 的执行情况,31,第3章,寻址方式和指令系统,(3)XCHG 交换指令 XCHG指令用来将源操作数和目的操作数的内容进行交换。它可以实现字节数据交换,也可以实现字数据交换。 该指令的操作数必须有一个是在寄存器中,即可以在两个通用寄存器之间或寄存器与存储器之间交换数据,但不能在两个存储器之间交换数据。指令执行结果不影响标志位。,例: XCHG AX,BX XCHG 2530H,CX,注:1. 两个存储器操作数之间不能实现直接交换。 2. 段Reg和立即数不能作为操作数。,32,第3章,寻址方式和指令系统,2. 累加器专用传送指令 8086指令系统中将累加器AX作为数据传输的核心,系统的输入/输出指令IN/OUT和换码指令XLAT就是专门通过累加器来执行的,称之为累加器专用传送指令。,CPU用16根I/O地址线形成64K个8位数据传送端口地址。 当传送16位数据时,则从偶地址传送数据,形成32K个16位端口地址。,当端口地址256(8根地址线)时,该地址直接出现在指令中。 当端口地址256(816根地址线)时,该地址置于DX并将DX放在 指令中。,33,指令格式: IN 累加器, 外设口地址 OUT 外设口地址, 累加器,具体指令有: IN AL,imm8 OUT imm8,AL IN AX,imm8 OUT imm8,AX IN AL,DX OUT DX, AL IN AX,DX OUT DX, AX,注: 1. 所有I/O指令只能用累加器,不能用其他Reg. 2. IN/OUT指令有字/字节两种方式,选用那一种则取决于外设端口宽度。,34,第3章,3. 地址传送指令 8086的地址传送指令用于控制寻址机构,它可将存储器操作数的地址传送到16位目标寄存器中。这类指令有以下3种形式: (1)有效地址送寄存器指令:LEA reg,src LEA指令功能是将存储器操作数src的有效地址传送到16位的通用寄存器reg。,例:LEA AX,2728H ;AX=2728H LEA BX,BP+SI ;BX=BP+SI的值。 LEA SP ,0482H ;SP=0482H,注:MOV指令与LEA的不同: 前者传送操作数的内容,后者传送操作数的地址。,例:MOV DI ,TABLE ;DI TABLE LEA DI ,TABLE ; DI TABLE所在单元的EA,35,例:比较 LEA BX,BUFFER MOV BX, BUFFER 两指令的不同,存储单元内容如右图所示。 DS:093AH,BUFFER 物理地址 093C3H 则 LEA BX,BUFFER后,BX=0023H MOV BX,BUFFER后,BX=0045H,36,(2)地址指针送寄存器和DS指令:LDS reg,src 该指令完成一个32位的地址指针传送,地址指针包括段地址和偏移地址两部分。 (3)地址指针送寄存器和ES指令:LES reg,src LES指令执行的操作与LDS指令相似,不同之处是以ES代替DS。,例1:LDS DI,2130H EA=2130H 2130H,2131H DI 2132H,2133H DS,例2:LDS SI,10H 设指令执行前, DS=C000H,C0010H=0180H,C0012H=2000H 则执行后,SI=0180H,DS=2000H,例3:LDS BX,DI+1008H 程序执行前, DS=2500H,DI=2400H, 28408H=3344H, 2840AH=1122H 执行后,BX=3344H,DS=1122H,37,第3章,寻址方式和指令系统,4. 标志寄存器传送指令 8086可通过这类指令读出当前标志寄存器中各标志位的内容,也可以重新设置各标志位的值。标志寄存器的传送指令共有4条,均位单字节指令,指令的操作数以隐含形式出现,隐含为AH寄存器。 (1)取标志指令LAHF (2)置标志位指令SAHF (3)标志寄存器入栈指令PUSHF (4)标志寄存器出栈指令POPF,在子程序调用或中断子程序中,常用此保护和恢复需要的标志位。,38,第3章,寻址方式和指令系统,3.3.2 算术运算类指令 8086的算术运算类指令包括加、减、乘、除4种基本运算指令,以及为进行BCD码十进制数运算而设置的各种较正指令。 8086的基本算术运算指令中,除加1和减1指令外,其余均为双操作数指令,两个操作数中除了源操作数可为立即数外,必须有一个操作数在寄存器中,而单操作数指令则不允许采用立即数方式。,39,第3章,寻址方式和指令系统,加减法运算在执行过程中会产生溢出,无符号数运算时,如果加法运算最高位向前产生进位或减法运算最高位向前有借位,则表示出现溢出,采用标志位CF=1来表示;带符号数采用补码运算时,符号位也参与运算,出现溢出则表示运算结果发生了错误,采用标志位OF=1来表示。,40,第3章,寻址方式和指令系统,算术运算指令除加1指令INC不影响CF标志外,其余指令对CF、OF、ZF、SF、PF、AF等6个标志位均可产生影响,其规则如下: 无符号数运算产生溢出时,CF1; 带符号数运算产生溢出时,OF1; 当运算结果为0时,ZF1; 当运算结果为负数时,SF1; 当运算结果中有偶数个1时,PF1; 当操作数为BCD码,低4位出现进位1时,AF1。,41,第3章,寻址方式和指令系统,1. 加法指令 (1)不带进位加法指令:ADD dst,src 指令功能为:(dst)(dst)+(src) (2)带进位的加法指令:ADC dst,src 指令功能为:(dst)(dst)+(src)+CF (3)加1指令:INC opr 指令功能为:(opr)(opr)+1,42,第3章,寻址方式和指令系统,2. 减法指令 (1)不带借位减法指令:SUB dst,src 指令功能为:(dst)(dst)(src) (2)带借位的减法指令:SBB dst,src 指令功能为:(dst)(dst)(src)CF (3)减1指令:DEC opr 指令功能为:(opr)(opr)1 (4)求补指令:NEG opr 该指令将 opr中的内容取2的补码,相当于将opr中的内容按位取反后末位加1。 (5)比较指令:CMP opr1,opr2 指令功能为:(opr1)(opr2),43,第3章,寻址方式和指令系统,3. 乘法运算指令 乘法指令包括无符号数和带符号数相乘的指令,指令中只给出乘数,被乘数隐含给出。两个8位数相乘时被乘数放入AL中,16位数的乘积存放到AX中;两个16位数相乘时被乘数先放入AX寄存器中,32位数的乘积放到DX和AX两个寄存器中,规定DX中存放高16位,AX中存放低16位。,44,第3章,寻址方式和指令系统,(1)无符号数乘法指令:MUL src 若src为字节数据,执行AX(AL)(src); 若src为字数据,执行DX、AX(AX)(src) (2)带符号数乘法指令:IMUL src 该指令的执行功能与MUL相同。,45,第3章,寻址方式和指令系统,4. 除法运算指令 除法指令可用来实现两个无符号数或带符号数的除法运算,包括字和字节两种操作,该指令隐含使用AX和DX作为一个操作数,指令中给出的源操作数为除数。 (1)无符号数除法指令:DIV src DIV指令的被除数、除数、商和余数全部为无符号数。 (2)带符号数除法指令:IDIV src IDIV指令的被除数、除数、商和余数均为带符号数,且余数的符号位同被除数。 两条指令执行的操作功能如下: 当除数src为字节数据时,用AX除以src ,得到的8位商保存在AL中,8位余数保存在AH中; 当除数src为字数据时,用DX、AX除以src ,得到的16位商保存在AX中,16位余数保存在DX中。,例1:设AL=B4H,(无符号数180,带符号数-76) BL=11H,(无符号数17,带符号数17) 用 MUL BL,则AX=0BF4H(无符号数3060),CF=OF=1 而用 IMUL BL,则AX=FAF4H(带符号数-1292),CF=OF=1,例2:完成无/有符号数除法DP1/DP2 无: XOR AH,AH MOV AL,DP1 DIV DP2 ; 商在AL中,余数在AH中 有: MOV AL,DP1 CBW ; 扩展到字 IDIV DP2,例3:DP1是字型变量,DP2和DPSUM是双字型变量,则要区分 它们是无符号数还是有符号数(求和)。,符号数: MOV AX,DP1 CWD ADD AX,WORD PTR DP2 MOV WORD PTR DPSUM,AX ADC DX,WORD PTR DP2+2 MOV WORD PTR DPSUM+2,DX,无符号数: MOV AX,DP1 ADD AX,WORD OPTR DP2 MOV WORD PTR DPSUM,AX MOV AX,0 ADC AX,WORD PTR DP2+2 MOV WORD PTR DPSUM+2,AX,48,第3章,寻址方式和指令系统,5. 符号扩展指令 符号扩展指令是指用一个操作数的符号位形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数),符号扩展指令虽然使数据位数加长,但数据的大小并没有改变。该指令的执行不影响标志位。 (1)字节转换为字指令CBW 该指令的功能是将AL中的符号位D7扩展到AH中。 (2)字转换为双字指令CWD 该指令的功能是将AX中的符号位扩展到DX中。,49,第3章,寻址方式和指令系统,6. 十进制调整指令 十进制数在计算机中是采用二进制数来表示的,这就是BCD码,要对十进制的BCD码进行算术运算,必须对得到的结果进行调整,否则结果无意义。 8086指令系统提供了以下两类十进制调整指令。 (1)组合BCD码加法、减法调整指令 DAA ;组合BCD码加法调整指令,将AL中的和调整为组合BCD码 DAS ;组合BCD码减法调整指令,将AL中的差调整为组合BCD码,50,第3章,寻址方式和指令系统,(2)非组合BCD加法、减法调整指令 AAA ;非组合BCD加法调整指令,将AL中的和调整为非组合BCD码 AAS ;非组合BCD减法调整指令,将AL中的差调整为非组合BCD码 AAA和AAS分别用于加法指令(ADD、ADC)或减法指令(SUB、SBB)之后,执行时对AL进行测试,若AL中的低四位09H,或AF1,则进行AL(AL)06H修正;AL的高4位为0,同时AH(AH)1;CFAF1。调整后的结果放在AX中,51,第3章,寻址方式和指令系统,3.3.3 逻辑运算与移位类指令 1. 逻辑运算指令 有以下5条逻辑运算指令,它们可对8位或16位操作数按位进行逻辑运算。 (1)逻辑与指令:AND dst,src (2)逻辑或指令:OR dst,src (3)逻辑异或指令:XOR dst,src (4)逻辑非指令:NOT dst (5)测试指令:TEST dst,src 。,52,第3章,寻址方式和指令系统,2. 移位指令 移位操作类指令可以对字节或字数据中的各位进行算术移位、逻辑移位或循环移位。 移位指令的格式为: SHL/SAL/SHR/SAR dst,1/ CL 循环移位指令的格式为:ROL/ ROR/ RCL/ RCR dst,1/ CL 上述指令分别对操作数进行逻辑左移SHL、算术左移SAL、逻辑右移SHR、算术右移SAR;循环左移ROL、循环右移ROR、带进位的循环左移RCL、带进位的循环右移RCR等操作。操作数可以是字节或字操作。 图3- 7为各种移位操作的功能示意。,53,图3-7 移位指令的操作功能示意,54,55,例:(AX)= 0012H,(BX)= 0034H,把它们装配成(AX)= 1234H,例:(BX) = 84F0H (1) (BX) 为无符号数,求 (BX) / 2 SHR BX, 1 ; (BX) = 4278H (2) (BX) 为带符号数,求 (BX) / 2 SAR BX, 1 ; (BX) = 0C278H,MOV CL, 8 ROL AX, CL ADD AX, BX,56,MOV CH, 4 ; 循环次数 MOV CL, 4 ; 移位次数 NEXT: ROL BX, CL MOV AX, BX AND AX, 0FH PUSH AX DEC CH JNZ NEXT,(3) (BX) = 84F0H,把 (BX) 中的 16 位数每 4 位压入堆栈,57,第3章,寻址方式和指令系统,3.3.4 串操作类指令 数据串是存储器中的一串字节或字的数据序列。8086指令系统中设置了串操作指令,其操作对象是内存中地址连续的字节串或字串。在每次操作后能够自动修改地址指针,为下一次操作作准备。 基本串操作指令有串传送(MOVS)、串比较(CMPS)、串扫描(SCAS)、串存取(LODS、 STOS)等。任何一个基本串操作指令的前面都可以加一个重复操作前缀,使指令操作重复,这样在处理长数据串时要比用循环程序速度快得多。,58,串处理指令: 设置方向标志指令 CLD、STD 串处理指令 串重复前缀 MOVSB / MOVSW REP STOSB / STOSW REPE / REPZ LODSB / LODSW REPNE / REPNZ CMPSB / CMPSW SCASB / SCASW,59,与 REP 配合工作的 MOVS / STOS / LODS REP MOVS / STOS / LODS 执行操作: (1) 如 (CX)=0 则退出 REP,否则转(2) (2) (CX) (CX) -1 (3) 执行 MOVS / STOS / LODS (4) 重复 (1) (3),60,MOVS 串传送指令: MOVS DST, SRC MOVSB (字节) MOVSW (字) 例:MOVS ES: BYTE PTR DI, DS: SI 执行操作: (1) (DI) (SI) (2) 字节操作:(SI)(SI)1, (DI)(DI)1 字操作: (SI)(SI)2, (DI)(DI)2 方向标志DF=0 时用 + ,DF=1 时用 - 。 REP MOVS:将数据段中的整串数据传送到附加段中。 源串(数据段) 目的串(附加段),61,执行 REP MOVS 之前,应先做好: (1) 源串首地址(末地址) SI (2) 目的串首地址(末地址) DI (3) 串长度 CX (4) 建立方向标志 ( CLD 使 DF=0,STD 使 DF=1 ),62,(SI) (DI),63,data segment mess1 db personal_computer data ends extra segment mess2 db 17 dup (?) extra ends code segment lea si, mess1 lea di, mess2 mov cx, 17 cld rep movsb code ends,64,65,LODS 从串取指令: LODS SRC LODSB (字节) LODSW (字) 执行操作: 字节操作:(AL)(SI), (SI)(SI)1 字操作:(AX)(SI), (SI)(SI)2,注意: * LODS 指令一般不与 REP 联用 * 源串一般在数据段中(允许使用段跨越前缀来修改), 目的串必须在附加段中 * 不影响条件标志位,66,与 REPE / REPZ(REPNE / REPNZ)配合工作的 CMPS 和 SCAS REPE / REPZ (REPNE / REPNZ) CMPS / SCAS 执行操作: (1) 如 (CX)=0 或 ZF=0 (ZF=1) 则退出, 否则转(2) (2) (CX)(CX) -1 (3) 执行 CMPS / SCAS (4) 重复 (1) (3),67,CMPS 串比较指令: CMPS SRC, DST CMPSB (字节) CMPSW (字) 执行操作: (1) (SI) - (DI) 根据比较结果置条件标志位:相等 ZF=1 不等 ZF=0 (2) 字节操作:(SI)(SI)1, (DI)(DI)1 字操作: (SI)(SI)2, (DI)(DI)2,68,SCAS 串扫描指令: SCAS DST SCASB (字节) SCASW (字) 执行操作: 字节操作:(AL) - (DI), (DI)(DI)1 字操作:(AX) - (DI), (DI)(DI)2,69,例:从一个字符串中查找一个指定的字符 mess db COMPUTER lea di, mess mov al, T mov cx, 8 cld repne scasb,70,例:比较两个字符串,找出它们不相匹配的位置,例:反向传送,lea si, mess1 lea di, mess2 mov cx, 8 cld repe cmpsb,71,第3章,寻址方式和指令系统,3.3.5 控制转移类指令 程序的执行一般是按指令顺序逐条执行的,但有时需要改变程序的执行流程。控制转移类指令就是用来改变程序执行的方向,也就是修改IP和CS的值。通过控制转移指令可实现各种结构化程序设计,如分支结构程序、循环结构程序等。 (1)如果指令给出改变IP中内容的信息,转移的目标位置和转移指令在同一个代码段,则称为段内转移; (2)如果指令给出改变IP中内容的信息,又给出改变CS中内容的信息,转移的目标位置和转移指令不在同一个代码段,则称为段间转移。 根据转移指令的功能,可分为无条件转移指令、条件转移指令、循环控制指令、子程序调用和返回指令4类。,72,控制转移指令: 无条件转移指令 JMP 条件转移指令 JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、 JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、 JLE / JNLE、 JCXZ 循环指令 LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE 子程序调用和返回指令 CALL、RET 中断与中断返回指令 INT、INTO、IRET,73,第3章,寻址方式和指令系统,1. 无条件转移指令 无条件转移指令JMP用来控制程序转移到指定的位置去执行,指令中要给出转移位置的目标地址,通常有以下5种形式: JMP SHORT opr ;段内直接短转移 JMP NEAR PTR opr ;段内直接近转移 JMP WORD PTR opr ;段内间接转移 JMP FAR PTR opr ;段间直接转移 JMP DWORD PTR opr ;段间间接转移,74,第3章,寻址方式和指令系统,2. 条件转移指令 条件转移指令是根据上一条指令所设置的条件码来测试,被测试的内容为状态标志位。满足测试条件则转移到指令中指定的位置去执行,如果不满足条件则顺序执行下一条指令。 条件转移指令根据判断的标志位不同,通常可以归纳为3类:即判断单个标志位状态、比较无符号数高低和比较带符号数大小。这3类指令在使用之前,应该有比较CMP、测试TEST、加减或逻辑运算等指令。,75,条件转移指令: 注意:只能使用段内直接寻址的8 位位移量 (1) 根据单个条件标志的设置情况转移 格式 测试条件 JZ(JE) OPR ZF = 1 JNZ(JNE) OPR ZF = 0 JS OPR SF = 1 JNS OPR SF = 0 JO OPR OF = 1 JNO OPR OF = 0 JP OPR PF = 1 JNP OPR PF = 0 JC OPR CF = 1 JNC OPR CF = 0,76,(2) 比较两个无符号数,并根据比较结果转移* 格式 测试条件 = JNB(JAE,JNC) OPR CF = 0 JNBE(JA) OPR CFZF = 0 * 适用于地址或双精度数低位字的比较,77,(3) 比较两个带符号数,并根据比较结果转移* 格式 测试条件 = JNL(JGE) OPR SFOF = 0 JNLE(JG) OPR (SFOF)ZF = 0 * 适用于带符号数的比较 (4) 测试 CX 的值为 0 则转移 格式 测试条件 JCXZ OPR (CX)=0,78,例:如果 X50,转到TOO_HIGH;计算 X-Y,如果溢出 转到 OVERFLOW,否则 |X-Y| RESULT,JG JO JNS,79,例:、 是双精度数,分别存于 DX,AX 及 BX,CX 中, 时转 L1 ,否则转 L2,CMP DX, BX JG L1 JL L2 CMP AX, CX JA L1 L2: L1: ,80,第3章,寻址方式和指令系统,3. 循环控制指令 将一段代码程序执行多次操作即为循环,采用循环控制指令实现。循环控制转向的目的地址是在以当前IP内容为中心的128127的范围内,指令采用CX作为计数器,每执行一次循环,CX内容减1,直到为零后循环结束。 (1)循环控制指令LOOP (2)为零或相等时循环控制指令LOOPZ/LOOPE (3)不为零或不相等时循环控制指令LOOPNZ/LOOPNE 注意: * CX 中存放循环次数 * 只能使用段内直接寻址的8 位位移量,81,执行步骤: (1) (CX) (CX) - 1 (2) 检查是否满足测试条件,如满足则(IP) (IP) + 8位位移量,实行循环;不满足则 IP 不变,退出循环。 循环指令:LOOP OPR 测试条件:(CX) 0 为零或相等时循环指令:LOOPZ(LOOPE) OPR 测试条件:ZF=1 且 (CX) 0 不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR 测试条件:ZF=0 且 (CX) 0,82,例:求首地址为 ARRAY 的 M 个字之和, 结果存入 TOTAL,MOV CX, M MOV AX, 0 MOV SI, AX AGAIN: ADD AX, ARRAYSI ADD SI, 2 LOOP AGAIN MOV TOTAL, AX,83,例:在多重循环的程序结构中,CX 计数器的保存和恢复,MOV CX, M AGAIN: PUSH CX MOV CX, N NEXT: LOOP NEXT POP CX LOOP AGAIN,MOV DI, M AGAIN: MOV CX, N NEXT: LOOP NEXT DEC DI JNZ AGAIN,84,第3章,寻址方式和指令系统,4. 子程序调用和返回指令 (1)子程序调用指令 指令格式为:CALL NEAR PTR opr ;段内调用 CALL FAR PTR opr ;段间调用 (2)子程序返回指令RET 指令格式: RET 或 RET 表达式,85,子程序调用和返回指令:,86,CALL 调用指令 段内直接近调用:CALL DST 执行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) (IP) + 16位位移量 段内间接近调用:CALL DST 执行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) (EA),87,段间直接远调用:CALL DST 执行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (CS) (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) 偏移地址 (CS) 段地址 段间间接远调用:CALL DST 执行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (CS) (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) (EA) (CS) (EA+2),88,RET 返回指令 段内近返回:RET 执行操作: (IP) ( (SP)+1,(SP) ) (SP) (SP) + 2 段内带立即数近返回:RET EXP 段间远返回:RET 执行操作: (IP) ( (SP)+1,(SP) ) (SP) (SP) + 2 (CS) ( (SP)+1,(SP) ) (SP) (SP) + 2 段间带立即数远返回:RET EXP,89,例:带立即数返回,code segment main proc far push ax push bx push cx call sub ret main endp sub proc near ret 6 sub endp code ends,(SP),90,中断指令:,91,中断指令: INT TYPE 或 INT 执行操作: (SP) (SP) - 2 ( (SP)+1,(SP) ) (PSW) (SP) (SP) - 2 ( (SP)+1,(SP) ) (CS) (SP) (SP) - 2 ( (SP)+1,(SP) ) (IP) (IP) (TYPE*4) (CS) (TYPE*4+2) 溢出中断指令:INTO 执行操作: 若OF=1, (IP) (10H) (CS) (12H),92,从中断返回指令:IRET 执行操作: (IP) ( (SP)+1,(SP) ) (SP) (SP) + 2 (CS) ( (SP)+1,(SP) ) (SP) (SP) + 2 (PSW) ( (SP)+1,(SP) ) (SP) (SP) + 2,注意: * TYPE (0255) 是中断类型号, 隐含的类型号为3 * INT 指令还把 IF 和 TF 置0,但不影响其它标志位 * IRET 指令执行完,标志位由堆栈中取出的值确定,93,第3章,寻址方式和指令系统,3.3.6 处理器控制类指令 这类指令主要用于修改状态标志位、控制CPU的功能如使CPU暂停、等待、空操作等。 标志处理指令 CLC、 STC、 CMC、 CLD、STD、 CLI、STI 其他处理机控制与杂项操作指令 NOP、HLT、WAIT、ESC、LOCK,94,标志处理指令: CLC CF 0 CMC CF CF STC CF 1 CLD DF 0 STD DF 1 CLI IF 0 STI IF 1 注意: * 只影响本指令指定的标志,95,其他处理机控制与杂项操作指令: NOP 无操作 (机器码占一个字节) HLT 暂停机 (等待一次外中断,之后继续执行程序) WAIT 等待 (等待外中断,之后仍继续等待) ESC 换码 LOCK 封锁 (维持总线的锁存信号,直到其后的指令 执行完) 注意: * 不影响条件标志,96,第3章,寻址方式和指令系统,3.4 DOS功能调用和BIOS中断调用 磁盘操作系统DOS(Disk Operating System)是PC机上最重要的操作系统,DOS功能调用可完成对文件、设备、内存的管理。对用户来说,这些功能模块就是几十个独立的中断服务程序,这些程序的入口地址已由系统置入中断向量表中,在汇编语言程序中可用中断指令直接调用。DOS模块提供了更多更必要的测试,使DOS操作更简易,而且对硬件的依赖性更少。,97,第3章,寻址方式和指令系统,8086存储器系统8K的ROM中存放有基本输入输出系统BIOS(Basic Input/Output System,)例行程序。BIOS给PC系列的不同微处理器提供了兼容的系统加电自检、引导装入、主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来极大方便。程序员不必了解硬件的具体细节

温馨提示

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

评论

0/150

提交评论