Presentation is loading. Please wait.

Presentation is loading. Please wait.

微型计算机技术 教 学 指 导(三) 太原广播电视大学 郭建勇.

Similar presentations


Presentation on theme: "微型计算机技术 教 学 指 导(三) 太原广播电视大学 郭建勇."— Presentation transcript:

1 微型计算机技术 教 学 指 导(三) 太原广播电视大学 郭建勇

2 第3章 8086指令系统及寻址方式 学习要求:了解编辑程序、汇编程序、连接程序的功能及其输入和输出文件的类型;了解汇编语言源程序框架,熟悉程序段定义和过程定义伪操作;熟悉数据类型和数据定义伪操作;熟练掌握并运用8086指令集及各类寻址方式。 3.1 汇编语言程序格式 机器指令:能控制计算机完成一个操作的二进制代码称为机器指令。 机器语言:机器指令集以及使用它们编写程序的规则称为机器语言。 汇编指令:用助记符代替机器指令,即将机器语言指令符号化。 汇编语言:汇编指令集以及使用它们编写程序的规则称为汇编语言。 汇编语言程序:用汇编语言编写的程序。 汇编语言程序必须由汇编程序转换(汇编)成机器代码(目标代码)。 汇编指令:助记符(操作命令)和操作数部分构成。 汇编语言程序 汇编伪指令:伪指令指示汇编程序如何进行汇编。 数据传送(MOVE)指令: MOV DEST , SRC 助记符 目的操作数 源操作数

3 MOV指令功能:传送(move)源操作数到目的操作数域。例如:
MOV DX , CX ; (CX)→(DX) 指令执行后,DX寄存器的值与CX寄存器的值相同,MOV不影响源操作数。 对操作数的要求是源操作数可以是立即数、寄存器数、存储器数;目的操作数只能是寄存器数、存储器数;但不能同时为存储器数。 注意: (1)数值不能支接装入段寄存器(CS,DS,ES,SS),如果要在段寄存器中装入一个数值,则先将它装入任一个非段寄存器,然后再传送到段寄存器。 例:MOV AX ,2000H MOV DS ,AX MOV DI ,1400H MOV ES ,DI (2)如果将小于FFH(8位)的数值传送到一个16位的寄存器,那么寄存器的高位填入0。例如,MOV BX,5,结果(BX)=00059即(BH)=00,(BL)=05。 (3)传送大于寄存器位数的数值将引起错误。

4 3.1.1 一个简单程序实例 加法指令: ADD DEST ,SRC 指令功能: (DEST)+(SRC)→DEST
指令执行后,DEST的内容是两个操作数的和,ADD指令影响标志寄存器。 对操作数的要求是源操作数可以是立即数、寄存器数、存储器数;目的操作数只能是寄存器数、存储器数;但不能同时为存储器数。 例: MOV AL ,25H ; 25H →AL MOV BL ,36H ; 36H →BL ADD AL ,BL ;(AL)+(BL) →AL 一个简单程序实例 汇编语言程序行由四个域组成: [标号:] 助记符 [操作数] [;注释] (1)标号域:标号名或变量名不能超过31个字符,与紧随其后的代码行地址发生对应关系。 (2)助记符 :指令和伪指令。 (3)操作数:双操作数(目的操作数与源操作数)或单操作数。 (4)注释以“;”始,常用来说明一条指令或一段程序的功能。

5 STSEG SEGMENT DB 64 DUP(?) MOV AH ,4CH ;返回DOS STSEG ENDS INT H DTSEG SEGMENT MAIN ENDP DATA1 DB 36H CDSEG ENDS DATA2 DB 4BH END START SUM DB ? DTESG ENDS CDSEG SEGMENT MAIN PROC FAR ASSUME CS:CDSEG, DS:DTSEG, SS:STSEG, START: MOV AX ,DTSEG MOV DS ,AX ;装载DS MOV AL ,DATA1 ;DATA1→AL MOV BL ,DATA2 ;DATA2→BL ADD AL,BL ;AL+BL →AL MOV SUM,AL ;结果送SUM

6 1.汇编程序的段 汇编语言程序一般由三个段组成:堆栈段、数据段和代码段。段定义伪操作SEGMENT和ENDS表示一个段的开始和结束。格式如下: NAME SEGMENT NAME ENDS 2.ASSUME伪操作 该伪操作把程序中定义的各个段分配给段寄存器,使程序中使用的段名与段寄存器建立起对应关系。使得汇编程序清楚在计算地址时使用哪一个段地址。 程序在执行之前,必须为DS或ES进行段地址的装填。例如: MOV AX ,DATA1 MOV DS ,AX 或 MOV ES ,AX 程序最后两条指令的功能是返回DOS操作系统: MOV AH ,4CH INT 21H 3.程序结束伪操作 最后三行分别是过程结束、段结束和程序结束语句。END伪操作结束整个程序,它的格式为: END 标号 ;第一条指令的标号

7 汇编、连接和运行一个程序’ 建立一个可执行的汇编语言程序需要以下三个步骤: (1)用编辑程序(EDIT.KXE或QE。EXE)建立ASM源文件; (2)用汇编程序(MASM.EXE或TASM.EXE)把ASM文件转换成OBJ文件; (3)用连接程序(LINK.EXE或TLINK.EXE)把OBJ文件转换成EXE文件。 1..asm和.obj文件 .asm文件(源文件)是用编辑程序建立的文件。MASM汇编程序将ASM源文件转换为机器语言.obj目标文件),还可以产生.lst列表文件以及.crf交叉引用文件。 2..1st列表文件 LST文件列出了全部机 器语言代码、偏移地址以及MASM检查出来的错误。 程序员一般用它来帮助调试程序。 3.PAGE和TITLE伪操作 4..crf交叉引用文件 交叉引用表列出了程序中使用的所有符号,以及这些符号被定义的行号和被引用的行号。 5.连接和运行程序

8 数据类型和数据定义 80x86提供了定义各种数据类型及存储器分配的伪操作,这些伪操作在汇编程序对源程序进行汇编期间,由汇编程序完成的数据类型定义、分配存储器单元等功能。 1.数据类型 8088/86使用的数据类型是8位或16位的正数和负数。在计算机内部,负数采用补码形式表示。 2.数据定义伪操作 ORG(origin)ORG伪操作用来表示段的起始的偏移地址,其格式为: ORG 2000H ; 表明其下面程序段的起始偏移地址为2000H。 DB伪操作用来定义字节,其格式为: DATA1 DB 25,12, 32H ;25,12,32H各占一个存储单元(字节) DATA2 DB ‘1234’,’ABCD’ ;每个字符的ASCII码占一个存储单元 DATA3 DB ? ;占一个存储单元内容不确定 DW伪操作用来定义字;DD伪操作用来定义双字;DQ伪操作用来定义4字; DT伪操作用来为压缩的BCD数据分配存储单元。

9 DUP伪操作可以按照给定的次数来复制某个(某些)操作数,它可以避免多次键入同样一个数据。例如,把6个FFH存入相继字节中,可以用下面两种方法,显然用DUP的方法更简便些。
DATA DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH DATA DB DUP(0FFH) DUP操作一般用来保留数据区,例如设置堆栈区等。 DATA DB 32 DUP (?);保留32个字节单元为堆栈区。 EQU是一个赋值伪操作,它给一个数据标号赋予一个常数值,但这个常数不占用存储单元。例如: COUNT EQU ; 定义COUNT等于25 “=”伪操作也是一个赋值伪操作,与EQU类似的赋值伪操作。区别是,EQU伪操作中的标号名是不允许重复定义的,而“=”伪操作则允许重复定义。 TMP = 5 TMP =TMP + 1 ;是允许使用的。 而 COUNT EQU 5 COUNT EQU COUNT + 1 ;则是错误语句。 因为EQU伪操作中的标号名是不允许重复定义的,

10 3.2 寻址方式与机器语言转换 寻址方式是指令中表示操作数位置(地址)的方式。 3.2.1 寻址方式
3.2 寻址方式与机器语言转换 寻址方式是指令中表示操作数位置(地址)的方式。 寻址方式 1.与数据有关的寻址方式:七种寻址方式。 (1)寄存器寻址方式:用寄存器来存放要处理的操作数。不需要访问存储器,是一种快速的寻址方式。例: MOV AX ,BX ;(BX)→(AX) MOV ES, AX ;(AX)→(ES) ADD AL ,BH ;(BH)+(AL) →(AL) (2)立即寻址方式:在指令中,源操作数是一个常数。这个常数就存放在指令的操作码之后,所以称为立即数。例: MOV AX ,2674H ;(AX) ← 2674H MOV CX , ;(CX) ← 46 ADD CL ,20H ; (CL)← 20H 给段寄存器传送数据,应先将数据传送给任一个通用寄存器,然后再由寄存器传送给段寄存器,例如: MOV AX , 1250H MOV DS , AX

11 (3)直接寻址方式:直接寻址方式中,操作数存放在存储单元中,而这个存储单元的地址就在指令的操作码之后。例如:
MOV DL ,[2400H] ;2400H是操作数地址的偏移量 MOV AL ,DATA1 ;DATA1是操作数符号(变量或标号)地址 直接寻址中:操作数的物理地址=(DS)×10H + 偏移地址 MOV AL ,ES:[2400H] ;是段超越方式,段寄存器用的是ES (4)寄存器间接寻址方式:指令指定的寄存器存放的是操作数地址的偏移量。 20位的物理地址=段地址((DS)×10H)与寄存器中的偏移地址相加。 MOV AL ,[BX] ; MOV AX ,[SI] ; 段寄存器为DS MOV DH ,[DI] ; MOV AL ,[BP] ; 段寄存器为SS 寄存器间接寻址方式可以用于表处理,基址寄存器或变址寄存器初始化为表的首地址后,每取—个数据就修改寄存器的值,使之指向下一个数据。 (5)寄存器相对寻址方式:基址寄存器BX、BP或变址寄存器SI、DI与一个位移量相加形成有效地址(EA)。 20位的物理地址=段地址((DS)×10H)与有效地址(EA)相加。(使用BP时是SS)

12 (3)直接寻址方式 直接寻址方式是指:指令所需的操作数存放在存储单元中,操作数的有效地址EA直接由指令代码中的位移量提供。在源程序中,直接寻址方式可以用数值地址或符号地址来表示。 用数值地址表示 用符号地址表示 MOV DL,[2400H] MOV AL,DATA1 操作码 DS MOD R/M 位移量 00H EA 24H DATA1 2FH 2FH DS AL EA 2400H 34H 34H DL

13 (4)寄存器间接寻址方式 寄存器间接寻址是指:指令所需的操作数在存储单元中,操作数的有效地址EA直接从基址寄存器(BP或BX)或变址寄存器(SI或DI)中获得。间接的含义是寄存器中存放的是操作数的地址,而不是操作数。 例: MOV CH ,[SI] MOV [DI] ,BX MOV AL ,[BX] MOV CX ,[BP] 等价于: MOV CH ,DS:[SI] MOV DS:[DI],BX MOV AL ,DS:[BX] MOV CX ,SS:[BP] 操作码 MOD R/M SI DI EA BX BP DS或SS 段基值 0000 SI DI BX BP + EA SI、DI、BX对应于DS BP对应于SS 20位的物理地址

14 寄存器间接寻址中寄存器的作用相当于一个地址指针,用于寻址连续地址的区域非常方便。
DS DS EA=0020H EA=0021H 寄存器 寄存器 0020H A1 0021H A1 A2 A2 A3 A37 A4 A4 A5 A5 A6 A6 寄存器加1后

15 (5)寄存器相对寻址(变址寻址与基址寻址)
操作数在存储单元中,指令中给出的寄存器的内容与指令中给出的位移量之和是有效地址EA。使用SI、DI称为变址寻址,使用BX、BP称为基址寻址。 指令格式为: MOV AX , 10H[SI] MOV AX , ARRY[DI] MOV TABLE[BX] ,12H MOV TABL1[BP] ,CL 等价于: MOV AX ,DS:10H[SI] MOV AX ,DS:ARRY[DI] MOV DS:TABLE[BX] ,12H MOV SS:TAB1[BP] ,CL 操作码 MOD R/M 位移量 SI DI + EA BX BP SI、DI、BX对应于DS BP 对应于SS 变址寻址与基址寻址中EA的构成

16 (6)基址变址寻址 指令所需的操作数在主存单元中,操作数的有效地址EA是基址寄存器(BX或BP)内容、变址寄存器(SI或DI)内容之和,称为基址变址寻址方式。 指令格式为: MOV AX,[BX][SI] MOV [BX][DI],0FFH MOV AX,[BP][SI] MOV [BP][DI],DL 上述指令分别等价于: MOV AX,DS:[BX][SI] MOV DS:[BX][DI],0FFH MOV AX,SS:[BP][SI] MOV SS:[BP][DI],DL 操作码 MOD R/M SI + → EA DI BX BP 基址变址寻址方式中EA 的构成 BX对应于DS BP对应于SS

17 (7)相对基址变址寻址 指令所需的操作数在主存单元中,操作数的有效地址EA是三个地址分量之和,即基址寄存器(BX或BP)内容、变址寄存器(SI或DI)内容与指令中的位移量(8位或16位)之和,称为基址变址寻址方式。 指令格式为: MOV DH ,[BX+SI+20H] 或 MOV DH ,20H[BX][SI] MOV AX,FILE[BX+SI] MOV TAB1[BP][DI],DL 上述指令分别等价于: MOV DH ,DS:20H[BX][SI] MOV AX ,DS:FILE[BX][SI] MOV SS:TAB1[BP][DI],DL 物理地址=(DS)×10H+(BX)+(SI)+20H 操作码 MOD R/M 位移量 SI + → EA DI BX BP 基址变址寻址方式中EA 的构成 BX对应于DS BP对应于SS

18 2.与转移地址有关的寻址方式 与转移地址有关的寻址方式最终确定的是一条指令的地址。
顺序执行的指令地址是由指令指针(1P)自动增量形成的,而程序转移的地址必须由控制转移类指令JMP和调用CALL指出,这类指令的寻址方式包括: 段内直接寻址 、段内间接寻址;段间直接寻址 、段间间接寻址 CS:IP寄存器总是指向下一条将要执行的指令的首地址(称为IP当前值),修改IP或CS、IP的值,都会使程序发生转移。只修改IP的值,称为段内转移, CS和IP都修改为新的值,称为段间转移。 短转移(SHORT)表示位移量在-128~127字节之间; 近转移(NEAR)表示在同一段内的转移,位移量在-32768—32767字节范围内。 远转移(FAR)表示转移距离超过±32K字节,或是在不同段之间转移。 (1)段内直接寻址方式。这种寻址方式在指令中直接给出转向地址,如: JMP SHORT NEXT JMP NEAR PTR AGAIN NEXT和AGAlN均为转向的符号地址。在机器指令中,操作码之后给出的是相对于当前IP值的位移量。

19 (2)段内间接寻址方式。这种寻址方式在指令中用数据寻址分式(除立即寻址方式外)间接地指出转向地址,如:
JMP AX JMP BX JMP NEAR PTR [BX] JMP NEAR PTR [DI+20H] (3)段间直接寻址方式。指令中直接给出转向地址(标号),不同的是,在符号地址之前要加上表示段间远转移的操作符 FAR PTR。例如: JMP FAR PTR OUTSEG (4)段间间接寻址方式。这种寻址方式仍然是用相继两个字的内容装人IP和CS来达到段间的转移目的的,但这两个字的存储器地址是通过指令中的数据寻址方式(除立即寻址方式和寄存器寻址方式外)来取得的。例如: JMP DWORD PTR [SI] JMP DWORD PTR [DI+4]

20 机器语言指令的转换 1.机器语言组成 8086机器语言指令是一种可变长度的指令,可以由1~7个字节组成,取决于指令的操作码、寻址方式以及操作数长度等因素。 段前缀 操作码 寻址方式 数据/偏移量 数据/扁移量 数据 数据 2.段前缀字节 段前缀又称作段跨越前缀,当指令中没有段前缀(如ES:)时,机器指令中无此字节。 00 ES 01 CS 10 SS 11 DS SEGPIX OPCODE MODE DATA/DISP DATA/DISP DATA DATA 001 SEG 110

21 3.操作码字节 操作码决定微处理器执行的操作,如传送、加法、减法等,通常用机器指令的第一个字节表示。多数机器指令的操作码占用一个字节,有时一个字节不够,在下一个字节再占用3位。 W = 0 字节操作 sw = 00 字节操作 1 字操作 字操作 d = 0 reg 为源操作数 立即数由8位 1 reg 为目的操作数 扩展为16位 一般指令 OPC d w 立即寻址指令 OPC s w

22 多数机器指令的第二个字节表示寻址方式及有无位移量。
4.寻址方式字节 多数机器指令的第二个字节表示寻址方式及有无位移量。 MOD= 存储器寻址,无偏移量 寄存器寻址,8位偏移量 存储器寻址,16位偏移量 寄存器寻址 Reg域表示寄存器寻址方式,与w位组合确定寄存器。 MOD REG R/M REG W= W=0 REG W= W=0 AX AL SP AH CX CL BP CH DX DL SI DH BX BL DI BH Reg域与w位组合表示寄存器

23 mod域与r/m域组合,表示指令的另一个寻址方式,如果mod=ll,则是寄存器寻址方式。寄存器由r/m域确定;如果mod=00,01或10,则指定存储器寻址方式。r/m域选择其中一种存储器寻址方式。

24 以MOV指令为例,根据不同的寻址方式MOV指令的机器语言可以有以下5种格式。
(1)MOV REG1,REG2 或 MOV REG ,MEM 或 MOV MEM ,REG (2)MOV AL(X) ,MEM 或 MOV MEM, AL(X) (3)MOV SEGREG , REG 或 MOV REG ,SEGREG MOV SEGREG , MEM 或 MOV MEM ,SEGREG (4)MOV REG , DATA (5)MOV MEM ,DATA 100010DW MOD REG R/M DISP(底位) DISP(高位) 101000DW OFFSET(低位) OFFSET(高位) 100011D0 MOD REG R/M DISP(低位) DISP(高位) 1011WRRR DATA (低位) DATA(高位) W MOD 000 R/M DISP低位 DISP高位 DATAD低位 DATA高位

25 (1)MOV BP , SP ;机器指令 8BECH 长度 2B
5. 机器指令举例 (1)MOV BP , SP ;机器指令 8BECH 长度 2B OPC DW MOD BP SP (2)MOV DL , [BX] ;机器指令 8A17H 长度 2B OPC DW MOD DL [BX] (3)MOV [BP] , CL ;机器指令 884E00H 长度3B OPC DW MOD CL [BP] DISP(8 BIST) (4)MOV [BX+1200H],2468H ;机器指令 C H 长度 6B OPC W MOD [BX+D16] DISP(00H) DISP(12H)DATA(68H)DATA(24H) (5) MOV DS , AX ;机器指令 8ED8H 长度 2B OPC D MOD DS AX

26 3.3 8086指令系统 3.3.1 数据传送指令 (1)通用数据传送指令
指令系统 数据传送指令 (1)通用数据传送指令 数据传送指令的功能是把数据、地址传送到寄存器或存储器单元中。它分为以下4类: (1)通用数据传送指令 (3)地址传送指令 MOV DST ,SRC ; 传送 LEA 有效地址送寄存器 PUSH ; 进栈 LDS 地址指针送寄存器和DS POP ; 出栈 LES 地址指针送寄存器和ES XCHG ; 交换 (4)标志寄存器传送指令 (2)累加器专用传送指令 LAHF 标志送AH IN ; 输入 SAHF AH送标志寄存器 OUT ; 输出 PUSHF 标志进栈 XLAT ; 换码 POPF 标志出栈

27 MOV指令在前面已有介绍,它的功能是将源操作数(字节或字)传送到目的地址。 PUSH src ; 进栈指令 POP dst ; 出栈指令
1.通用数据传送指令 MOV dst,src ; 传送指令 执行操作:(dst) ← (src) MOV指令在前面已有介绍,它的功能是将源操作数(字节或字)传送到目的地址。 PUSH src ; 进栈指令 POP dst ; 出栈指令 执行操作: (SP) ←(SP) 执行操作: (dst) ←((SP)) ((SP)) ← (src) (SP) ← (SF)十2 PUSU AX PUSH BX POP BX POP AX AX BX BX AX SP-2 BL SP BL BH BH SP-2 AL SP AL SP+2 AL SP AL AH AH AH AH SP 栈底 栈底 栈底 SP+2 栈底

28 PUSH指令执行时,SP的内容先减2,然后将数据压入SP所指示的字单元,高8位存入高地址字节,低8位存人低地址字节。POP指令执行时,将SP所指示的栈顶地址的内容取出放人目的地址,然后SP增2,指向新的栈顶地址。 使用堆栈指令应注意: (1)PUSH和POP指令只能是字操作,因此存取字数据后,SP的修改必须是+2或-2; (2)PUSH和POP指令不能使用立即数方式; (3)P0P指令的dst不允许是CS寄存器; (4)PUSH和POP指令都不影响标志位。 PUSH指令在程序中常用来暂存某些数据,而POP指令又可将这些数据恢复。但要注意压栈和出栈的顺序。 例: 假设(DS) = 1000H,(SS)=4000H,(SP) = 100H,(BX)=2100H. (12100H)=00A8H,指出连续执行下列各条指令后,有关寄存器、存储单元以及堆栈的 情况。 PUSH DS POP WORD PTR[DI+2] PUSH BX POP DS FUSH [BX] POP DI

29 PUSH DS PUSH BX PUSH (BX)
0FAH 0FAH A8H 0FAH 00H 0FCH 0FCH 00H 0FCH 00H 21H 21H 0FEH 00H 0FEH 00H 0FEH 00H 10H 10H 10H 100H 100H 100H PUSH DS PUSH BX PUSH (BX) 执行结果:(SP)=100-2=0FEH (SP)=OFE-2=0FCH (SP)=OFCH-2=0FAH (400FEH)=1000H (400FCH)=2100H (400FAH)= 00A8H 0FCH 00H 21H 0FEH 00H 0FEH 00H 0FEH 10H 10H 100H 100H 100H POP DI POP WORD PTR (DI+2) POP DS 执行结果:(SP)=OFAH+2=0FCH (SP)=OFC+2=0FEH (SP)=OFEH+2=100H (DI)=00A8H (100AAH)=21OOH (DS)=1000H

30 XCHG opr1,opr2;交换指令 执行操作:(oprl) ←→ (opr2) XCHL;两个操作数。互相交换。一个操作数必须在寄存器中,另一个操作数可以在寄存器或存储器中。 注意:不允许使用段寄存器;不影响标志位。 例3.9 已知(AX)=6634H,(BX)=0F24H,(S1)=0012H,(DS)=1200H, (12F36H)=2500H,写出下列指令执行的结果。 XCHL AH ,AL ;执行前:(AH)=66H,(AL)=34H ;执行后( AH )= 34H,(AL)=66H XCHG AX,[BX十SI] ;执行前:(AX)=6634H,(12F36H)=2500H ;执行后:(AX)=2500H,(12F36H)=6634H 2.累加器专用传送指令(输入、输出) IN AL ,PORT 或 IN AX ,PORT ;输入指令(PORT<0FFH) 执行操作:(AL)或(AX)→ (PORT) ;传送字节或传送字 IN AL ,DX 或 IN AX ,DX ;输入指令 0FFFFH>(DX)>0FFH 执行操作:(AL)或(AX)→((DX));传送字节或传送字

31 输出指令:OUT PORT , AL (或AX); 执行操作: (PORT) →(AL)传送字节 或 (AX)传送字
OUT DX ,AL (或AX) ; 执行操作: ((DX)) →(AL)传送字节 或 (AX) 传送字 注意:只限于在AL或AX与I/O端口之间传送信息;不影响标志位。 换码指令: XLAT ;(查表指令) 执行操作:(AL) ←((Ds)×1OH 十(BX)十(AL)) 注意:表格的长度不能超过256B,因为存放位移量的是8位寄存器AL;XLAT指令不影哨标志位。 (DS)×10H 十(BX)= 表首地址 A0=0 A1=1 (AL) 位移量 A2=4 A3=9 平方表 本例中若 (AL)= 4 执行后 (AL)=16 A4=16 A5=25

32 这组指令完成把地址送到指定寄存器的功能。 有效地址送寄存器 : LEA REG , SRC
3.地址传送指令 这组指令完成把地址送到指定寄存器的功能。 有效地址送寄存器 : LEA REG , SRC LEA指令把源操作数的有效地址(偏移地址)送到指定的寄存器(REG) 如(DS)=2000H DATA1是21200H单元的符号地址,则有: OFFSET DATA1= 1200H。 而指令 LEA BX , DATA1 执行后 (BX)=1200H ; DATA1的地址偏移量 指针送寄存器和DS : LDS REG,SRC 指针送寄存器和ES : LES REG,SRC 执行操作:LDS和LES指令把SRC指定的 内存单元位置的偏移地址送寄存器,段地 址送DS或ES。 例: LDS BX , DAT1 执行后: (DS)= 3000H (BX)= 2200H DATA1 21200H DAT1 00H 偏移量 22H 00H 段地址 30H

33 ((SP)十1,(SP)) ←(FLAGS) POPF 标志出栈 执行操作:(FLAGS) ←((SP)十l,(SP))
4.标志寄存器传送指令 这组指令完成和标志位有关的操作。 LAHF ; 标志寄存器的低字节送AH 执行操作:(AH) ←(FLAGS)0~7 SAHF ; AH送标志寄存器低字节 执行操作:(FLAG)0~7 ←(AH) PUSHF 标志进栈 执行操作:(SP) ←(SP)一2 ((SP)十1,(SP)) ←(FLAGS) POPF 标志出栈 执行操作:(FLAGS) ←((SP)十l,(SP)) (SP) ←(SP)十2 (1)LAHF和SAHF指令隐含的操作寄存器是AH和FLAGS。 (2)LAHF和PUSH不影响标志位,SAHF和POPF则由装入的值来确定标志位的值。 AH AL FLAGS AH AL FLAGS

34 3.3.2 算术运算类指令 1.加法运算指令 (1)加法指令 指令格式:ADD DST,SRC
算术运算类指令 算术运算类指令包括加、减、乘、除4种指令。这类指令可以对字节或字数据进行运算,参加运算的数可以是无符号数或带符号数。8086/8088提供十进制数运算校正指令,因此参加运算的数也可以是BCD码表示的十进制数。 1.加法运算指令 (1)加法指令 指令格式:ADD DST,SRC 指令功能:(DST)←(SRC)+(DST),即源操作数与目的操作数相加,其和送人目的地址中。并根据相加结果设置标志寄存器的OF、SF、ZF、AF、PF和CF标志位。该指令执行后,源操作数保持不变。 源操作数可以是寄存器或存储器操作数,或是立即数; 目的操作数只能是寄存器或存储器操作数,不能是立即数。 两个操作数不能同时为存储器操作数。 加法指令的常用格式有: ADD BX,SI ADD AX,0F8CH ADD DL,TAB[BX]

35 例:MOV BX,9B8CH ;(BX)=9B8CH ADD BX,6476H ;(BX)=(BX)+6476H
(BX) 结果为零,则ZF=1 +6478H 结果无溢出,则OP=0 (2)带进位加法指令 指令格式:ADC DST,SRC 指令功能(DST)←(SRC)十(DST)十CF。即在完成2个操作数相加的同时,将标志位CF 加上,求出的和数送入目的地址中。并根据相加的结果设置标志位OF,SF,ZF,AF,PF、和CF。 1 自动丢失 有进位 AF=1 有进位CF=1 符号位为0SF=0 (BX)= =0000H

36 ADC指令主要用于大于16位数的相加运算。即多字节的加法。
例:一个32位无符号数存放在DX(高16位)、AX(低16位)中,若要加上常数76F1A23H,则用以下指令来实现: ADD AX,1A23H ADC DX,76FH 其中第一条指令把16位常数加在AX中,若产生进位,则记录在CF中。由ADC指令在完成高16位相加的同时,将低16位的进位也加上。 进位 进位 进位 最高字节 高一位字节 最低字节 + + +

37 例: 编写执行双精度数(DX,CX)和(BX,AX)相加的指令序列,DX是目的操作
( DX,CX)=A248 2ACOH,(BX,AX)=088A E25BH。 指令序列:ADD CX ,AX ;低位字相加 ADC DX ,BX ;高位字相加,要加进位 执行ADD指令 2AC + E2B 1 ← 0D1B ← 标志设置: SF=0 ZF= CF=1 OF=0 执行ADC指令 A 088A ← CF AAD 标志设置: SF=1 ZF=0 CF=0 0F=0

38 (3)加1指令 指令格式:INC DEST . 指令功能:DEST←(DEST)十1,即目的操作数加1后送回目的地址中。并根据执行结果设置标志位0F,SF,ZF、,AF、和PF,但不影响CF。 INC指令只有一个操作数,操作数可以是字节或字,且被当作无符号数。其操作数只能在通用寄存器或存储单元中,不能是立即数。 INC指令主要用于计数器的计数或修改地址指针。INC指令的使用格式如下: INC CX INC DI INC COUNT 2.减法运算指令 (1)减法指令 指令格式:SUB DST,SRC ; 指令功能:DST←(DST)-(SRC),目的操作数中减去源操作数,其差值送入目的地址中。并按相减的结果置标志位OF,SF,ZF,AF,PF和CF。 SUB指令可以进行字节或字运算。其源和目的操作数可以在通用寄存器或存储单元中,但两者不能同时在存储器。立即数可以作源操作数,但是不能作目的操作数。

39 (2)带借位减法指令 指令格式:SBB DST ,SRC 指令功能(DST)←(DST)-(SRC)-CF;即在完成2个操作数相减的同时,还要减去借位CF。对标志的影响及操作数的要求同SUB。常用于多字节减法。 (3)减1指令 指令格式:DEC OPR 指令功能(OPR)←(OPR)-1,即目的操作数减1后送回目的地址中,并根据执行结果设置标志位OF,SF,OF,AF和PF,但不影响CF。 (4)比较指令 指令格式:CMP OPR1 ,OPR2 指令功能(OPR1)-(0PR2) 根据执行结果设置标志位OF,SF,OF,AF和PF,但不送结果。 (5)求补指令 指令格式:NEG OPR 指令功能(OPR)← -(0PR) 即把操作数变成与其符号相反的数:正数→求补→负数→求补→正数

40 例:分析下列程序的执行情况: DATA—A DD FAH DATA—B DD BH RESULT DD ? MOV AX ,WORD PTR DATA—A ;(AX)=62FAH SUB AX ,WORD PTR DATA—B ;62FAH - 963BH → AX M0V WORD PTR RESULT,AX ;低位差存入内存RESULT MOV AX ,WORD PTR DATA—A+2 ;(AX)=0625H SBB AX ,WORD PTR DATA—B+2 ;0625H H - CF → AX MOV WORD PTR RESULT,AX ;高位差存入内存RESULT 答:SUB指令执行后,(AX)=62FAH-963BH=0CCBFH,CF=1(有借位)。执行SBB指令后,(AX)=625H-412H-1=212H,CF=0,OF=0,因此,保存于RESULT的结果数据为0212CCBFH。

41 3.乘法指令 乘法指令分为无符号数乘法指令和带符号数乘法指令2种。 (1)无符号数乘法指令 (2)有符号数乘法指令
(1)无符号数乘法指令 (2)有符号数乘法指令 指令格式:MUL SRC 指令格式:IMUL SRC 其中(SRC)是乘法运算的一个操作数,它只能在通用寄存器或存储单元中。另一个操作数隐含在AL或AX(字节乘法或字乘法)寄存器中。乘法运算所得到的双倍长的乘积隐含地存放在AX(字节乘法)或DX:AX(字乘法)中。 MUL指令只影响标志寄存器中CF、,OF标志位。MUL指令执行后,如果AH(字节乘法)或DX(字乘法)为全“0”,则CF=0和OF=0;否则CF=1, OF=1(表示AX或DX中有乘积的有效数字)。 AX AL X SRC X SRC AH AL DX AX 字节乘法 字乘法

42 例:两个字节相乘:一个乘数必须放入AL寄存器,另一个乘数可以使用寄存
器寻址方式或存储器寻址方式得到,执行乘法指令后。乘积在AX寄存器中。 DATA1 DB 25H DATA2 DB 65H RESULT DW ? MOV AL , DATA ;AL ← 25H MOV BL , DATA ;BL ← 65H MUL BL ;乘法 MOV RESULT ,AX 或: MOV AL ,DATA1 MUL DATA2 MOV RESTUL ,AX 本例:25H×65H=0E99H,高16位不为0,所以CF=1,OF=1

43 (1)无符号数除法指令 (2)有符号数除法指令 指令格式:DIV SRC 指令格式:IDIV SRC
4.除法指令 (1)无符号数除法指令 (2)有符号数除法指令 指令格式:DIV SRC 指令格式:IDIV SRC 其中(SRC)是除法运算的除数,它可以是8位或16位(字节或字),但只能在通用寄存器或存储单元中。除法的被除数、商、余数都是隐含使用了相关寄存器。 对标志无有效影响。 AL AX SRC AH AL SRC DX AX 被除数 除数 被除数 AH DX 余数 余数 字节除法 字除法

44 5 符号扩展指令 指令格式:CBW ;字节扩展为字 执行操作:当(AL)的最高有效位为0时 (AH)=00H 当(AL)的最高有效位为1时 (AH)=FFH CWD ;字扩展为双字 执行操作:当(AX)的最高有效位为0时 (DX)=0000H 当(AX)的最高有效位为1时 (DX)=FFFFH 这两条指令是无操作数指令隐含使用AL、AH或AX、DX,进行符号扩展的操作数必须存放在AL寄存器或AX寄存器中。 指令功能是:CBW:扩展AL中的符号位至AH中;CWD:扩展AX中的符号位至DX中。在除法指令前,形成双倍长度的被除数,对标志位均无影响。 例:假设(AX)=0BA45H,下列指令分别执行后的结果是什么? (AL)=45H = B 是正数 CBW ;执行后,(AH)=00,(AL)=45H,或(AX)=0045H 仍是正数; (AX)=0BA45H = B 是负数 CWD ;执行后、(DX)=0FFFFH,(AX)=0BA45H 仍是负数

45 例:编写程序。分别实现下列数据的无符号除法和带符号除法。
DATA DW H DATA DW H QUIT DW ? REMAIN DW ? (1) MOV AX ,DATA ;(AX)← 9400H MOV DX , ;(DX,AX)= H DIV DATA2 MOV QUIT ,AX ;QUIT ← 16位商 MOV REMAIN ,DX ;REMAIN ←余数 (2) MOV AX ,DATA ;(AX)← 9400H CWD ;(DX,AX)=OFFFF 9400H IDIV DATA2

46 6.十进制调整指令 (1)BCD码 BCD码是用4位二进制编码表示一位十进制数字的编码的方法。 组合型:1个字节表示2个BCD码,即两位十进制数 非组合型:l个字节的低4位表示一个BCD码,高4位为0

47 调整BCD数的运算结果 用BCD码表示的十进制数,计算机直接按二进制的运算规律来进行算术运算,其结果是不正确的,必须经过调整。例如:十进制数17和28相加,其压缩的BCD码分别为 B(17H)和 B(28H),实现这两个数相加的指令如下: MOV AL ,17H H ADD AL ,28H H FH 执行ADD指令后,得到的结果是 B(3FH),这既不是和的二进制数,也不是和的BCD格式。这两个数的和应当是17十28=45( ),为了得到正确的结果必须加06来调整:3F十06=45H。 ASCII码转换成BCD码 从键盘输人数据时,计算机接收的是ASCII码,要将ASCII码表示的数转换成BCD码是很简单的,只要把ASCII码的高4位清零即可。 例如:5的ASCII码是35H只要把35H的高4位清零即可 方法1:MOV AL ,35H 方法2:MOV AL ,35H SUB AL ,30H AND AL ,0FH

48 BCD码运算的方法是:先用二进制数的加、减、乘和除指令对BCD码进行运算,紧接着用BCD码校正指令对运算结果进行校正。
压缩型(组合)加法校正指令 指令格式:DAA 执行DAA指令前,已完成组合型BCD码加法,且加法结果已在AL中。执行DAA指令,对AL中的数据进行校正。结果在AL中,向高位的进位仅在CF中。 指令功能:如果AL中低4位>9或AF=1,则AL←(AL)十06H,AF=1 如果AL中高4位>9或CF=1,则AL←(AL)十60H,CF=1。 非压缩型(组合)加法校正指令 指令格式:AAA 在执行AAA指令前,已完成非组合型BCD码加法运算,和在AL中。AAA指令对AL中的数据进行校正,其结果在AL中,向高位的进位在AH和CF中。 指令功能:若A1L中低4位的值<9,且AF=0,将AL高4位清零,AH和CF置0 AL中低4位的值>9.或AF=1,那么AL←(AL)十6,AH←(AH)十I,且将 AL中高4位清零,AF和CF置“1”。 DAA、AAA的用法是紧跟在加法指令后面。

49 例:压缩型BCD数加法 结果放在DX中 MOV AL, 78H ADD AL, 56H ;低字节BCD码相加 DAA ;低字节和数校正 MOV DL , AL MOV AL , 46H ADC AL , 25H ;高字节BCD码相加 DAA ;高字节和数校正 MOV DH , AL 例:非压缩型BCD数加法 (58+96)结果放在DX中 MOV AL, 08H ADD AL, 06H ;低字节BCD码相加 AAA ;低字节和数校正 MOV AL , 05H ADC AL , 09H ;高字节BCD码相加 AAA ;高字节和数校正

50 组合型减法校正指令 指令格式:DAS 在执行DAS指令前,己完成组合型BCD码减法,且结果在AL中,执行 DAS指令对AL中数据进行校正。校正结果在AL中,向高位的借位仅在CF中。 指令功能:●若AL中低4位>9或AF=1,那么AL←(AL)-6,AF置“1”; ●若AL中高4位>9或CF=1,那么AL←(AL)-60H,CF置1。 非组合型减法校正指令 指令格式:AAS 执行AAS指令前,已完成非组合型BCD码减法,且结果在AL中,执行AAS指令对AL中数据进行校正。校正结果在AL中,向高位的借位在AH和CF中。 指令功能:若AL低4位的值<9,且AF=0,那么将AL高4位清零,AF和CF置0 若AL低4位>9或AF=1,那么AL←(AL)-6和AH←(AH)-1,且将AL中高4位清零,CF和AF置1 DAS 、AAS的用法也是紧跟在减法指令后面。

51 非压缩的BCD码乘法调整指令AAM 执行操作:(AX) ← 把AX中的积调整为非压缩的BCD格式 非压缩的BCD除法调整指令AAD 执行操作:(AX) ← AX中的被除数(非压缩的BCD格式)转化为二进制数 以上两条指令是专为非压缩的BCD码的乘除法而设计的,它们将乘法和除法的结果转换为非压缩的BCD码。要注意的是,AAM和AAD都只对AX寄存器中的数进行调整,它们只影响SF、ZF和PF标志位,其他标志位无定义。 AAM的调整方法为: 执行乘法指令(MUL)后,调整存放在AL寄存器中的乘积 (AH) ←(AL)/0AH的商 (AL) ←(AL)/0AH的余数 AAM实际上是将两个一位数的非压缩BCD码相乘后得到的乘积进行二化十的转换,十位数放在AH中,个位数放在AL中,那么AX中就是乘积的非压缩BCD码。 AAD的调整方法为: 执行除法指令之前,对AX中的非压缩BCD码(被除数)执行: (AL) ←(AH)×10+(AL) ; (AH) ←0 与其他调整指令不同的是,AAD用在DIV指令之前,即先将AX中的被除数调整成二进制数,并存放在AL中,再用DIV指令作二进制数的除法。

52 例:两个ASCII码数7和8相乘,要求结果也为ASCII码。
MOV AL ,”7” ;(AL)=37H AND AL ,0FH ;(AL)=07 MOV DL ,”8” ;(DL)=38H AND DL ,0FH ;(DL)=08 MUL DL ;(AX)=07×08=42=2AH AAM ;(AX)=0402H OR AX ,3030H ;(AX)=3432H 的ASCII码 例:编写ASCII码数的除法程序。 MOV AX , 3539H ;(AX)=3539H 的ASCII码 AND AX , 0F0FH ;(AX)= 的非压缩BCD码 AAD ;(AX)=003BH 的二进制值 MOV BH , 08H ;(BH)= 除数8 DIV BH ;做除法 (AL)=7 商 (AH)=3 余数 OR AX ,3030H ;(AH)=33H (AL)=37H ASCII码

53 3.3.3逻辑指令 这类指令包括逻辑运算指令、测试指令和移位指令。 1.逻辑运算指令 逻辑与指令 AND DST,SRC 指令功能(DST)← (DST) ∧ (SRC) 逻辑或指令 OR DST,SRC 指令功能(DST)←(DEST)∨(SRC) 逻辑异或指令 XOR DST,SRC 指令功能(DST)←(DEST)⊕(SRC) 逻辑非指令 NOT OPR 指令功能(OPR) ←OPR 测试指令 TEST DST,SRC 指令功能:(DEST) ∧ (SRC) ,将源操作数与目的操作数进行按位逻辑与运算,不送结果,设置标志位SF,ZF,PF,相与的结果不保存。标志位CF和OF置0,AF、不确定。 这些指令对操作数都是按位进行逻辑运算的,操作数可以是字节或字。源操作数可以在通用寄存器或存储单元中,或是立即数,而目的操作数不能是立即数,且源和目的操作数不能同时为存储器操作数。NOT指令对标志寄存器各位无影响,其余3条指令AND、OR、XOR均影响标志寄存器SF,ZF,PF。置CF和O为0,AF不确定。

54 这些指令常用于对操作数的某些位进行分离、组合或设置,例如:
(1)对操作数的某些位置0 MOV AL ,35H AND AL ,0FH ;(AL)=05H ∧ SF=0、ZF=0、PF=1、CF=OF= (2)对操作数的某些位置1 MOV AX ,0504H OR AX ,80F0H ∨ SF=1、ZF=0、PF=0、CF=OF= (3)对操作数的某些位取反 MOV BL ,86H ; XOR BL ,03H ⊕ SF=1、ZF=0、PF=0、CF=OF= (4)使寄存器清零 XOR AX ,AX ;(AX)=0 CF=0

55 例:AX中已存放一个带符号数,若要完成(AX)×3÷2运算,可用以下程序段实现:
(2)移位指令 指令格式:算术左移指令 SAL DST ,CNT 算术右移指令 SAR DST ,CNT 指令功能:将DST指定的8/16位寄存器或存储器操作数移位CNT次,移位—次CNT用1替代,移位多次CNT必须用CL(CL存放移位次数)替代。 受影响的状态标志位为OF,SF,ZF、PF、和CF、AF不确定。 算术移位指令主要用于对带符号数的移位。左移一位相当于乘2;右移一位相当于除以2。算术移位后应保持该数的符号不变。 例:AX中已存放一个带符号数,若要完成(AX)×3÷2运算,可用以下程序段实现: MOV DX.AX SAL AX,1 ;AX乘2 ADD AX.DX ;AX乘3 SAR AX,1 ;完成(AX)×3÷2 CF CF SAL指令 SAR指令

56 (2)逻辑移位指令 指令格式:逻辑左移指令 SHL DST,CNT 逻辑右移指令 SHR DST.CNT 指令功能:将DST指定的8/16位寄存器或存储器操作数移位CNT次,移位—次CNT用1替代,移位多次CNT必须用CL(CL存放移位次数)替代。 SHL实现将操作数左移,最高位移人CF中,最低位补0。 SHR实现将操作数右移,最低位移人CF中,最高位补0。 受影响的状态标志位OF、SF,ZF、,PF和CF,而AF不确定。 (3)循环移位指令 指令格式:循环左移指令R0L DST,CNT 循环右移指令ROR DST,CNT 带进位循环左移指令 RCL DST,CNT 带进位循环右移指令 RCR DST,CNT 指令功能:将DST指定的8/16位寄存器或存储器操作数移位CNT次,移位一次CNT可用1替代,移位多次CNT必须用CL(CL中存放移位次数)替代。 CF CF

57 ROL/ROR实现将操作数循环左移/右移。
KCL/RCR实现将操作数和CF一起循环左移/右移。 受影响的状态标志位为CF和OF。CF存放每次移出的位。如果移位指令只移一位,且移位前后操作数的符号位发生变化,则将OF置1;否则置0。如移位次数大于1,则OF不确定。 3个无符号数从高到低依次存放在M十4,M十2,M字单元中,将该数右移一位 CF CF ROL ROR CF CF RCL RCR CF CF CF

58 四、串处理指令 串操作所独有的寻址方式,即源串操作数地址由DS:[SI]表示(DS可以由其他段寄存器替代),目的串操作数地址由ES:[DI]表示(ES不能由其他段寄存器替代)。每次串操作除对字或字节操作数进行相应操作外,同时自动修改变址寄存器中SI/DI的内容,使它们指向下一个字或字节单元。修改SI/DI的规则是:如标志寄存器中DF=0,那么SI/DI加2(字串)或加1(字节串),否则减2(字串)或减1(字节串)。 I.取串指令 指令格式:LODS 源串符号地址 指令功能:(1)AX/AL←(DS:(S1)) (2)SI←(SI)土2或1 (3)对标志寄存器无影响 无操作数指令格式: LODSB……取串中的一个字节 LODSW……取串中的一个字 本指令在使用前应将源串首地址的 有效地址EA送入SI。 例: LEA SI,DATA1 LODSB 设串首地址为DATA1 A1 A2 A3 A4 SI SI+1 AL LODSB指令操作过程

59 量(+l或+2);当用STD指令使DF=1时, 指针SI和DI自动减量(-1或-2)。地址 指针是±1还是±2,取决于串操作数
串处理指令 串处理指令处理存放在存储器中的字节串或字串,串处理的方向由方向标志位DF决定,串处理指令之前可加重复前缀,在执行串处理指令时,源串的指针SI和目的串的指针DI根据DF的指示自动增量(+l或+2)或自动减量(-l或-2)。 1.设置方向标志指令 ; CLD DF置0 STD DF置1 为了处理连续存储单元中的字符串 或数串,地址指针需要连续地增量或 减量,指针增量或减量决定了串处理 的方向。当用CLD指令使DF=0时,源 串的指针SI和目的串的指针DI自动增 量(+l或+2);当用STD指令使DF=1时, 指针SI和DI自动减量(-1或-2)。地址 指针是±1还是±2,取决于串操作数 是字节还是字。处理字节串时,地址 指针每次+1或-1;处理字串时,地址 指针每次+2或-2。 DF=0 DF=1 自动增量 自动减量

60 串操作所独有的寻址方式,即源串操作数地址由DS:[SI]表示(DS可以由其他段寄存器替代),目的串操作数地址由ES:[DI]表示(ES不能由其他段寄存器替代)。每次串操作除对字或字节操作数进行相应操作外,同时自动修改变址寄存器中SI/DI的内容,使它们指向下一个字或字节单元。修改SI/DI的规则是:如标志寄存器中DF=0,那么SI/DI加2(字串)或加1(字节串),否则减2(字串)或减1(字节串)。 取串指令 指令格式:LODS 源串符号地址 指令功能:(1)AX/AL←(DS:(S1)) (2)SI←(SI)土2或1 (3)对标志寄存器无影响 无操作数指令格式: LODSB……取串中的一个字节 LODSW……取串中的一个字 本指令在使用前应将源串首地址的 有效地址EA送入SI。 例: LEA SI,DATA1 LODSB 设串首地址为DATA1 A1 A2 A3 A4 SI SI+1 AL LODSB指令操作过程

61 指令功能:(1)ES:(DI)←(AX)/(AL) (2)DI←(DI)+1或2 (3)对标志寄存器无影响
存串指令 指令格式:STOS 目的串符号地址 STOSB STOSW 指令功能:(1)ES:(DI)←(AX)/(AL) (2)DI←(DI)+1或2 (3)对标志寄存器无影响 指令将AX或AL内容送人目的串中的一个字或字节单元中,同时按照DF修改DI。 串传送指令 指令格式:MOVS目的串,源串 或MOVSB MOVSW 指令功能:(1)ES:(DI)←(DS:(SI)) (2)SI← (SI)+1或2,DI← (DI)+1或2 MOVS指令将源串中的一个字或字节内容 送到目的串中,同时按照DF修改SI和D1。 DI DI+1 AL SI SI+1 DI DI+1

62 串比较指令 指令格式:CMPS 源串,目的串 或 CMPSB CMPSW 指令功能:(1)(DS:(SI))—(ES:(DI))
(2)SI← (SI)±1或2,DI← (DI)±1或2 (3)影响标志位0F,SF,ZF,AF,PF,CF CMPS指令比较源串和目的串中的一个字或字节。比较方法是:源串中的一个字或字节减去目的串中的一个字或字节,不保留相减结果,但在标志寄存器中反映了比较结果,同时按照DF修改SI和DI。 串搜索指令 指令格式:SCAS 目的串 或SCASB SCASW 指令功能:(l)(AX)/(AL)-(ES:(DI)) (2)DI←(DI) ±1或2 SCAS指令在目的串中查找AX或AI指定的内容(关键字)。

63 3.串重复前缀 REP ;次数不为0重复执行串指令,(CX)=重复次数 执行操作:①(CX)=0时,串指令执行完毕,否则执行②一④ ②(CX) ←(CX)- 1 ③执行串指令(MOVS或STOS) ④重复执行① REPE/REPZ ;次数不为0且结果相等/为零时重复执行串指令。 执行操作: ①(CX)=0或ZF=0时,结束执行串指令,否则继续②一④ ③执行串指令(CMPS或SCAS) REPNE/REPNZ ;次数不为0且结果不等/不为零时重复执行串指令。 执行操作:①(CX)=0或ZF=1,结束执行串指令,否则继续②一④ ②(CX) ←(CX)- l ③执行串指令(CMPS或5CAS)

64 例:将数据段从0020H开始的30H个字节传送给当前附加段以0100H为起始地址的存储区中。如果不用串操作指令,上述传送操作就需编制如下程序段:
MOV SI,0020H MOV DI,0lOOH MOV CX,0030H LOP:MOV AL,[SI] MOV ES:[DI],AL INC SI INC DI LOOP LOP MOV SI,0020H MOV DI,0100H MOV CX,0030H CLD REP MOVSB

65 JMP指令控制程序无条件地跳转到目的单元。 (1) JMP SHORT LABEL ;短转移
3.3.5 控制转移指令 控制转移指令通过改变CS:IP来控制程序的执行流向。这类指令包括无条件转移指令、条件转移指令、循环指令、子程序调用和返回指令以及中断和中断返回指令。 1.无条件转移指令 JMP指令控制程序无条件地跳转到目的单元。 (1) JMP SHORT LABEL ;短转移 执行操作:(IP) ←(IP)当前 + 8位位移量 短转移的目标地址(或称转向地址)相对 于当前IP值的位移量在-128~+127字节 之间,当前IP值是指JMP指令的下一条 指令的地址。 (2) JMP NEAR LABEL 近转移是JMP指令的缺省格式,可以 写为 “JMP LABEL”。它在当前代码段内转移 转向地址可以是直接寻址方式、寄存器寻址 方式、寄存器间接方式和存储器寻址方式。 ADD AX,BX 最大位移量 -128 二个字节 JMP SHORT 八位位移量 IP当前 MOV AH,09 最大位移量 +127 INT 21H

66 ① JMP 标号 ;直接转移 转移的目标地址在指令中可直接使用符号地址,由于位移量为16位,它的转移范围应是-32768~+32767,也就是说,近转移指令可以转移到段内的任一个位置。 ② JMP REG ;寄存器间接转移 转移的目标地址在寄存器中。 例如:指令“ JMP BX ”执行的结果,将BX的内容送给IP。 ③,IMP WORD PTR OPR ;存储器间接转移 例如:指令“ JMP WORD PTR (BX) ”执行的结果,将BX内容为偏移地址的内存中二个字节的目标地址送给IP。 (3) JMP DWORD PTR LABEL ;远转移 执行操作:(IP) ← LABEL 的段内偏移地址 (CS) ← LABEL 所在段的段地址 远转移实现的是段间的跳转,即从当前代码段跳转到另一个代码段中,这意味着指令执行后.不仅要改变IP的值,CS也会得到一个新的段地址。2.条件转移指令 条件转移指令是在满足了规定的条件后才控制程序转移的一类指令。所有条件转移指令都是短转移指令,转移的目标地址必须在当前IP地址的-128~+12713范围之内。

67

68 表中 (Ⅰ)根据条件码的值转移 (Ⅱ)无符号数的条件转移
(Ⅲ)带符号数的条件转移 (Ⅳ)根据CX的值的条件转移 根据两数比较的结果进行条件转移时,一定要清楚所比较数的类型。对无符号数的比较,要使用表中的第(Ⅱ)类条件转移指令;对带符号数的比较,要使用第(Ⅲ)类条件转移指令,这是因为它们的测试条件不一样。如果这两类指令使用不当,将会造成程序的转向错误。 假设程序进行两个带符号数的比较,并根据比较结果转移,其中(AL)=80H,(BL)=01,请指出下面两组指令的转向地址。 (1) CMP AL ,BL (2) CMP AL ,BL JL XY JB XY 答:(1)转向目标地址XY;(2)不能实现转移。 执行CMP指令时,(AL)一(BL)=80—01=7F,条件码设置为:SF=0,OF=1, CF=0。 执行JL指令时,测试转移条件:SFOF=0  1=1,说明满足(AL)<(BL)的转移条件,因此,(IP) ← XY的偏移地址,程序即转移到XY单元执行新的指令。 JB指令的转移条件为CF=l,而CMP的执行结果使CF=0,所以不能引起转移。

69 3.循环指令 LOOP 标号 ;次数不为0循环 执行操作:①(CX) ←(CX)- 1 ②若(CX) ≠0,则循环至标号处,否则循环结束 LOOPZ/LOOPE 标号 ;次数不为0且结果为零/相等时循环 执行操作:①(CX) ← (CX)- 1 ②若ZF=1且(CX) ≠ 0,则循环至标号处,否则循环结束 LOOPNZ/LOOPNE 标号 ;次数不为0且结果不为零/不等时循环 ②若ZF=0且(CX) ≠ 0,则循环至标号处,否则循环结束 这一组指令在循环结构的程序中用来控制一段程序(称为循环体)的重复执行。 循环指令都是短转移格式的指令、也就是说,位移量是用8位带符号数来表示的,转向地址在相对于当前IP值的-128~+127字节范围之内。 循环指令均不影响条件码。

70 因此,CALL指令和RET指令也有近调用、 近返回及远调用、远返回两类格式。 CALL指令的执行过程是第一步是
4.子程序调用与返回指令 子程序(过程)是一种非常重要的 计算机编程结构,它存储在存储器中, 可供一个或多个调用程序(主程序)反复 调用。主程序调用子程序时使用CALL指 令,由子程序返回主程序时使用RET指 令。由于调用程序和子程序可以在同一 个代码段中,也可以在不同的代码段中。 因此,CALL指令和RET指令也有近调用、 近返回及远调用、远返回两类格式。 CALL指令的执行过程是第一步是 把子程序返回调用程序的地址保存在堆 栈中;段内调用是IP的当前值;段间调 用,是CS和IP的当前值。 第二步操作是转子程序,即把子程序的 入口地址交给IP(段内调用)或CS:IP (段间调用)。 主程序 子程序 CALL R1 IP当前 返回地址 RET

71 (1) CALL NEAR PTR SUBPROUT ;近调用(NEAT类型)
执行操作:①(SP) ←(SP)-2,((SP))←(IP)当前 ;返回地址入栈 ②(IP) ←(1P)当前+16位位移量(在指令的第2、3个字节中) 段内间接调用 :CALL DESTIN ②(IP) ← (EA ) ;(EA)为指令寻址方式所确定的有效地址 (2)CALL FAR PTR SUBPROUT ;远调用(FAR类型) 段间直接调用 :CALL FAR PTR SUBPROUT ; 执行操作:①(SP) ←(SP) - 2,((SP)) ←(CS)当前 (SP) ←(SP)- 2,((SP)) ←(IP)当前 ;返回地址入栈 ②(IP) ← 偏移地址(在指令的第2、3个字节中) (CS) ← 段地址(在指令的第4、5个字节中) 段间间接调用: CALL DWORD PTR DESTIN ①(SP) ←(SP) - 2,((SP)) ←(CS)当前 ②(IP) ←(EA) ;(EA)为指令寻址方式所确定的有效地址 (CS) ←(EA+2)

72 (3) RET 返回指令 RET指令执行的操作是把保存在堆栈中的返回地址出栈。以完成从子程序返回到调用程序的功能。 段内返回(近返回) RET 执行操作:(IP) ←((SP)),(SP) ←(SP) + 2 段间返回(远返回) RET 执行操作:(IP) ←((SP)),(SP) ←(SP)+ 2 (CS) ←((SP)),(SP) ←(SP)+ 2 带立即数返回 RET N 执行操作:①返回地址出栈(操作同段内或段间返回) ②修改堆栈指针:(SP) ←(SP)+ N 子程序的最后一条指令必须是RET指令,以返回到主程序。如果是段内返回,只需把保存在堆栈中的偏移地址出栈存入IP即可,如果是段间返回,则要把偏移地址和段地址都从堆栈中取出送到IP和CS寄存器中。 带立即数返回指令,除完成偏移地址出栈或偏移地址和段地址出栈的操作外,还要再使SP的内容加上一个立即数N,使堆栈指针SP移动到新的位置。 CALL指令和RET指令都不影响条件码。

73 例:根据下面调用程序和子程序的程序清单,画出RET指令执行前和执行后 的堆栈情况。假设初始的SS:SP=A000:1000。
0000 B8 001E MOV AX , 30 0003 BB MOV BX , 40 PUSH AX PUSH BX 0008 E CALL ADDM 000B MOV AH , 2 ADDM PROC NEAR PUSH BP 0072 8BE MOV BP , SP 0074 8B MOV AX ,[BP+4] ADD AX ,[BP+6] 007A CD POP BP 007E C RET RET 4 执行前 RET 4 执行后 ADDM ENDP 0FF8 BP BP SP 0FFA 00 00 0B 0B 0FFC 40 40 00 00 0FFE 30 30 00 00 SP 0000 栈底 栈底

74 5.中断及中断返回指令 中断指令: INT n ; n为中断类型号 执行操作: ①入栈保存FLAGS: (SP) ←(SP)- 2,((SP)) ←(FLAGS) ②入栈保存返回地址:(SP) ←(SP)- 2,((SP)) ← (CS) (SP) ←(SP)- 2,((SP)) ←(IP) ③转中断处理程序:(IP) ←(n×4) (CS) ←(n×4 + 2) 中断返回指令: IRET 执行操作:①返回地址出栈:(IP) ←((SP)),(SP) ← (SP)十2 (CS) ←((SP)),(SP) ← (SP)十2 ②FLAGS出栈:(FLAGS) ←((SP)),(SP) ←(SP)十2 溢出则中断:INTO (中断类型为4) ;若OF=1(有溢出) 则执行操作:①入栈保存FLAGS:(SP) ←(SP)一2,((SP))←(FLAGS) ②人栈保存返回地址:(SP) ←(SP)一2,((SP))←(CS) (SP) ←(SP)一2,((SP)) ←(1P) ③转中断处理程序:(IP) ←(4×4)=(10H) , (CS) ←(4×4十2)=(12H)

75 中断返回指令IRET的操作和INT指令相反,即从 堆栈中取出返回地址和标志位,然后返回到被 中断的程序。
中断指令用于调用中断例行程序(又称中断服务程序),这是一种远调用。完成各种功能的中断例行程序都有一个编号,称为中断类型号。各种中断例行程序的入口地址按中断类型号的顺序存储在一个表中,这个表称为中断向量表。每个中断例行程序的入口地址占用4个字节,因此,它在中断向量表中的地址可用中断类型号乘4来求得。执行中断指令时,首先要入栈保存调用程序执行的现场,即当时的标志寄存器的值和断点的地址;然后,根据中断类型号(n×4)到中断向量表中取得中断例行程序的入口地址;分别送给IP和CS,以实现调用中断例行程序的功能。 中断返回指令IRET的操作和INT指令相反,即从 堆栈中取出返回地址和标志位,然后返回到被 中断的程序。 INTO指令隐含的中断类型号为4,因此保存 断点地址和标志位后,从中断向量表的10H和12H 两个字中取出中断例行程序的入口地址,从而转 去运行中断例行程序。 INT指令(包括INTO)执行后,把IF和TF置0, 但不影响其他标志位。 0000 IP0 CS0 0004 IP1 CS1 0008 IP2 CS2 4n IPn CSn 1020 IP CS

76 五、处理器控制指令 8086/8088指令系统中有3种控制指令。 1.标志位操作指令 这种指令是无操作数指令,指令中未直接给出操作数的地址,但隐含指出操作数在标志寄存器中某些标志位上。能直接操作的标志位有CF、IF、DF。 (1)清除进位标志指令 (2)进位标志置位指令 CLC;置CF= STC;置CF=1 (3)进位标志取反指令 (4)清除方向标志指令 CMC;CF取反 CLD;置DF=0 (5)方向标志置位指令 (6)清除中断标志指令 STD;置DF= CLI:置IF=0 (7)中断标志置位指令) STI:置IF=1 2.与外部事件同步的指令 (1)HLT;停机指令 (2)WAlT;等待指令,CPU用WAIT指令等待外部事件就绪,以达到同步目的。 (3)ESC是外部协处理器指令的前缀。 (4)LOCK是总线封锁前缀指令。 3.空操作指令 指令格式:NOP 执行空操作,只占CPU3个时钟周期,不影响寄存器、存储器、标志位。


Download ppt "微型计算机技术 教 学 指 导(三) 太原广播电视大学 郭建勇."

Similar presentations


Ads by Google