1、1,微型计算机原理 与接口技术,第三章,第3章 8086指令系统,2,教学目的 了解指令的一般概念、基本格式 掌握操作数的寻址方式 掌握指令系统中的基本指令,3.1 概述 3.1.1 机器语言与汇编语言,机器语言由二进制代码组成。 机器语言中的每一条称为指令,计算机能够识别的所有指令的集合称为指令系统。 指令是计算机能够执行的最小功能单位。 机器语言程序就是由一条条的指令按一定顺序组织起来的指令序列。 计算机的CPU不同,指令系统也不同。,3,一条指令一般由操作码和操作数两部分组成。操作码详细地说明指令要执行的操作,操作数是指令执行时需要的数据。 汇编语言是一种符号语言。用汇编语言编制的程序称
2、为汇编语言源程序,计算机不能直接识别执行,必须翻译成机器语言程序。翻译的过程称为汇编,完成汇编工作的程序称为汇编程序。汇编程序属于系统程序,是汇编语言的命令处理程序。 计算机的CPU不同,汇编语言也不同。本章以8086 CPU为主,介绍常用的汇编语言指令格式、寻址方式和用法。,4,3.1.2 指令的基本构成,指令的一般格式 一条指令包含操作码和操作数两部分。,5,源操作数,操作码,目的操作数,12字节,16字节,24字节,操作数可以有一个也可以有两个,还可以没有。只有一个操作数的指令常称为单操作数指令,有两个操作数的指令常称为双操作数指令。形式上无操作数的指令,通常操作数是隐含的。操作数有源操
3、作数和目的操作数之分。 操作数的长度与指令的寻址方式有关 。,2. 操作数类型 8086CPU指令的操作数有三种类型:立即数、寄存器和存储器操作数。 立即数操作数又称为常数,可以是数值型常数也可以是字符型常数。数值型常数可以是字节或字,可以是无符号数或有符号数。立即数在指令中只能作为源操作数,不能作为目的操作数。,6,寄存器操作数 8086CPU含有的8个16位的通用数据寄存器和4个段寄存器作为16位寄存器操作数,还有8个8位寄存器操作数。控制寄存器IP、Flags只在特定指令中作为操作数。 寄存器操作数在指令中可以作为源操作数也可以作为目的操作数,段寄存器CS除外,它只能作为源操作数 。 个
4、别指令将FLAGS作为操作数。,7,通用寄存器中AX、BX、CX、DX、SI、DI、BP、SP存放字操作数; AH、AL、BH、BL、CH、CL、DH、DL存放字节操作数;,存储器操作数 用内存单元中的数据作为操作数,通常用内存单元地址表明。存储器操作数既可以作为源操作数也可以作为目的操作数,但多数指令要求源和目的操作数不能同时为存储器操作数。 指令中的操作数如果是存储器操作数,通常指令指明存储单元的地址或用某种方式指明存储单元的地址,指令执行时需要根据这个地址从内存单元中取出操作数,操作数可以是1个字节或2个字节(字)甚至4个字节(双字)。,8,数据在内存中以“高高低低”的原则存放,高字节存
5、于高地址内存中,低字节存于低地址内存中。存储器操作数如果是多字节,指令中指明的存储单元地址通常是它的低地址或称为首地址。 如寄存器AX的内容为6E53H,将它存入20000H中:,9,低,高,地址,AH AL,3. 指令的书写格式 指令的书写格式为: 标号: 操作码助记符 目的操作数,源操作数 ;注释 例如: GOON: MOV AX, BX ;数据传送,10,标号是字母数字组合的符号,代表指令,是指令的地址用符号表示的地址。标号后跟冒号“:”作为间隔符。标号一般由字母开头的字母数字组成,长度不超过31个字符。不允许使用汇编语言中的保留字作标号。 操作码助记符与操作数助记符之间至少应有一个空格
6、作为间隔符。如果指令有两个操作数,操作数之间以逗号“,”作为间隔符。 操作数助记符与注释之间用分号“;”作为间隔符。可以跟在指令的后面也可以单独一行,若注释超过一行,则新行以分号“;”开头。 指令中的标点符号应为ACSII字符。,3.2 8086CPU寻址方式,寻址方式,即获得地址的方法,主要指获得段内偏移地址的方法,段基址常采用默认方式获得。8086CPU指令系统的寻址方式有两类: (1)获得指令中操作数地址的方法 立即数操作数作为指令的一部分出现在指令中,随着CPU取指令的动作进入CPU内,不需要再寻址; 寄存器操作数本就在CPU内部,寄存器的符号就是地址; 存储器操作数在内存中,指令只能
7、给出内存单元的偏移地址,而且这个地址常常并不是指令需要的操作数有效地址,要通过某种计算方法才能得到操作数的最终地址。这个过程称为操作数寻址。汇编语言的寻址方式主要指的是存储器操作数的寻址方式 。,11,所以,含有这三种操作数的指令执行速度顺序为:寄存器操作数、立即数、存储器操作数。 *注意:存储器操作数通常存储在数据段、附加数据段或堆栈段,相应的段基址由段寄存器DS、ES或SS提供。,(2)获得要执行的下一条指令的地址的方法 在正常情况下,每当BIU取完一条指令,程序计数器IP自动指向下一条,程序就按照指令的先后顺序执行。但当程序执行转移指令或子程序调用指令时,程序的执行顺序必须按照指令的要求
8、改变,这时需要寻找下一条指令的地址。这类寻址发生在程序代码段内,由CS段寄存器提供段基址。这一类寻址方式只涉及转移指令和子程序调用指令,在介绍相关指令时再详细讲解。,13,1. 立即寻址,源操作数是立即数,可以是8位或16位的二进制数,也可以是字符常数。 MOV AX, 2000H ;2000H是立即数操作数 MOV AH, A ;A是字符常数,等于41H ADD AL, 6 ;6是立即数操作数 立即数作为操作数,这个操作数的寻址方式称为立即寻址,其实它不用寻址。立即数操作数只能作源操作数,不能作为目的操作数。,14,2. 直接寻址,操作数在内存中,指令中直接给出操作数所在的内存单元的偏移地址
9、。可以是数值形式的地址,也可以是符号表示的地址-符号地址。例如: MOV BL, 2000H ;偏移地址为2000H的内存单元的内容传送给BL寄存器。方括号表示地址 。 BL为8位的寄存器,决定了这条指令为8位的数据传送指令 。,15,MOV BX, 3200H ;将偏移地址为3200H为首地址的连续两个内存单元的内容传送给BX寄存器。 BX为16位的寄存器,决定了这条指令为16位的数据传送指令 汇编指令中存储器操作数的地址都是逻辑地址,例如上面指令中的 2000H和3200H,都是段内偏移地址,它们的段基址由DS指明。 在通常情况下,存储器操作数的默认在数据段,段基址在DS。在特殊说 明的情
10、况下,存储器操作数的段基址也可以替换为CS、ES或SS。,16,17,表3-1 8088/8086CPU系统中逻辑地址的来源,MOV BL, 2000H ;将DS:2000H之内容送入BL MOV BX, 3200H ;将DS:3200H之内容送入BX 设DS=A000H,则:A000H*10H+3200H=A3200H 如下图:,18,功能: 将A3200H之内容送入AL 将A3201H之内容送入AH,如果操作数的段基址不是DS段,指令中要特别说明。例如在ES段,指令应书写为: MOV BX, ES:3200H 这种用法称为段超越,其中冒号“:”为段超越符。 此操作数的物理地址为: ES X
11、 10H+3200H。,19,3. 寄存器寻址(Register Addressing),操作数在CPU内部的寄存器中,例如: MOV BL,2000H ;目的操作数BL为寄存器寻址。 ADD AX,BX ;源和目的操作数的都是寄存器寻址。 再如: MOV AL,BL MOV AX,DX MOV DS,AX MOV SI,BP,20,4. 寄存器间接寻址,操作数在内存中,内存单元的偏移地址存放在寄存器中。 MOV AX, SI 源 操作数SI的寻址方式为寄存器间接寻址 SI的内容为内存单元的偏移地址,DS为段基址, 以DS X 10H+SI为首地址,取出连续两个内存单元的数据传送给AX。 如果
12、DS=2000,SI=02H, 指令的执行结果为AX=C396H,21,再如: MOV DX, DI ;将DS:DI指明的连续两个内存单元的数据传送到DX。 MOV BX, AX ;AX的内容传送到DS:BX指明的连续两个内存单元中。 MOV CX, BP ;将SS:BP指明的连续两个内存单元的数据传送到CX。,22,8086CPU中能够作为寄存器间接寻址方式使用的寄存器只有4个:BX、BP、SI、DI。这4个寄存器在作为间接寻址使用时,要用 申明,这时常称为它们为地址指针或间址寄存器。 BP在作为间址寄存器时,段基址默认为SS;其它3个的默认段基址为DS。都可以段超越。 例如: MOV DX
13、, ES:DI 上述指令的功能为:从物理地址为ES X 10H+DI的内存单元取出两个字节的数据传送给DX。,23,5. 寄存器相对寻址,操作数在内存中,内存单元的偏移地址一部分由间接寻址寄存器提供,一部分是指令给定的8位或16位地址位移量,二者相加形成操作数的有效地址。例如: MOV AX, BX+DATA ;将以BX+DATA为首地址的连续两个内存单元的数据传送给AX MOV AL, SI+20H MOV CX, DI+DATA MOV DX, BP+DATA,24,例:MOV AX,DATABX 假设:(DS)=6000H, (BX)=1000H, DATA=08H 则内存单元的物理地址
14、为:6000X10H+1000H+08H=61008H 指令的执行情况如下:,25,61008H,码段,数据段,(AX)=5566H,上述指令的书写格式很灵活,也可以如下书写: MOV AX, BX+DATA MOV AL, 20H SI MOV CX, DATA DI MOV DX, DATA+ BP 这种寻址方式可用于存取数据表中的数据,用间址寄存器存放数据表首地址,地址位移量指明要存取表中的哪一个数据,可以方便地存取数据表中的任何数据。,26,例:某数据表的首地址(偏移地址)为TABLE,要取出该表中第10个字节,并存放到AL中,可用如下指令段实现: MOV SI, 9 MOV AL,
15、TABLE+SI 相对寻址指令的书写格式允许有以下几种: MOV AL, TABLESI MOV AL, SIDATA MOV AL, DATA+SI MOV AL, SI+DATA MOV AL, DATA+SI MOV AL, SI+DATA,27,TABLE,位移量,0,1,2,3,4,5,6,7,8,9,6. 基址-变址寻址,操作数在内存中,基址寄存器和变址寄存器相加作为操作数的偏移地址。 MOV AX, BXSI ;将BX+SI为首地址的连续两个内存单元的数据送给AX。 MOV CX, BPDI ;将BP+DI为首地址的连续两个内存单元的数据送给CX。,28,8086CPU中寄存器B
16、X和BP为基址寄存器,SI和DI为变址寄存器。这种寻址方式中,一个基址寄存器加一个变址寄存器构成操作数,操作数的形式只有4种: BXSI BXDI BPSI BPDI,29,这种寻址方式里段基址是DS还是SS呢?,8086汇编规定以基地址为主,如果基址寄存器为BP,则操作数的段基址默认由SS提供;若BX为基址寄存器,则段基址默认由DS提供。 MOV AX, BXDI ;源操作数的物理地址为:DS X 10H+BX+DI MOV BPSI, DX ;目的操作数的物理地址为:SS X 10H+BP+SI 基址变址寻址方式适用于处理一维数组,可将首地址存放在基址寄存器中,通过修改变址寄存器的内容来访
17、问数组中的各个元素,它比寄存器相对寻址更加灵活。,30,7、基址-变址寻址相对寻址,操作数在内存中,操作数的地址由基址寄存器加上变址寄存器再加上地址位移量构成。 MOV AX, DATABXSI MOV AX, BPDI DATA 假设:(DS)=8000H, (BX)=2000H, (SI)=1000H, DATA=0200H 则操作数DATABXSI的物理地址为: 8000H X 10H+2000H+1000H+0200H=83200H 这种寻址方式主要用于二维数组操作。地址位移量作为数组首地址,两个寄存器分别作为行和列的地址指针,可以很方便实现数据阵列检索,31,基址-变址相对寻址指令的
18、书写格式允许有以下几种: MOV AX, DATASIBX MOV AX, BX+DATASI MOV AX, BX+DATA +SI MOV AX, BXDATASI MOV AX, BX+SIDATA 下列指令是非法的: MOV AX, DI+SI+DATA MOV AX, BX+BP+DATA,32,8、隐含寻址 操作码本身隐含地指明了操作数或部分操作数的地址。 如:MUL BL; AL X BL AX,33,CPU的寻址方式总结:,获得操作数所在地址的寻址方式: 立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 寄存器相对寻址 基址-变址寻址 基址-变址相对寻址 隐含寻址,34,MOV
19、AX, 3102H MOV AL, 4000H MOV AL,BL MOV AX,ES:SI MOV AX,SI MOV AX,DATABX MOV AX, BXSI MOV AX, DATADIBX MUL BL;,3.3 8086/8088 CPU指令系统,指令系统分为六个功能组: 1、数据传送指令 2、算术运算指令 3、逻辑运算指令 4、串操作指令 5、控制传送指令 6、处理器控制指令,35,指令中常用的一些符号约定: OPRD 各种类型的操作数 src 源操作数 dst 目的操作数 acc 累加器AX或AL port 输入输出端口 count 计数器 mem 存储器 存储单元内容 :
20、段超越符,3.3.1 数据传送类指令,36,数据传送指令细分为通用数据传送指令、端口输入输出指令、地址传送指令和标志寄存器传送指令。,1. 通用数据传送指令MOV,PUSH,POP,XCHG,XLAT,(1)MOV 指令格式:MOV dst, src 立即数到通用寄存器的数据传送 MOV AL, 4 ;AL=4 MOV AX, 1000H ;AX=1000H MOV SI, 037BH ;SI=037BH 但是:MOV DS, 2000H ;语法错误,不能用立即数给段寄存器赋值。 应该为: MOV AX, 2000 MOV DS, AX,37,立即数到存储单元的数据传送 MOV WORD PT
21、RDI, 2000H 将立即数2000H传送到内存单元,内存单元的地址以间接寻址的 方式由DI提供。 设DS=3000H,DI=1500H,目的操作数的物理首地址为31500H,38,PTR是属性运算符,功能为修改操作数的类型。 WORD PTR的作用是将操作数的类型设置为字类型。 BYTE PTR将操作数的类型设置为字节类型。 例如: MOV BYTE PTRSI, 4AH 将立即数4AH传送到内存单元,内存单元的地址以间接寻址的方式 由SI提供,传送一个字节。 MOV DI, 04AH ;语法错误:源和目的操作数的类型都不确定。 MOV指令中的两个操作数的类型必须至少有一个是确定的,另 一
22、个依附这一个。属性运算符PTR帮助我们确定存储器操作数的类型。,39, CPU内部寄存器之间的数据传送 MOV AL, BL ;BL传送给AL,传送一个字节。 MOV AX, BX ;BX传送给AX,传送一个字。 MOV DS, AX ;给数据段寄存器赋值。 MOV SI, BP ;BP传送给SI,传送一个字。 寄存器与存储单元之间的数据传送 MOV AL, 2000H MOV AX, SI MOV 3200H, CX MOV ARRYDI, DL MOV DL, BXSI,40,MOV CL, BPDI 设 (SS)=8000H ,(BP)=1020H ,(DI)=0383H , 内存单元
23、(813A3H)=44H 上面指令执行后: 则(CL)=44H,41,SS,1020H,BP,813A3H,44H,指令对操作数的要求:,MOV指令的两个操作数类型必须相同; MOV AX,BL ; 错误! 两个操作数不能同时为存储操作数; MOV BX,SI ; 错误! 不能用立即数直接给段寄存器赋值; MOV DS,3000H ; 错误! 两个操作数不能同时为段寄存器; MOV DS, ES ; 错误! MOV指令不能访问IP和Flags; MOV指令不影响标志寄存器的任何标志位 ; 不允许给CS赋值。,42,MOV指令实现数据块传送,例:把内存中首地址为MEM1的200个字节送到首地址为
24、MEM2的区域; MOV SI,OFFSET MEM1 MOV DI,OFFSET MEM2 MOV CX,200 NEXT: MOV AL,SI MOV DI,AL INC SI INC DI DEC CX JNZ NEXT HLT,43,MEM1,MEM2,(2)PUSH、POP指令,堆栈是程序在内存中开辟的一个数据区,用以保存寄存器或存储器中暂时不用而又必须保存的数据。堆栈的段基址放在SS中,堆栈指针为SP; 堆栈是一种线性表,只在栈顶(低地址端)进行输入输出操作。CPU对堆栈的操作采用先进后出(或后进先出)存取方法。CPU把数据存入堆栈称为压入堆栈PUSH,从堆栈中取出数据称为弹出堆栈
25、POP。 指令格式: PUSH src ;压栈指令 POP dst ;出栈指令,44,堆栈存取规则如下: 1. 每次存取一个字(16位); 2. 存放数据时,从高地址向低地址; 读取数据时正好相反; 3. SP总是指向栈顶; 压入操作数时 SP减2, 弹出操作数SP加2; 4. 操作数不能是立即数; 5. 后进先出(LIFO)的原则; 6. 参数传递、子程序调用、中断响应,45,SS10H,SP,50000,5FFFF,堆栈增长方向,堆栈段,栈顶,栈底,例: PUSH AX 设(AX)=1122H,SP=FFFE,SS=1000H 执行: SP-1 SP AH SP SP-1 SP AL SP
26、 SP=FFFCH 例: PUSH AX PUSH DI PUSH WORD PTR1000H PUSH WORD PTRSI PUSH WORD PTRBP+6,46,SS段,SP,SS X 10H,堆栈段,10000H,1FFFFH,例: 设SS=2000H,SP=102H,AX=623EH,执行下面指令后: PUSH AX SS=2000H,SP=100H, AX的数据62H存入20101H单元,3EH存入20100H单元。,47,20000H 20100H 20101H 20102H 20103H 2FFFFH,3EH 62H FFH 79H,栈底,POP AX 执行过程: SP AL
27、 SP+1 SP SP AH SP+1 SP,48,SS段,SP,SS 10H,SS段,SP,SS10H,MOV AX, 9000H MOV SS, AX MOV SP, 0E200H MOV DX, 38FFH PUSH DX PUSH AX POP AX POP DX,49,SS段,9E200H,90000H,9E1FCH,9E1FDH,9E1FEH,9E1FFH,SS段,9E200H,90000H,9E1FCH,9E1FDH,9E1FEH,9E1FFH,堆栈的作用,主要用来存放寄存器或存储器中暂时不用又必须保存的数据。如调用子程序或响应中断时保护断点地址; 堆栈操作数可以是16位通用寄存
28、器、段寄存器、存储器; PUSH和POP一般是成对出现的,且执行顺序相反,以保持堆栈原有的状态。,50,51,(3)交换指令XCHG 指令格式:XCHG OPRD1,OPRD2 功能:两个操作数交换。 说明:操作数可以是通用寄存器,不能是段寄存器;可以是存储器单元,但两个操作数不能同时为存储器操作数。操作数的字长必须相等。 例如: XCHG AX, BX XCHG AL, SI XCHG BX+DI, CX,52,(4)字节转换指令XLAT XLAT主要用于查表转换,隐含寻址。指令功能是将内存单元BX+AL的单字节内容传送给AL寄存器,指令执行前后AL的内容发生转换。在使用XLAT指令前,需要
29、预置DS:BX指向一张表,BX作为表的首地址。如果查表中第9个字节的内容,需要预置AL为9。 指令格式:XLAT,【例题3-1】 在DS数据段中存放有LED显示器7段码值表,TABLE为表首地址,查表取出LED显示器显示数字3 的码值,其中LED端口地址为88H。 MOV BX, OFFSET TABLE MOV AL, 3 XLAT OUT 88H, AL ;LED显示数字3 (4FH)。,2. 输入输出(I/O)指令,8086 CPU对所有输入/输出端口统一管理,提供了一个与内存储器地址空间分开的、完全独立的地址空间,I/O端口的地址有8位和16位两种形式。 直接端口寻址方式:当端口地址是
30、8位的二进制数时,可以在指令中直接使用该地址。 寄存器间接寻址方式:当端口地址为16位,不能直接使用,需要预先将其传送到DX寄存器中,并且只能是DX作为间接寻址寄存器。,53,cpu与外设进行数据传输,接口电路需要设置若干专用寄存器,缓冲输入输出数据,设定控制方式,保存输入输出状态信息,这些寄存器常称为端口,54,输入指令IN 格式: IN ACC, port ;直接寻址,8位port 为立即数端口地址。 或 IN ACC, DX ;间接寻址,DX存有16位端口地址。 例如: IN AL, 60H ;从60H端口输入一个字节。 IN AX, 60H ;从60H端口输入一个字 IN AL, DX
31、 ;从DX端口中输入一个字节。 IN AX, DX ;从DX端口中输入一个字。,输出指令OUT 格式: OUT port, ACC ;直接寻址,port 为8位立即数端口地址 或 OUT DX, ACC ;间接寻址,DX存有16位端口地址。 例如: OUT 60H, AL ;AL从60H端口输出。 OUT 60H, AX ;AX从60H端口输出。 OUT DX, AL ;AL从DX端口中输出。 OUT DX, AX ;AX从DX端口中输出。,55,【例题3-2】从并行口0378H输出一个字符A。 MOV DX, 0378H MOV AL, A OUT DX, AL,56,3. 地址传送指令LE
32、A,LDS,LES,57,(1)取有效地址指令LEA 指令格式:LEA dst , src 功能:把源操作数的地址偏移量传送到目的操作数。 说明:源操作数必须是存储器操作数,目的操作数必须是16位寄存器。 例如: LEA BX, TABLE ;TABLE的偏移地址传送给BX, ;TABLE为符号变量。 LEA SI, DATABX ;(SI)=(BX)+DATA,设BUFF为符号变量,比较下面两条指令的功能: MOV DI, OFFSET BUFF LEA DI, BUFF 上面两条指令的功能完全相同,但LEA指令更简洁。OFFSET为取值运算符,又称为数值返回运算符,用以求出变量或标号的属性
33、值。常见的取值运算符还有SEG。 SEG运算符用以求出变量或标号所在段的段基址。 例如: MOV AX, SEG BUFF ;BUFF的段基址送AX。 MOV DS, AX OFFSET用以求出变量或标号的偏移地址。例如: MOV SI, OFFSET BUFF ;BUFF的偏移地址送AX。,58,例:设(BX)=1000H, (DS)=6000H, 内存单元(61050H)=33H, (61051H)=44H;比较一下两条指令的执行结果: LEA BX,BX+50H MOV BX,BX+50H,59,61050H 61051H,DS段,LEA BX,BX+50H,MOV BX,BX+50H,
34、60,4. 标志寄存器传送指令LAHF,SAHF,PUSHF,POPF 这4条指令都是隐含寻址方式。 LAHF指令 指令格式:LAHF 功能:把标志寄存器Flags的低8位装入AH寄存器。 SAHF指令 指令格式:SAHF 功能:把AH传送到Flags的低8位,指令影响标志位。 PUSHF指令 指令格式:PUSHF 功能:把Flags压入堆栈。 POPF指令 指令格式:POPF 功能:从堆栈中弹出两个字节传送给Flags,指令影响标志位。,3.3.2 算术运算指令,8088/8086CPU提供了加、减、乘、除4种基本算术运算指令,可以实现二进制数的运算也可以实现十进制数运算。可以实现字节运算也
35、可以实现字运算。可以进行有符号数运算也可以进行无符号数运算,有符号数运算以补码形式进行。这4种算术运算指令都对标志位产生影响。算术运算指令应尽量使用累加器作操作数。,61,62,1. 加法运算指令和调正指令ADD,ADC,INC,AAA,DAA (1)不带进位的加法运算指令ADD ADD指令完成两个操作数相加,并将结果保存在目的操作数中。 指令格式: ADD OPRD1, OPRD2 功能:操作数OPRD1与OPRD2相加,结果保存在OPRD1中。 说明:操作数OPRD1可以是累加器AL或AX,也可以是其它通用寄存器或存储器操作数,OPRD2可以是累加器、其它通用寄存器或存储器操作数,还可以是
36、立即数。OPRD1和OPRD2不能同时为存储器操作数,不能为段寄存器。ADD指令的执行对全部6个状态标志位产生影响。,63,1 1 0 1 1 0 0 1 + 0 1 1 0 1 1 1 0 10 1 0 0 0 1 1 1,例如: ADD AL, BL ;AL+BL结果存回AL中。 ADD AX, SI ;AX+SI结果存回AX中。 ADD BX, 3DFH ;BX+03DFH结果存回BX中。 ADD DX, DATABP+SI ;DX与内存单元相加,结果存回DX中。 ADD BYTE PTRDI, 30H ;内存单元与30H相加,结果存回内存单元中。 ADD SI, AX ;内存单元SI与
37、AX相加,结果存回SI中。 ADD BX+SI, AL ;内存单元与AL相加,结果存回内存单元中。,【例题3-3】求D9H与6EH的和,并注明受影响的标志位状态。 MOV AL, 0D9H MOV BL, 6EH ADD AL, BL 结果AL=47H,标志位CF=1,PF=1,AF=1,ZF=0,SF=0,OF=0,64,(2)带进位的加法运算指令ADC ADC指令完成两个操作数相加之后,再加上Flags的进位标志CF。CF的值可能为1或0。 指令格式: ADC OPRD1, OPRD2 功能:操作数OPRD1与OPRD2相加后,再加上CF的值,结果保存在OPRD1中。 说明:对操作数的要求
38、与ADD指令一样。 例如: ADC AL, BL ADC AX, BX ADC DI, 30H ADC指令主要用于多字节数的加法运算,以保证低位向高位的进位被正确接收。,【例题3-4】求3AD9FH与25BC6EH的和,结果存放在DX:AX中。 MOV AX, 0AD9FH ;AX=AD9FH MOV BX, 0BC6EH ;BX=BC6EH ADD AX, BX ;AX=6A0DH,CF=1 MOV DX, 03H ;DX=3 ADC DX, 25H ;DX=29H, 结果DX:AX=296A0DH,65,66,(3)加1指令INC 加1指令又称增量指令,指令不影响CF标志位。 指令格式:I
39、NC OPRD 功能:OPRD加1后送回OPRD。 说明:操作数OPRD可以是寄存器或存储器操作数,指令可以完成字节或字的加1操作。 例如: INC AL INC AX INC BYTE PTRSI INC WORD PTRBX+DI (4)十进制数加法调正指令AAA、DAA ADD和ADC指令允许BCD数作为操作数进行加法运算,我们得以按照十进制数的方式完成加法运算。但是CPU在完成运算时依然按照二进制数进行,所以在ADD或ADC指令之后,应进行十进制的调正。,67,2. 减法运算指令SUB,SBB,DEC,NEG,CMP,AAS,DAS (1)不带借位CF的减法指令SUB 指令格式: SU
40、B OPRD1, OPRD2 功能:操作数OPRD1减去OPRD2结果保存在OPRD1中。 说明:操作数OPRD1可以是累加器AL或AX,也可以是其它通用寄存器或存储器操作数,OPRD2可以是累加器、其它通用寄存器或存储器操作数,还可以是立即数。OPRD1和OPRD2不能同时为存储器操作数,不能为段寄存器。SUB指令的执行对全部6个状态标志位产生影响。,68,1 1 0 1 1 0 0 1 - 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 1,例如: SUB AL, BL ;AL-BL结果存回AL SUB CX, BX ;CX-BX结果存回CX SUB DX, SI ;DX与SI
41、内存单元相减,结果存回DX SUB DATABX, CL ;内存单元的数减去CL结果存回内存单元 SUB BL, 2 ;BL-2结果在BL中 SUB WORD PTRBP+SI, 100H ;内存单元减去100H,结果存回内存 【例题3-5】求D9H与6EH相减,并注明受影响的标志位状态。 MOV AL, 0D9H MOV BL, 6EH SUB AL, BL 结果AL=6BH, 标志位CF=0,PF=0,AF=1,ZF=0,SF=0,OF=1,69,(2)带借位CF的减法指令SBB 指令格式:SBB OPRD1, OPRD2 功能:操作数OPRD1减去OPRD2再减去CF的值,结果保存在OP
42、RD1中。 说明:与SUB指令相同。常用于多字节数减法。对全部6个状态标志位产生影响。 例如: SBB AL, 30H ;AL-30H-CF结果存回AL SBB AX, BX ;AX-BX-CF结果存回AX SBB DI, AH ;DI内存单元的数减去AH结果存回内存单 ;元DI中,70,(3)减1指令DEC DEC指令又称为减量指令,指令不影响CF标志位,对其它5个状态标志位产生影响。 指令格式: DEC OPRD 功能:操作数OPRD减1后回送OPRD。 说明:操作数OPRD可以是寄存器或存储器操作数,指令可以完成字节或字的减1操作。 例如: DEC CX DEC CL DEC BYTE
43、PTR ARRAY+SI,71,(4)操作数求补指令NEG 指令格式:NEG OPRD 功能:(0-OPRD) OPRD,即对OPRD包括符号位在内逐位取反后加1,结果回送到OPRD。 说明:OPRD可以是寄存器或存储器操作数。如果操作数非0,指令的执行使CF=1,否则CF=0。对全部6个状态标志位产生影响。 【例题3-6】 MOV AL,31H NEG AL ;AL=CFH,标志位 ; CF=1,PF=1,AF=1,ZF=0,SF=1,OF=0,72,(5)比较指令CMP 指令格式: CMP OPRD1, OPRD2 功能:OPRD1减去OPRD2,结果并不回送给OPRD1。指令影响全部6个
44、状态标志位。 说明:指令的执行不影响两个操作数,操作数不变,但影响6个状态标志位。这条指令后面常跟有条件转移指令,利用CMP指令对Flags标志位的影响,设定程序的执行方向。OPRD1可以是寄存器或存储器操作数,OPRD2可以是立即数、寄存器或存储器操作数。 例如: CMP AL, AH CMP AX, BX CMP SI+DATA, AX CMP CL, 8 CMP POINTERBX, 100H 【例题3-7】从键盘输入数据并判断。 MOV AH, 1 INT 21H ;等待从键盘输入一个字符,并存于AL中。 CMP AL, 0 ;AL与0比较。 JZ ZERO ;是0转移到ZERO处继续
45、执行。 CMP AL, 1 ;如果不是0,是1吗? JZ GOON ;是1转移到GOON处执行。 .,73,3. 乘法指令MUL,IMUL,AAM 8088/8086CPU乘法指令能实现字节乘法和字的乘法。字节乘法的乘积为16位存放在AX中,字的乘法的乘积为32位存放在DX:AX。指令的目的操作数采用隐含寻址方式。 (1)无符号数乘法指令MUL 指令格式:MUL src 功能:如果src为字节类型,累加器AL与src相乘,结果存在AX中;如果src为字类型累加器AX与src相乘,结果存在DX:AX中。 说明:两个乘数的数据类型要相同,指令影响标志位CF,OF位。 例如: MUL AH ;ALA
46、H 结果保存在AX中。 MUL BX ;AXBX结果保存在DX:AX中。 MUL BYTE PTRSI ;ALSI结果保存在AX中。 MUL WORD PTRBX+DI ;AXBX+DI结果保存在DX:AX中。 字节相乘的乘积在AX中,如果标志位CF=OF=1,表明AH不为0;字相乘的乘积在DX:AX中,如果标志位CF=OF=1,表明乘积的高位DX不为0。,74,(2)有符号数乘法指令IMUL 指令格式: IMUL src 功能:指令的功能和用法与MUL指令相同,只是操作数为带符号数,结果也是带符号数。说明:指令影响标志位CF、OF位。如果标志位CF=OF=0,表明乘积的高位部分是低位的符号扩
47、展,可以忽略。如果标志位CF=OF=1,表明DX含有乘积的高位,不能忽略。 (3)乘法的十进制调正指令AAM AAM指令完成AL中数的调正。使用AAM的前提是两个非压缩BCD码相乘,乘积在AL中,AH=0。 指令格式:AAM 功能:把AL寄存器的内容除以0AH,商存在AH中,余数存在AL中。 例如: MOV AL, 8 MOV BL, 7 MUL BL AAM ;AH=5,AL=6,75,4. 除法指令DIV,IDIV,CBW,CWD,AAD 除法指令包括无符号数除法指令DIV,带符号数除法指令IDIV。这两条指令都隐含了被除数AX或DX:AX,除数可以是寄存器或存储器操作数,但不能是立即数。被除数的字长要求是除数字长的两倍,如果除数是字节类型,被除数必须是字类型而且要预置在AX中;如果除数为字类型,被除数必须是双字类型而且要预置在DX:AX中。 (1)无符号数除法指令DIV 指令格式:DIV OPRD 功能:如果OPRD是字节类型,被除数AX除OPRD,结果的商存到AL中,余数存到AH中;如果OPRD是字类型,被除数DX:AX除OPRD,结果的商存到AX中,余数存到DX中。,说明:在指令执行前,必须检查被除数的长度,如果不符合要求,要用位扩展指令来转换。 例如: DIV BL DIV BX DIV BYTE PTRS
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。