760 likes | 873 Views
微型计算机技术. 教 学 指 导 (三). 黑龙江广播电视大学 宋伟. 第 3 章 8086 指令系统及寻址方式 学习要求:了解编辑程序、汇编程序、连接程序的功能及其输入和输出文件的类型;了解汇编语言源程序框架,熟悉程序段定义和过程定义伪操作;熟悉数据类型和数据定义伪操作;熟练掌握并运用 8086 指令集及各类寻址方式。 3.1 汇编语言程序格式 机器指令:能控制计算机完成一个操作的二进制代码称为机器指令。 机器语言:机器指令集以及使用它们编写程序的规则称为机器语言。
E N D
微型计算机技术 教 学 指 导(三) 黑龙江广播电视大学 宋伟
第3章 8086指令系统及寻址方式 • 学习要求:了解编辑程序、汇编程序、连接程序的功能及其输入和输出文件的类型;了解汇编语言源程序框架,熟悉程序段定义和过程定义伪操作;熟悉数据类型和数据定义伪操作;熟练掌握并运用8086指令集及各类寻址方式。 • 3.1 汇编语言程序格式 • 机器指令:能控制计算机完成一个操作的二进制代码称为机器指令。 • 机器语言:机器指令集以及使用它们编写程序的规则称为机器语言。 • 汇编指令:用助记符代替机器指令,即将机器语言指令符号化。 • 汇编语言:汇编指令集以及使用它们编写程序的规则称为汇编语言。 • 汇编语言程序:用汇编语言编写的程序。 • 汇编语言程序必须由汇编程序转换(汇编)成机器代码(目标代码)。 • 汇编指令:助记符(操作命令)和操作数部分构成。 • 汇编语言程序 • 汇编伪指令:伪指令指示汇编程序如何进行汇编。 • 数据传送(MOVE)指令: • MOV DEST , SRC • 助记符 目的操作数 源操作数
MOV指令功能:传送(move)源操作数到目的操作数域。例如: 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)传送大于寄存器位数的数值将引起错误。
加法指令: ADD DEST ,SRC • 指令功能: (DEST)+(SRC)→DEST • 指令执行后,DEST的内容是两个操作数的和,ADD指令影响标志寄存器。 • 对操作数的要求是源操作数可以是立即数、寄存器数、存储器数;目的操作数只能是寄存器数、存储器数;但不能同时为存储器数。 • 例: MOV AL ,25H ; 25H →AL • MOV BL ,36H ; 36H →BL • ADD AL ,BL ;(AL)+(BL) →AL • 3.1.1 一个简单程序实例 • 汇编语言程序行由四个域组成: • [标号:] 助记符 [操作数] [;注释] • (1)标号域:标号名或变量名不能超过31个字符,与紧随其后的代码行地址发生对应关系。 • (2)助记符 :指令和伪指令。 • (3)操作数:双操作数(目的操作数与源操作数)或单操作数。 • (4)注释以“;”始,常用来说明一条指令或一段程序的功能。
STSEG SEGMENT • DB 64 DUP(?) MOV AH ,4CH ;返回DOS • STSEG ENDS INT 21H • 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
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 标号 ;第一条指令的标号
3.1.2 汇编、连接和运行一个程序’ • 建立一个可执行的汇编语言程序需要以下三个步骤: • (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.连接和运行程序
3.1.3 数据类型和数据定义 • 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数据分配存储单元。
DUP伪操作可以按照给定的次数来复制某个(某些)操作数,它可以避免多次键入同样一个数据。例如,把6个FFH存入相继字节中,可以用下面两种方法,显然用DUP的方法更简便些。DUP伪操作可以按照给定的次数来复制某个(某些)操作数,它可以避免多次键入同样一个数据。例如,把6个FFH存入相继字节中,可以用下面两种方法,显然用DUP的方法更简便些。 • DATA1 DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH • DATA1 DB 6 DUP(0FFH) • DUP操作一般用来保留数据区,例如设置堆栈区等。 • DATA2 DB 32 DUP (?);保留32个字节单元为堆栈区。 • EQU是一个赋值伪操作,它给一个数据标号赋予一个常数值,但这个常数不占用存储单元。例如: • COUNT EQU 25 ; 定义COUNT等于25 • “=”伪操作也是一个赋值伪操作,与EQU类似的赋值伪操作。区别是,EQU伪操作中的标号名是不允许重复定义的,而“=”伪操作则允许重复定义。 • TMP = 5 • TMP =TMP + 1 ;是允许使用的。 • 而 COUNT EQU 5 • COUNT EQU COUNT + 1 ;则是错误语句。 • 因为EQU伪操作中的标号名是不允许重复定义的,
3.2 寻址方式与机器语言转换 • 寻址方式是指令中表示操作数位置(地址)的方式。 • 3.2.1 寻址方式 • 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 ,46 ;(CX) ← 46 • ADD CL ,20H ; (CL)← 20H • 给段寄存器传送数据,应先将数据传送给任一个通用寄存器,然后再由寄存器传送给段寄存器,例如: • MOV AX , 1250H • MOV DS , AX
(3)直接寻址方式:直接寻址方式中,操作数存放在存储单元中,而这个存储单元的地址就在指令的操作码之后。例如:(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)
(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
(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位的物理地址
寄存器间接寻址中寄存器的作用相当于一个地址指针,用于寻址连续地址的区域非常方便。寄存器间接寻址中寄存器的作用相当于一个地址指针,用于寻址连续地址的区域非常方便。 DS DS EA=0020H EA=0021H 寄存器 寄存器 0020H A1 0021H A1 A2 A2 A3 A37 A4 A4 A5 A5 A6 A6 寄存器加1后
(5)寄存器相对寻址(变址寻址与基址寻址)(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的构成
(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
(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
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值的位移量。
(2)段内间接寻址方式。这种寻址方式在指令中用数据寻址分式(除立即寻址方式外)间接地指出转向地址,如:(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]
3.2.2 机器语言指令的转换 • 1.机器语言组成 • 8086机器语言指令是一种可变长度的指令,可以由1~7个字节组成,取决于指令的操作码、寻址方式以及操作数长度等因素。 • 段前缀 操作码 寻址方式 数据/偏移量 数据/扁移量 数据 数据 • 2.段前缀字节 • 段前缀又称作段跨越前缀,当指令中没有段前缀(如ES:)时,机器指令中无此字节。 • 00 ES • 01 CS • 10 SS • 11 DS SEGPIX OPCODE MODE DATA/DISP DATA/DISP DATA DATA 3 2 3 001 SEG 110
3.操作码字节 • 操作码决定微处理器执行的操作,如传送、加法、减法等,通常用机器指令的第一个字节表示。多数机器指令的操作码占用一个字节,有时一个字节不够,在下一个字节再占用3位。 • 6 1 1 6 1 1 • W = 0 字节操作 sw = 00 字节操作 1 字操作 01 字操作 • d = 0 reg 为源操作数 11 立即数由8位 • 1 reg 为目的操作数 扩展为16位 一般指令 OPC d w 立即寻址指令 OPC s w
MOD REG R/M • 4.寻址方式字节 • 多数机器指令的第二个字节表示寻址方式及有无位移量。 • 2 3 3 • MOD=00 存储器寻址,无偏移量 • 01 寄存器寻址,8位偏移量 • 10 存储器寻址,16位偏移量 • 11 寄存器寻址 • Reg域表示寄存器寻址方式,与w位组合确定寄存器。 REG W=1 W=0 REG W=1 W=0 000 AX AL 100 SP AH 001 CX CL 101 BP CH 010 DX DL 110 SI DH 011 BX BL 111 DI BH Reg域与w位组合表示寄存器
mod域与r/m域组合,表示指令的另一个寻址方式,如果mod=ll,则是寄存器寻址方式。寄存器由r/m域确定;如果mod=00,01或10,则指定存储器寻址方式。r/m域选择其中一种存储器寻址方式。 mod域与r/m域组合,表示指令的另一个寻址方式,如果mod=ll,则是寄存器寻址方式。寄存器由r/m域确定;如果mod=00,01或10,则指定存储器寻址方式。r/m域选择其中一种存储器寻址方式。 • mod与r/m组合代码所对应的寻址方式
100010DW MOD REG R/M DISP(底位) DISP(高位) • 以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 101000DW OFFSET(低位) OFFSET(高位) 100011D0 MOD REG R/M DISP(低位) DISP(高位) 1011WRRR DATA (低位) DATA(高位) 1100011W MOD 000 R/M DISP低位 DISP高位 DATAD低位 DATA高位
100010 11 11 101 100 • 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 ;机器指令 C78700126824H 长度 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 100010 10 00 010 111 100010 00 01 001 110 00000000 1100011 1 10 011 111 00000000 00010010 01101000 00100100 100011 10 11 011 000
3.3 8086指令系统 • 3.3.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 标志出栈
1.通用数据传送指令 • MOV dst,src ; 传送指令 • 执行操作:(dst) ← (src) • MOV指令在前面已有介绍,它的功能是将源操作数(字节或字)传送到目的地址。 • PUSH src ; 进栈指令 POP dst ; 出栈指令 • 执行操作: (SP) ←(SP)- 2 执行操作: (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 栈底
PUSH指令执行时,SP的内容先减2,然后将数据压入SP所指示的字单元,高8位存入高地址字节,低8位存人低地址字节。POP指令执行时,将SP所指示的栈顶地址的内容取出放人目的地址,然后SP增2,指向新的栈顶地址。 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
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
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));传送字节或传送字
输出指令: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
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
AH AL FLAGS • 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
3.3.2 算术运算类指令 • 算术运算类指令包括加、减、乘、除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]
例:MOV BX,9B8CH ;(BX)=9B8CH ADD BX,6476H ;(BX)=(BX)+6476H • (BX) 1 0 0 1 1 0 1 1 1 0 0 0 1 0 1 0 结果为零,则ZF=1 +6478H 0 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 结果无溢出,则OP=0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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)= 0000000000000000=0000H
进位 进位 进位 最高字节 高一位字节 最低字节 ADC指令主要用于大于16位数的相加运算。即多字节的加法。 • 例:一个32位无符号数存放在DX(高16位)、AX(低16位)中,若要加上常数76F1A23H,则用以下指令来实现: • ADD AX,1A23H • ADC DX,76FH • 其中第一条指令把16位常数加在AX中,若产生进位,则记录在CF中。由ADC指令在完成高16位相加的同时,将低16位的进位也加上。 + + + 和 和 和
例: 编写执行双精度数(DX,CX)和(BX,AX)相加的指令序列,DX是目的操作 • 数的高位字,BX是源操作数的高位字。指令执行前: • ( DX,CX)=A248 2ACOH,(BX,AX)=088A E25BH。 • 指令序列:ADD CX ,AX ;低位字相加 • ADC DX ,BX ;高位字相加,要加进位 • 执行ADD指令 2AC0 0010 1010 1100 0000 • + E2B5 + 1110 0010 0101 1011 • 1 ← 0D1B 1 ← 0000 1101 0001 1011 • 标志设置: SF=0 ZF=0 CF=1 OF=0 • 执行ADC指令 A248 1010 0010 0100 1000 • 088A 0000 1000 1000 1011 • + 1 + 1 ← CF • AAD3 1010 1010 1101 0011 • 标志设置: SF=1 ZF=0 CF=0 0F=0
(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指令可以进行字节或字运算。其源和目的操作数可以在通用寄存器或存储单元中,但两者不能同时在存储器。立即数可以作源操作数,但是不能作目的操作数。
(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) • 即把操作数变成与其符号相反的数:正数→求补→负数→求补→正数
例:分析下列程序的执行情况: • DATA—A DD 62562FAH • DATA—B DD 412963BH • 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 - 0412H - 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。
3.乘法指令 • 乘法指令分为无符号数乘法指令和带符号数乘法指令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 SRC X AH AL DX AX 字节乘法 字乘法
例:两个字节相乘:一个乘数必须放入AL寄存器,另一个乘数可以使用寄存例:两个字节相乘:一个乘数必须放入AL寄存器,另一个乘数可以使用寄存 器寻址方式或存储器寻址方式得到,执行乘法指令后。乘积在AX寄存器中。 • DATA1 DB 25H • DATA2 DB 65H • RESULT DW ? • MOV AL , DATA1 ;AL ← 25H • MOV BL , DATA2 ;BL ← 65H • MUL BL ;乘法 • MOV RESULT ,AX • 或: • MOV AL ,DATA1 • MUL DATA2 • MOV RESTUL ,AX • 本例:25H×65H=0E99H,高16位不为0,所以CF=1,OF=1
4.除法指令 • (1)无符号数除法指令 (2)有符号数除法指令 • 指令格式:DIV SRC 指令格式:IDIV SRC • 其中(SRC)是除法运算的除数,它可以是8位或16位(字节或字),但只能在通用寄存器或存储单元中。除法的被除数、商、余数都是隐含使用了相关寄存器。 • 对标志无有效影响。 商 AL 商 AX SRC AH AL SRC DX AX 被除数 除数 被除数 AH DX 余数 余数 字节除法 字除法
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 =01000101B 是正数 CBW ;执行后,(AH)=00,(AL)=45H,或(AX)=0045H 仍是正数; (AX)=0BA45H =1011101001000101B 是负数 CWD ;执行后、(DX)=0FFFFH,(AX)=0BA45H 仍是负数
例:编写程序。分别实现下列数据的无符号除法和带符号除法。例:编写程序。分别实现下列数据的无符号除法和带符号除法。 • DATA1 DW 9400H • DATA2 DW 0060H • QUIT DW ? • REMAIN DW ? • (1) MOV AX ,DATA1 ;(AX)← 9400H • MOV DX ,0 ;(DX,AX)=0000 9400H • DIV DATA2 • MOV QUIT ,AX ;QUIT ← 16位商 • MOV REMAIN ,DX ;REMAIN ←余数 • (2) MOV AX ,DATA1 ;(AX)← 9400H • CWD ;(DX,AX)=OFFFF 9400H • IDIV DATA2 • MOV QUIT ,AX ;QUIT ← 16位商 • MOV REMAIN ,DX ;REMAIN ←余数
6.十进制调整指令 • (1)BCD码 • BCD码是用4位二进制编码表示一位十进制数字的编码的方法。 • 组合型:1个字节表示2个BCD码,即两位十进制数 • 非组合型:l个字节的低4位表示一个BCD码,高4位为0 • 0000 0101 0000 1001 0101 1001 • 5 9 5 9
调整BCD数的运算结果 • 用BCD码表示的十进制数,计算机直接按二进制的运算规律来进行算术运算,其结果是不正确的,必须经过调整。例如:十进制数17和28相加,其压缩的BCD码分别为00010111B(17H)和00101000B(28H),实现这两个数相加的指令如下: • MOV AL ,17H 0001 0111 17H • ADD AL ,28H + 0010 1000 + 28H • 0011 1111 3FH • 执行ADD指令后,得到的结果是00111111B(3FH),这既不是和的二进制数,也不是和的BCD格式。这两个数的和应当是17十28=45(01000101),为了得到正确的结果必须加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
BCD码运算的方法是:先用二进制数的加、减、乘和除指令对BCD码进行运算,紧接着用BCD码校正指令对运算结果进行校正。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的用法是紧跟在加法指令后面。
例:压缩型BCD数加法 4678 + 2556 结果放在DX中 • MOV AL, 78H • ADD AL, 56H ;低字节BCD码相加 • DAA ;低字节和数校正 • MOV DL , AL • MOV AL , 46H • ADC AL , 25H ;高字节BCD码相加 • DAA ;高字节和数校正 • MOV DH , AL • 例:非压缩型BCD数加法 0508 + 0906(58+96)结果放在DX中 • MOV AL, 08H • ADD AL, 06H ;低字节BCD码相加 • AAA ;低字节和数校正 • MOV DL , AL • MOV AL , 05H • ADC AL , 09H ;高字节BCD码相加 • AAA ;高字节和数校正 • MOV DH , AL
组合型减法校正指令 • 指令格式: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的用法也是紧跟在减法指令后面。