3.4.2 算术运算指令(Arithmetic) 算术运算指令内容: 8086/8088提供加、减、乘、除等六种基本算术操作

Slides:



Advertisements
Similar presentations
微型计算机原理及应用.
Advertisements

输入输出程序设计 输入输出的基本概念 无条件方式输入输出 查询方式输入输出 中断方式输入输出.
汇编语言程序设计 吴 向 军 中山大学计算机科学系
x86/Pentium指令系统 x86寻址方式 1.比例变址寻址方式 (Scaled Indexed Addressing)
微型计算机技术 教 学 指 导(七) 太原广播电视大学 郭建勇.
第10章 DOS功能调用与BIOS中断调用.
第7章 8086/8088汇编语言程序设计 7.1 引言 7.2 顺序程序设计 7.3 分支结构程序设计 7.4 循环结构程序设计
§1 指令的构成和操作数的类型 一、指令构成 一条指令由操怍码字段和操作数字段构成。 1、操作码字段 操作码字段表明指令执行何种性质的操作。
第四章 汇编语言 程序设计 任课教师:王晓甜
大连理工大学软件学院 软件工程系 赖晓晨 计算机组成与结构 大连理工大学软件学院 软件工程系 赖晓晨
汇编语言与接口技术 教师:范新民.
本周实验安排 实验内容:(P231)人名排序的例子。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月30日.
第3章 80x86汇编语言程序设计(下).
第3章 80x86汇编语言程序设计(中) 时间不够的情况下只讲16位汇编.
第三章 指令系统及其寻址方式 3.1 寻址方式 3.2 指令格式 3.3 指令系统.
4.1 汇编语言 4.2 顺序结构程序 4.3 分支程序设计 4.4 循环程序设计 4.5 子程序设计
第3章 80x86汇编语言程序设计(上) 16位汇编版本 时间不够的情况下只讲16位汇编.
9.1 可编程并行输入/输出接口芯片8255A 9.2 可编程计数器/定时器 可编程串行输入/输出接口芯片8251A
3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月26日.
微机原理与接口技术 第3章 8086/8088指令系统 黄强 深圳大学 信息工程学院.
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
汇编语言程序设计 Assembly Language Programming
第三章 寻址方式与指令系统 3.1 寻址方式 一条指令通常由两大部分构成: 操作码 操作数
微机原理与接口技术 第3章 8086指令系统 朱华贵 2015年09月25日.
第6章 DMA传输 6.1 DMA传输原理 6.2 DMA控制器8237A A的编程使用 欢迎辞.
第7章 并行接口 7.1 简单并行接口 7.2 可编程并行接口8255A 7.3 键盘接口 7.4 LED显示器接口.
微机原理与接口技术 第2章 8086系统结构 朱华贵 2015年09月17日.
第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第四节 Intel 8253在IBM PC机上的应用.
Assembly Language Programming
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月10日.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月05日.
输入输出与中断 主要内容 CPU与外设之间数据传送方式 中断技术 8086中断系统和中断处理.
第八章 输入输出程序设计 总线 CPU MEM I/O接口 I/O设备.
第3章 IA-32指令系统 3.1 基本数据类型 3.2 IA-32的指令格式 3.3 IA-32指令的操作数寻址方式
汇编语言程序设计 吴 向 军 中山大学计算机科学系
第8章 寻址方式与指令系统.
第二部分 PC 微机异步通信适配器的分析和使用 一、PC中的UART 1.INS PC16450/PC16550
第4章 汇编语言程序设计 4.1 程序设计语言概述 4.2 汇编语言的程序结构与语句格式 4.3 汇编语言的伪指令
第一章 8086程序设计 第二章 MCS-51程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
汇编语言程序设计课程设计 第二次实验 DEBUG基本命令与算术运算指令
第二章 8086/8088系统结构 主要内容 8086/8088微处理器的内部结构 8086/8088 CPU 的引脚与功能
微型计算机原理及应用.
第3章 微型计算机输入输出接口 3.1 输入/输出接口 3.2 输入输出数据传输的控制方式 3.3 开关量输入输出接口 欢迎辞.
第六章 子程序结构 §6.1 子程序的设计方法 §6.2 嵌套与递归子程序 §6.3 子程序举例 §6.4 DOS系统功能调用.
條件處理.
第九章 高级宏汇编语言 9.1 结构 结构就是将逻辑上有一定关系的一组数据,以某种方式组合在一起所形成的数据形式。
第5章 循环与分支程序设计 学习目标: 了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。掌握起泡排序算法这种多重循环程序设计中的常用方法。交换标志位的设置在此算法中更能提高效率。学会在数组排序算法中采用折半查找法来提高查找效率。学会使用跳跃表法实现CASE结构。
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
3.4.5 控制转移指令(Control transfer instructions) (一)、控制转移指令概述
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月19日.
第五章:输入输出基本技术 主讲教师:范新民.
第二章 8086微处理器. 第二章 8086微处理器 微处理器的基本结构 8086微处理器的主要特性和内部结构 8086CPU的工作模式和引脚信号 8086的存储器管理 8086的总线操作和时序.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程.
第10章 可编程外围接口芯片8255A及其应用 10.1 概述 A的工作原理 A的应用举例.
习题3 1、 分别说明下列指令的原操作数和目的操作数各采用什么寻址方式。 设定如下: ①立即寻址 ② ① ②寄存器寻址
可编程定时计数器.
第九章 BIOS和DOS中断 在存储器系统中,从地址0FE000H开始的8K ROM(只读存储器)中装有BIOS(Basic Iuput /output System)例行程序。驻留在ROM中的BIOS给PC系列的不同微处理器提供了兼容的系统加电自检,引导装入,主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大方便,程序员不必了解硬件操作的具体细节,直接用指令设置参数,然后中断调用BIOS中的子功能,所以利用BIOS功能编写的程序简洁,可读性好,
第2章 80x86计算机组织  计算机系统  存储器  中央处理机  外部设备.
《微型计算机原理与接口技术》 第4版 王良 宁德师范学院 吴宁 乔亚男 编著 清华大学出版社 出版
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月17日.
微机原理与接口技术 西安邮电大学计算机学院 宁晓菊.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月06日.
第3章 80x86的指令系统和寻址方式 § x86的寻址方式 § x86的指令系统
第6章 子程序结构 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。 2019/7/20 ch6.
微机原理与接口技术 第5章 汇编语言程序设计 西安邮电大学计算机学院 王 钰.
第8章 并行接口芯片 并行接口一般具有两个或两个以上的8位I/O接口。各个口的工作方式可由程序分别确定或改变,使用灵活,便于和各种外部设备连接。因此,又称可编程的外部接口(PPI) 目前各主要微处理器厂商都有自己的PPI产品,但它们的功能基本类似.
第三章 8086的指令系统 8086指令特点 8086的寻址方式 8086的指令格式及数据类型 8086的指令集.
Presentation transcript:

3.4.2 算术运算指令(Arithmetic) 算术运算指令内容: 8086/8088提供加、减、乘、除等六种基本算术操作 (一)加法指令( Addition) (二)减法指令(Subtraction) (三)乘法指令(Multiplication) (四)除法指令(Division) (五)符号扩展指令 (六)十进制调整指令

特点: 大部分都影响标志位,不同指令影响不同: (1) 加、减法指令影响 SF,ZF,AF,PF,CF,OF; (2) 加1和减1指令不影响CF; (3) 乘法指令影响CF,OF; (4) 除法指令使大部分标志位的状态不确定; (5) 对BCD码调整指令对标志位的影响不同; (6) 转换指令对标志位无影响 都可以用于字节、字的运算; 双操作数指令除源为立即数外,其余必须有一个操作数 为寄存器;单操作数指令不能为立即数。

(一)加法指令( Addition) 8086具有5种加法操作指令: 1、 ADD(Addition)加法指令 2、 ADC(Add with carry)带进位加法指令 3、 INC(Increment by 1)加 1指令 4、AAA(ASCII adjust for addition)加法ASCII调整指令 5、DAA(Decimal adjust for addition)加法十进制调整指令

1、 ADD(Addition)加法指令 例: 指令格式:ADD dst , src ;(dst) (dst)+(src) ADD CL,10 ;寄存器+立即数 ADD DX,SI ;寄存器+寄存器 ADD AX, MEM ;寄存器+存储器 ADD DATA[BX], AL ;存储器+寄存器 ADD BYTE PTR ALPHA[DI],30H;存储器+立即数

2、 ADC(Add with carry)带进位加法指令 格式:ADC dst,src ;(dst)←(dst)+(src)+CF CF: 进位标志CF的现行值(上条指令CF值) 特点: 与ADD同。 用途:主要用于多字节运算中。 例: ADC CX, 300 ;寄存器+立即数+CF ADC AL, BL ;寄存器+寄存器+CF ADC DX, COUNT[SI] ;寄存器+存储器+CF ADC BLOCK[DI], BX ;存储器+寄存器+CF ADC BYTE PTR MEM, 6 ;存储器+立即数+CF

计算两个多字节数相加 3B74AC60F8H+20D59E36C1H=? 两个多字节数存放在: DATA1,DATA2开始的单元。 应用举例: 计算两个多字节数相加 3B74AC60F8H+20D59E36C1H=? 两个多字节数存放在: DATA1,DATA2开始的单元。 流程图 多字节数内存存放

程序: MOV CX, 5 MOV SI, 0 ; 清SI CLC ;清CF LOOPER: MOV AL, DATA2[SI] ADC DATA1[SI],AL INC SI ;(SI)+1  (SI) DEC CX ;(CX)-1 (CX) JNZ LOOPER ;(CX)0转 HLT ;停机

特点: 可以进行8位、16位的无符号数和带符号数的加法运算; 源操作数和目标操作数不能同时为存储器, 不能为段寄存器; 指令影响标志位的情况: OF=1, 8位带符号数相加,和超出范围(-128~+127), 16位带符号数相加,和超出范围(-32768~+32767); CF=1, 8位无符号数相加,和超过255, 16位无符号数相加,和超过65535。 其他条件标志(SF,AF,PF,ZF)根据定义设定。

例: MOV AL,7EH ;(AL)=7EH MOV BL, 5BH ;(BL)=5BH ADD AL,BL ;(AL)=7EH+5BH=D9H 影响标志位的情况: SF=1 , 结果最高位=1 ZF=0 ,结果不等于0 AF=1 ,D3 位向D4 有进位 PF=0 ,”1”的个数为奇数 CF=0 ,无进位 OF=1 ,和超过+127 (两个正数相加,结果为负;反之亦是)

问题思考: 分析两标志位(1) 什么叫溢出?什么叫进位? (2) 有进位就有溢出,没有进位就没有溢出? (1)解答: 分析两标志位(1) 什么叫溢出?什么叫进位? (2) 有进位就有溢出,没有进位就没有溢出? (1)解答: 溢出------通常是指带符号数的补码溢出。 补码运算能表示范围为:-2 n-1 ~+2 n+1 –1,如果运算结果超出该范围,叫补码溢出,此时OF=1,故用OF标志判断带符号数运算是否超范围(结果溢出)。 进位------是指运算结果的最高位向更高位的进位。 有进位,CF=1;无进位, CF=0,用CF标志判断无符号数运算是否超范围(结果溢出) 。

结论: 有进位不一定有溢出,没有进位不一定没有溢出。 (2)有进位就有溢出,没有进位就没有溢出? 结论: 有进位不一定有溢出,没有进位不一定没有溢出。 以8位二进制数为例分析一下数的溢出与进位情况: 下面分4种情况加以讨论: (1) 带符号数和无符号数都不溢出 (2) 无符号数溢出 (3) 带符号数溢出 (4) 带符号数和无符号数都溢出

(1) 带符号数和无符号数都不溢出 。

(2) 无符号数溢出 二进制数 看作无符号数 看作带符号数 1 + 7 251 258 + 7 - 5 + 2 相 加 标志 (2) 无符号数溢出 二进制数 看作无符号数 看作带符号数 1 + 7 251 258 + 7 - 5 + 2 相 加 标志 CF=1,OF=0 CF=1 OF=0 溢出 无符号数溢出 结果应为2,错 不溢出 异号数相加 不可能有溢出

(3) 带符号数溢出

(4) 带符号数和无符号数都溢出

结论: (1)带符号数相加是否溢出根据OF= 1 ?判断。 OF=1,同符号数相加,结果符号与其相反,产生溢出; 异号数相加,不可能溢出。 (2)无符号数相加是否溢出根据CF= 1 ?判断。 CF=1,无符号数相加产生溢出。 (3)对标志的解释,取决于程序员。如带符号数只关心OF、SF;无符号数只关心CF,而OF、SF无意义 。

3、INC (Increment by 1 )加 1 指令 格式: INC dst ;(B/W), (dst)←(dst)+1 dst : 寄存器、存储器。不能是段寄存器。 功能:对指定的目标操作数+1  操作数单元。 用途:用于在循环程序中修改地址指针和循环次数。 标志位影响情况:影响SF,ZF,AF,PF,OF。 不影响CF。

例: 操作数类型:可以是寄存器,存储器,不能是段寄存器。 INC DL ; 8位寄存器+1 INC SI ;16位寄存器+1 INC BYTE PTR [BX][SI] ;存储器+1(字节操作) INC WORD PTR [DI] ;存储器+1(字操作) INC DS ; 错

(二)减法指令(Subtraction) 8086有7条减法指令 : 1、SUB(Subtraction)减法指令 2、SBB(Subtraction with borrow)带进位减法指令 3、DEC(Decrement by 1 ) 减 1 指令 4、NEG(Negate) 求补指令 5、CMP(Compare) 比较指令 6、AAS(ASCII adjust for subtraction)减法ASCII调整指令 7、DAS(Decimal adjust for subtraction)减法十进制调整指令

1、SUB(Subtraction)减法指令 格式:SUB dst,src;(dst)←(dst)-(src) Src:立即数,寄存器,存储器。 dst:寄存器,存储器。 例: SUB AL,37H ;寄存器-立即数 SUB BX,DX ;寄存器-寄存器 SUB CX, VAR1 ;寄存器-存储器 SUB ARRAY[SI], AX ;存储器-寄存器 SUB WORD PTR [BX][DI],512H ;存储器减立即数 这种指令影响标志位: AF、CF、OF、PF、SF、ZF标志。 CF=1,无符号数小减大,运算结果溢出; OF=1,带符号数运算溢出。

2、SBB(Subtraction with borrow)带借位减法指令 格式::SBB dst,src;(dst)←(dst)-(src)-CF CF: 借位标志CF的现行值(上条指令CF值) Src:立即数,寄存器,存储器; dst:寄存器,存储器。 指令影响标志位、B/W数运算情况同SUB。 用途:用于多字节数相减。 例: SBB BX,100H ;寄存器-立即数 -CF SBB CX,DX ;寄存器-寄存器-CF SBB AL, DATA1[SI] ;寄存器-存储器-CF SBB DISP[BP], BL ;存储器-寄存器-CF SBB BYTE PTR ALPHA[SI+6], 96H;存储器-立即数-CF

3、DEC (Decrement by 1 ) 减 1 指令 格式: DEC dst ;(B/W) (dst)←(dst)-1 dst : 寄存器 、存储器。不能是段寄存器。 功能:对指定的目标操作数-1  操作数单元。 用途:用于在循环程序中修改地址指针和循环次数。 标志位影响情况:影响SF,ZF,AF,PF,OF。 不影响CF。

DEC 用途举例: … MOV AX , 0FFFFH CYC: DEC AX JNZ CYC HLT 用于延时时间。

4、NEG (Negate) 求补指令 格式: NEG dst ;B/W, (dst) ← 0 - (dst) 操作: 把操作数按位求反后末位+1。 (dst) ← 0FFFFH -(dst)+1 影响标志:AF、CF、OF、PF、SF、ZF。 CF: 操作数为0时求补,CF=0 ; 其他情况均使CF=1. OF: 对-128 或-32768求补,OF=1; 否则OF=0.

应用举例:求绝对值 在内存中, 从AREA1开始存放100个带符号数。 求各数的绝对值存于AREA2的开始单元。 流程图

程序: LEA SI, AREA1 LEA DI, AREA2 MOV CX, 100 CHECK: MOV AL, [SI] OR AL, AL ;(AL)内容不变,置标志 JNS NEXT ;SF=0转NEXT NEG AL ;负数求补 NEXT: MOV [DI], AL ;送目标 INC SI INC DI DEC CX JNZ CHECK HLT

5、CMP(Compare) 比较指令 格式:CMP dst,src ; B/W (dst)-(src) 结果不回送,只置标志。 影响标志: AF、CF、OF、PF、SF、ZF 。 src: 立即数,寄存器,存储器。 dst:寄存器,存储器。 例: CMP AL,0AH ;寄存器与立即数比较 CMP CX, DI ;寄存器与寄存器比较 CMP AX, AREA1 ;寄存器与存储器比较 CMP [BX+5], SI ;存储器与寄存器比较 CMP WORD PTR AMMA,100H;存储器与立即数比较

用途: 用比较指令来比较两个数之间的关系: 两者是否相等,两个数中哪个大。 (1) 根据ZF标志,判断两者是否相等; (2) 根据CF标志, 判断两个无符号数的大小; (3) 用SF、OF标志,判断二个带符号数的大小。

(1) 根据ZF标志,可判断两者是否相等 例: CMP AX, BX ZF=1, (AX) = (BX),两者相等 ZF=0, (AX) = (BX),两者不相等 (2) 根据CF标志, 判断两个无符号数的大小 例: 比较AX,BX寄存器, 将大数  (AX) CMP AX,BX JNC NEXT ; CF=0转NEXT XCHG AX,BX NEXT:…… 结论:CF=0 ,(AX) > (BX); CF=1, (AX) < (BX) (3) 用SF、OF标志,判断二个带符号数的大小(分析略)

(三)乘法指令(Multiplication) 可对字节、字进行操作;两个8位数相乘,结果为16位数,两个16位数相乘,结果为32位数; 可对无符号整数或有符号整数进行操作;对应有两条乘法指令。 1、MUL(Multiply) 无符号数乘法指令 格式:MUL src ; 字节操作 (AX)←(AL)×(src) ;字操作 (DX), (AX)←(AX)×(src) 2、IMUL(Integer Multiply) 有符号数乘法指令 格式:IMUL src ; 执行的操作同MUL,只是处理的数据是带符号的。

说明: 1、被乘数(即dst)隐含在AL或AX中,乘数(即src)由指令寻址,其寻址方式可以是除立即寻址方式之外的任何数据寻址方式,同时,它也决定了乘法是字运算还是字节运算。 2、乘法指令对除CF和OF以外的标志位无定义(即状态不定),如果乘积的高一半为0(或为符号位),则CF和OF均为0,否则均为1。 例: MUL CL IMUL DL MUL BYTE PTR[BX] IMUL NUMR

(四)除法指令(Division) 除法与乘法指令一样 可对字节、字进行操作;但字节除法是用16位数除以8位数,字除法是用32位数除以16位数。 可对无符号整数或有符号整数进行操作;对应有两条除法指令。 1、DIV(Division) 无符号数除法指令 格式:DIV src ; 字节操作 (AL)←(AX)/(src)的商 (AH)←(AX)/(src)的余数 ;字操作 (AX)←(DX,AX)/(src)的商 (DX)←(DX,AX)/(src)的余数 2、IDIV(Integer Division) 有符号数除法指令 格式:IDIV src ; 执行的操作同DIV ,只是处理的数据是带符号的,商和余数均为有符号数,余数符号同被除数符号。

说明: 1、被除数(即dst)隐含在AX 或(DX,AX)中,除数(即src)由指令寻址,其寻址方式可以是除立即寻址方式之外的任何数据寻址方式,同时,它也决定了除法是字运算还是字节运算。 2、除法指令对所有标志位无定义(即状态不定)。 3、执行除法指令时如果产生商溢出,微处理器就会产生除法错中断。 例: DIV CL IDIV DL DIV BYTE PTR[BP] IDIV WORD PTR[BX]

(五)符号扩展指令 功能: 将带符号的字节类型(8位)数据扩展为字类型(16位); 将带符号的字类型(16位)数据扩展为双字类型(32位)。 1、CBW(Convert Byte to Word)字节转换为字指令 格式:CBW ; 将(AL)的符号扩展到(AH)中去。 D7 D0 D7 D0 AH 0 • • • • • • 0 AL 正数 D7 D0 D7 D0 负数 AH 1 • • • • • • 1 AL 1 *指令执行后不影响标志位

2、CWD(Convert Word to Double Word)字转换为双字指令 格式:CWD ; 将(AX)的符号扩展到(DX)中去。 D15 D0 D15 D0 DX 0 • • • • • • 0 AX 正数 D15 D0 D15 D0 负数 DX 1 • • • • • • 1 AX 1 *指令执行后不影响标志位

例: 使NUMB2字节存储单元的内容除以NUMB1字节存储单元的内容,将商存于ANSQ字节单元中,余数存于ANSR字节单元中。 MOV AL,NUMB2 CBW IDIV NUMB1 MOV ANSQ,AL;商 MOV ANSR,AH;余数

(六)十进制调整指令 1、AAA(ASCII adjust for addition)加法ASCII调整指令 2、DAA(Decimal adjust for addition)加法十进制调整指令 3、AAS(ASCII adjust for subtraction)减法ASCII调整指令 4、DAS(Decimal adjust for subtraction)减法十进制调整指令

DAA 指令 格式: DAA;调整(AL)中压缩的二进制BCD码的和。 方法是: 若AF=1 or (AL)低4位>9,则(AL)加06H,且自动置AF=1; 若CF=1 or (AL)高4位>9,则(AL)加60H,且自动置CF=1。 说明: 1、该指令对PSW中的OF标志无定义,会影响所有其他标志位。 2、该指令应紧跟在加法指令后使用。调整后的和存入AL中。

BCD码运算规则: BCD码是十进制数,运算时应满足逢十进一规则;而运算器对数据运算时,都是按照二进制运算规则进行处理的,(BCD码为4位二进制数,是逢十六进一)故将BCD码传给运算器进行运算时,其结果需要修正。 例:计算1+8的值 0 0 0 1 + 1 0 0 0 1 0 0 1 1+8=9正确 例:计算5+7的值 0 1 0 1 + 0 1 1 1 1 1 0 0 + 0 1 1 0 1 0 0 1 0 结果大于9 加6修正 5+7=12正确

3.4.3 逻辑运算和移位指令 (一)逻辑运算指令 1、AND(Logical and ) 逻辑“与”指令 2、TEST(Test or non-dstructive logical and ) 测试指令 3、OR(Logical inclusive or ) 逻辑“或”指令 4、XOR(Logical exclusive or) 逻辑“异或”指令 5、NOT(Logical not ) 逻辑“非”指令 特点: 8086可以对8位,或16位操作数执行逻辑操作。 逻辑运算是按位操作的。 影响标志位: (NOT指令除外,其他指令同) CF=OF=0, AF未定义 , SF ZF PF (根据运算结果设置) ↕  ↕   ↕

1、AND(Logical and )逻辑“与”指令 格式:AND dst, src ;B/W,(dst)(dst )∧ (src) src: 立即数、寄存器、存储器。 dst: 寄存器、存储器。 注意:“与”指令中操作数不能同时为存储器。 两位中有一位为0(或二位都为0),则结 果 为0,否则为1。 举例: AND AL, 0FH ;寄存器 ∧ 立即数 AND CX, DI ; 寄存器 ∧ 寄存器 AND SI, MEM_NAME ; 寄存器 ∧ 存储器 AND ALPHA [DI], AX ; 存储器 ∧ 寄存器 AND word ptr [BX][SI], 0FFFEH ; 存储器 ∧ 立即数

“与”指令的用途: (1) 清CF , 自己“与”自己, 操作数不变 ,CF=0 例:AND AL,AL ; 结果:操作数不变 ,CF=0。 (2) 使操作数中若干位保持不变,若干位清“0 “;保持不 变的位与“1”相与;清“0 “的位与“0” 相与。 例: 若(AL)=43H AND AL, 0FH ; (AL)=03H, (AL)0~3不变; ;(AL)4~7=0H,屏蔽高4位。

“与”指令应用举例 例:将英文小写字母ASCII转换成大写。 小写英文字母ASCII为: ‘a’~’z’ 61H~7AH 程序: MOV AL, ’z’ AND AL, 0DFH ; (AL)=5AH 0110 0001 61H 0100 0001 41H 1101 1111 DFH

2、 TEST(Test or non_dstructive logical and )测试指令 格式: TEST dst , src; B/W ,(dst)∧(src) src: 立即数、寄存器、存储器。 dst: 寄存器、存储器。 执行操作: 二个操作数相与的结果不保存,置标志位。 操作类型举例: TEST BH, 7 ; 寄存器 ∧ 立即数 TEST SI , BP ;寄存器 ∧ 寄存器 TEST DI ,TABLE[BX] ; 寄存器 ∧ 存储器 TEST [SI],CH ;存储器 ∧ 寄存器 TEST word ptr [BX][DI], 6ACEH ;存储器 ∧ 立即数

用途:是条件转移指令的先行指令,常用于检测一些条件是否满足,但又不希望改变原有的操作数的情况,检测的位与“1”相与;不检测的位与“0” 相与。在此指令后边常加一条条件转移指令。 例:判断A单元中数据的奇偶性 设: (A L)= 0AEH 程序:MOV AL,A ;(AL)=0AEH TEST AL,01H JZ EVEN ; 结果=0为偶数转EVEN … 奇数处理 … EVEN:偶数处理 检测(AL)的最低位是否为0,若为0转EVEN

3、OR(Logical inclusive or )逻辑“或”指令 格式:OR dst, src; B/W ,(dst)←(dst) (src) dst: 寄存器、存储器。 src: 立即数、寄存器、存储器。 注意:“或”指令中操作数不能同时为存储器; 两位操作数中任一位为1(或都为1), 则该位(结果)=1, 否则为0。 举例: OR BL,0F6H ; 寄存器 立即数 OR AH, BL ;寄存器 寄存器 OR CL ,BETA[BX][DI] ; 寄存器 存储器 OR GAMMA[SI] ,DX ;存储器 寄存器 OR BYTE PTR MEM_BYTE , 80H ;存储器 立即数 ∧ ∧ ∧ ∧ ∧ ∧

影响标志位: CF=0F=0, AF未定义 , SF ZF PF 用途: (1)清CF , 自己与自己“或”,操作数不变,CF=0 ↕  ↕   ↕ 用途: (1)清CF , 自己与自己“或”,操作数不变,CF=0 例: OR AL,AL ;(AL)不变,CF=0 (2)使某个操作数若干位保持不变,若干位置1;保持不变的位与“0”或 ;位置1的与“1”或。 (3) 将两个操作数信息组合。 若(AL)=03H 用OR指令组合使(AL)=33H=’3’ 。 OR AL,30H ;(AL)=33H

4、XOR(Logical exclusive or)逻辑“异或”指令 格式:XOR dst , src ;B/W(dst)  (dst)  (src) dst: 寄存器、存储器。 src: 立即数、寄存器、存储器。 执行的操作:对指令的两个操作数进行按位“异或”运算;二位不相同时为1, 相同时为0。 注意: “异或”指令中操作数不能同时为存储器。 举例: XOR DI, 23F6HH ; 寄存器  立即数 XOR SI , DX ;寄存器  寄存器 XOR CL , BUFFER ; 寄存器  存储器 XOR MEM[BX],AX ;存储器  寄存器 XOR byte ptrTABLE[BP][SI], 3DH ; 存储器  立即数

用途:(1)使操作数清0,同时清CF , 自己与自己“异或”,操作数清0,CF=0 影响标志位: CF=0F=0, AF未定义 , SF ZF PF ↕  ↕   ↕ 用途:(1)使操作数清0,同时清CF , 自己与自己“异或”,操作数清0,CF=0 例: XOR AL,AL ;(AL)=0,CF=0 (2)对某些特定位求反时,这些特定位与“1”  ; 让某些位保持不变时,这些位与“0”  。 例:将(AL)中的第1、3、5、7位求反, 0、2、4、6位保持不变。 MOV AL, 0FH XOR AL,0AAH

(3)异或指令常用于判断两个操作数是否相等。 例:测试(AL)中的值是否等于33H。 XOR AL, 33H JZ MATCH 比较三条(AX)清“0”指令: XOR AX , AX ; 清AX , 清CF,2个字节,3个T。 SUB AX, AX ;清AX , 清CF,2个字节,3个T。 MOV AX , 0 ;清AX ,不影响标志位, 3个字节,4个T。 XOR清“0”指令在多字节累加程序中十分有用。

5、NOT(Logical not )逻辑“非”指令 格式: NOT dst ;B/W 指令操作数只有一个,指令对操作数按位求反。 执行操作: 字节求反:(dst)0FFH-(dst) 字求反: (dst)  0FFFFH-(dst) 源操作数:寄存器、存储器。不能是立即数。 影响标志位:对标志位无影响。 例: NOT CX ;16位寄存器求反 NOT BYTE PTR [BP] ;8位存储器求反 例: NOT AL 执行前(AL)=00111100B, 执行后(AL)=11000011B

综合举例: 1.使某些位置“0”。 2. 使某些位置“1”。 3. 使某些位求反。 IN AL,61H;(AL)=×××× ×× × ×B ↑设备控制寄存器 ↑想使此位为0 执行指令: AND AL,0FDH 即可。 2. 使某些位置“1”。 IN AL,61H;(AL)=×××× ××××B 执行指令: OR AL,02 ↑想使此位为“1” 3. 使某些位求反。 IN AL,61H ;(AL)= × × × × × × 0 × XOR AL,02H ⊕ 0 0 0 0 0 0 1 0 × × × × × × 1 ×

逻辑指令应用小结: (1)AND指令用来对指令的指定位清“0”。 (2)OR指令常用来对某些位置1。 (3)XOR指令用在程序开头,使某个寄存器清“0”;还常用来对某些位取反。 (4)NOT指令对某个数据取反,+1成补码。 (5)TEST指令用来检测指定位为1,还是0。

(二)移位指令 (8086有8条移位指令) 1、 算逻移位指令( 4条 ): SHL , SHR, SAL , SAR 。 (1)、 SHL/SAL(Shift logical left/shift arithmetic left) 逻辑左移/算术左移指令 (2)、SHR (Shift logical right ) 逻辑右移指令 (3)、SAR (Shift arithmetic right )算术右移指令 2、循环移位( 4条): ROL, ROR , RCL, RCR。 (1)、ROL (Rotate left ) 不含CF循环左移指令 (2)、ROR (Rotate right ) 不含CF循环右移指令 (3)、RCL (Rotate left through carry )含CF循环左移指令 (4)、RCR (Rotate right through carry )含CF循环右移指令

共同点: 所有移位指令都可以作B/W操作。 指令中的 dst : 寄存器、存储器寻址方式。 cnt : 表示移位次数 cnt=1,1可写在指令中,不能是1以外的常数。 cnt>1,用CL存放移位次数 ,不能是其他寄存器。 如: SAL AX,1 MOV CL,4 SAL AX,CL 利用移位指令编制乘除程序,执行时间比直接用乘除指令快, 速度可提高5-6倍。

标志位设置: 算逻移位指令: 循环移位指令:SF、ZF、PF、AF不影响。 执行多次移位指令后对CF、OF的影响: 移位后最高位的值被改变, OF = 1; 否则,无变化时,OF = 0, CF根据各条指令的规定设置。 SF、ZF、PF,AF无定义。 ↕ ↕ ↕ 循环移位指令:SF、ZF、PF、AF不影响。 OF、CF影响情况在指令中讲: ROL、 RCL影响标志OF、CF情况相同 ; ROR 、 RCR影响标志OF、CF情况相同 。

1、 算逻移位指令 4条 : SHL , SHR, SAL , SAR (1)、 SHL/SAL(Shift logical left/shift arithmetic left) 逻辑左移/算术左移指令 格式: SHL dst ,cnt ;逻辑左移指令, B/W SAL dst ,cnt ;算术左移指令, B/W dst : 寄存器、存储器寻址方式。 cnt : 表示移位次数 cnt=1,1可写在指令中。 cnt>1,用CL存放移位次数 。

SHL/SAL指令操作示意图如下图所示: 执行操作:相当于无符号数×2功能。 SHL/SAL指令操作示意图如下图所示: 指令格式举例: SHL AH,1 SAL SI, CL SAL WORD PTR [BX+5] ,1 SHL BYTE PTR , CL dst CF

(2)、SHR (Shift logical right )逻辑右移指令 格式: SHR dst ,cnt ;逻辑右移指令, B/W 执行操作:相当于无符号数÷2功能。 SHR指令操作示意图如下图所示: dst CF dst : 寄存器、存储器寻址方式。 指令格式举例: SHR BL , 1 SHR AX , CL SHR BYTE PTR [DI+BP],1 SHR WORD PTR BLOCK ,CL

(3)、SAR (Shift arithmetic right )算术右移指令 格式: SAR dst ,cnt ;算术右移指令, B/W 执行操作:相当于带符号数÷2功能,对负数向下舍入 IDIV指令对负数向上舍入。(下页解释) SAR指令操作示意图如下图所示 dst dst : 寄存器、存储器寻址方式。 指令格式举例:SAR AL , 1 SAR DL , CL SAR WORD PTR TABLE[SI],1 SAR BYTE PTR STATUS ,CL

用SAR指令与用IDIV指令做除法的区别: MOV AX , 81H ; (AX) = -127 SAR AX , 1 ; (AX)= - 64 用IDIV指令做除法(IDIV指令对负数向上舍入) : MOV AX , 81H ;(AX)= -127 MOV CL , 2 IDIV CL ;(AL)= -63 ,(AH)= -1

应用举例: (BX)=84F0H SHR BX,1 ; (BX)=4278 CF=0,OF=1,SF=0,ZF=0 MOV CL,02H 或SAR BX,1 SAR BX,CL SAR BX,1 ; CF=0,OF无意义,SF=1,ZF=0

共同点: 影响标志OF、CF 2、循环移位 4条: ROL, ROR , RCL, RCR。 ROL、ROR 不含CF循环移位指令,操作数移动8次后还原。 RCL、 RCR 含CF循环移位指令,操作数移动9次后还原。 影响标志OF、CF ROL、 RCL影响标志OF、CF情况相同 ; ROR 、 RCR影响标志OF、CF情况相同 。 SF、ZF、PF、AF不影响。

(1)、ROL (Rotate left )不含CF循环(小循环)左移指令 格式: ROL dst ,cnt ;不含CF循环左移指令, B/W 执行操作:ROL指令操作示意图如下图所示 移动8次后操作数还原。 dst CF 指令格式举例: ROL BH , 1 ROL DX , CL ROL WORD PTR TABLE[DI],1 ROL BYTE PTR ALPHA ,CL

影响标志OF、CF 情况: 左循环移动1次后: 左循环移动多次后: 移位后,最高有效位(符号位)是否发生变化, 如果移位后,最高有效位发生变化则: OF = 1, 否则(无变化时)OF = 0。 CF根据各条指令的规定设置。 左循环移动多次后: OF 值不定。 CF=从目标操作数移出的最后一位。 SF、ZF、PF、AF不影响。

(2)、ROR (Rotate right )不含CF循环(小循环)右移指令 格式: ROR dst ,cnt ;不含CF循环右移指令, B/W 执行操作:ROR指令操作示意图如下图所示 右移8次后操作数还原。 dst CF 指令格式举例: ROR CX , 1 ROL BH , CL ROL BYTE PTRBETA , 1 ROL WORD PTR COUNT , CL

影响标志OF、CF 情况: 右循环移动1次后: CF根据各条指令的规定设置。 右循环移动多次后: OF 值不定。 如果移位后,最高有效位发生变化则, OF=1; 否则 : OF=0。 CF根据各条指令的规定设置。 右循环移动多次后: OF 值不定。 CF=从目标操作数移出的最后一位。 SF、ZF、PF、AF不影响。

(3)、RCL (Rotate left through carry )含CF循环(大循环)左移指令 格式: RCR dst ,cnt ;含CF循环左移指令, B/W 执行操作:RCL指令操作示意图如下图所示, 左移9次后操作数还原。 dst CF 指令格式举例: RCL BX , 1 RCL DL , CL RCL BYTE PTR ARRAY[DI] , 1 RCL WORD PTR [SI+BP] , CL 影响标志:RCL 与ROL 影响标志OF、CF情况相同

(4)、RCR (Rotate right through carry )含CF循环(大循环)右移指令 格式: RCR dst ,cnt ;含CF循环左移指令, B/W 执行操作:RCR指令操作示意图如下图所示, 右移9次后操作数还原。 dst CF 指令格式举例: RCR DI, 1 RCR SI , CL RCR WORD PTR[SI+BX+3], 1 RCL BYTE PTRPORT, CL 影响标志:RCR 与 ROR 影响标志OF、CF情况相同

小结: 带进位循环左移移9次还原 循环右移(不带CF) 移8次还原 循环左移(不带CF) 移8次还原 执行操作 名称 指令格式 1 CL 算术右移 (带符号数÷2) 逻辑右移 (无 符号数÷2) 执行操作 名称 指令格式 SHL oprd, 1 CL 逻辑左移 (无符号数*2) CF SAL oprd, 算术左移 SHR oprd, SAR oprd, ROL oprd, ROR oprd, RCL oprd, 1 1 RCR oprd,

循环移位指令(Rotate)与移位指令(Shift)不同点: 循环移位指令移位后,操作数中原来各数位的信息不会丢失,只是移动了位置,必要时可以恢复。 循环移位指令可以对操作数进行测试。 例:测试(AL)5 =? 0 MOV CL , 3 ROL AL , CL JNC ZERO … ZERO: …

利用带进位循环移位指令将两个寄存器或存储器单元 组合起来一起移位。 例: 将DX、AX组合起来构成32位寄存器向左移一位。 如下图所示: 32位寄存器向左移一位 程序: SHL AX , 1 RCL DX , 1

3.4.4 串操作指令(String manipulation )(自学) “串”就是内存中一段地址相连的字节或字。 串操作—对串中各项进行操作,也叫数据块操作。 8088有5种基本操作: 1、MOVS(Move string) 串传送指令 2、LODS(Load from string) 从串取指令 3、STOS (Store in to string) 存入串指令 4、CMPS(Compare string) 串比较指令 5、SCAS(Scan string) 串扫描指令

共同点: 可以只有源操作数,可以只有目标操作数,可能二者都有。 源操作数用SI 寻址,隐含DS值为段地址,可以用段跨越前缀指定其它段。 目的操作数用DI寻址,隐含ES为段地址。 每次操作对SI、DI 调整: DF=1,DI、SI自动-1 (字节)或-2(字); DF=0,DI、SI自动+1(字节)或+2(字)。 与上述指令基本配合使用前缀有: REP(Repeat)重复。 REPE/REPZ(Repeat while equal/zero) 相等/为零则重复。 REPNE/REPNZ(Repeat while not equal/not zero)不相等/不为零则重复。

分二种情况: (一) 与REP相配合工作的MOVS、STOS、LODS指令 REP 重复串操作直到(CX)=0为止 (二) 与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS指令 REPE/REPZ 当相等/为零时重复串操作 REPNE/REPNZ 当不相等/不为零时重复串操作

(一) 与REP相配合工作的MOVS、STOS、LODS指令 REP 重复串操作直到(CX)=0为止 格式:REP 串指令 串指令可为:MOVS、STOS、LODS。 MOVS(Move String) 串传送指令 LODS(Load from String) 从串取指令 STOS(Store into String) 存入串指令

REP 重复串操作执行过程: (1) 当(CX)= 0 ,结束REP, 执行REP后的下一条指令。 (2) 当(CX)≠0, (CX) (CX) -1 , (3) 执行REP后的串指令, (4) 重复(1)~(3)。 REP 执行流程图

1、MOVS(Move string)串传送 串传送有3种格式: (1) MOVS dst,src;((ES):(DI)←((DS):(SI)) MOVSB (字节);(SI)←(SI)±1,(DI)←(DI) ±1 MOVSW (字);(SI)←(SI)±2,(DI)←(DI)±2 当方向标志 CLD , DF=0时 用“+” STD , DF=1时 用“-” 该指令不影响标志位 。 如: MOVS ES:BYTE PTR [DI],DS:[SI] * MOV单指令不能完成 存储单元之间的数据传送; MOVS指令就是为解决 存储单元之间数据传送而设置的。

例: 将内存的数据段中以AREA1为首地址的100个数据,传送到附加段中的AREA2为首地址的区域。 用MOVS串操作指令编程: MOV AX,SEG AREA1 MOV DS,AX MOV AX,SEG AREA2 MOV ES,AX MOV SI,OFFSET AREA1 MOV DI,OFFSET AREA2 MOV CX,100 CLD ; DF=0,增址传送 REP MOVSB ; or MOVS ES:BYTE PTR[DI], DS:[SI]

应用MOV指令编程: MOV AX,SEG AREA1 MOV DS,AX MOV AX,SEG AREA2 MOV ES,AX MOV SI,OFFSET AREA1 ;将ARE1偏移地址→SI MOV DI,OFFSET AREA2 MOV CX,100 LOOP1:MOV AL,[SI] ; (AL)←((DS):(SI)) MOV ES:[DI],AL ;((ES):(DI))←(AL) INC SI INC DI DEC CX JNE LOOP1

归纳:在执行MOVS指令时,应该先做好以下准备工作 (1) 数据段中源串首地址(或反向传送末地址)存入SI寄存器中。 (2) 附加段中目的串首地址(或反向传送末地址)存入DI寄存器中。 (3) 数据串长度存入CX寄存器。 (4) 建立方向标志 建立方向标志介绍两条指令: · CLD(clear direction flag) 功能:DF=0,执行串处理指令时 可以使地址自动+1或+2。 · STD(set direction flag) 功能:DF=1,执行串处理指令时可以使地址自动-1或 -2。

2、LODS(Load from string) 从串取指令 从串取指令有3种格式: LODS src;(字节)(AL) ((DS):(SI)), (SI) (SI) ±1 (字)(AX) ((DS):(SI)),(SI)  (SI)±2 LODSB (字节);(AL) ((DS):(SI)),(SI) (SI) ±1 LODSW (字) ;(AX) ((DS):(SI)),(SI)  (SI)±2 功能:该指令把由(SI)指定的数据段中某单元内容  (AL) 或 (AX)中。 DF=0,(SI)← (SI)+1或+2 DF=1,(SI) ←(SI)-1或-2

LODS应用注意: (1) 指令允许用段跨越前缀来指定非数据段的存储区。 (2) 该指令不影响标志位。 一般说来, (1) 指令允许用段跨越前缀来指定非数据段的存储区。 (2) 该指令不影响标志位。 一般说来, 它不与REP联用,每重复一次,累加器的内容就改变一次。 (AL)中只能保持最后一个元素。 当缓冲区中的一串字符需要多次取出测试时可用本指令。 适用于在一个循环中,用基本串操作指令构成复杂串操作时很有用。

3 、 STOS(Store into string) 存入串指令 将(AL)或(AX)  ((ES):(DI)),(DI) ±1或±2(DI) 存入串指令有3种格式: STOS dst;(字节) ((ES):(DI))  (AL) , (DI) (DI) ±1 (字) ((ES):(DI))  (AX) , (DI) (DI) ±2 (2) STOSB (字节); ((ES):(DI))  (AL) , (DI) (DI) ±1 (3) STOSW (字) ; ((ES):(DI))  (AX) , (DI) (DI) ±2 用途: 与REP联用时,(CX)←缓冲区长度。用来建立一串相同的值。

例:在附加段STORE开始存5个空格 程序: MOV AL,20H ;‘ ’  (AL) MOV CX,5 MOV DI,offset STORE CLD REP STOSB ;((ES):(DI))  (AL) (DI)  (DI)+1

例:内存中有一个首地址为BLOCK补码表示的有符号数的数据块。 要求将正、负数分开,分别存于二个缓冲区: LODS,STOS指令应用 例:内存中有一个首地址为BLOCK补码表示的有符号数的数据块。 要求将正、负数分开,分别存于二个缓冲区: 存放正数的缓冲区首址为PLUS-DATA, 存放负数的缓冲区首址为MINUS-DATA。 设: 源数据块用SI寻址, 正数的目的区用DI寻址, 负数的目的区用BX寻址。 循环次数  ( CX )。

传送过程: 用LODS指令把源数据取入(AL)中, 检查其符号,确定正、负, 若为正数用STOS指令送至正数缓冲区, 若是负数,把(DI)与(BX)交换,仍使用STOS传送, 传送完后再将(DI)与(BX)交换,恢复原值。

程序:START: MOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS-DATA ; 正数缓冲区 MOV BX,OFFSET MINUS-DATA ;负数缓冲区 MOV CX,COUNT CLD GOON:LODS B TEST AL,80H JNZ MINS ;若负数转MINS STOS B ;正数 ,(DI)←(AL),(DI)←(DI)+1 JMP AGAIN MINS: XCHG BX,DI STOSB ;负数 ,(DI)←(AL),(DI)←(DI)+1 XCHG BX,DI AGAIN:DEC CX JNZ,GOON HLT

(二) 与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS指令 1、CMPS(Compare string ) 串比较指令 2、SCAS (Scan string ) 串扫描指令,搜索指令

执行过程: 注意: REPZ执行流程 ◆ (CX)减1操作不影响标志 ◆ ZF标志由串操作决定 ◆ 当 (CX) = 0或ZF=0时退出循环 当(CX)= 0 , 结束REPZ, 执行REPZ下一条指令; (2) 当(CX)≠0,将CX 的内容减1, 执行REPZ后的串指令; (3) 当ZF = 1, 返回 (1) ; (4) 当ZF≠1, 则结束REPZ 执行REPZ下一条指令。 注意: ◆ (CX)减1操作不影响标志 ◆ ZF标志由串操作决定 ◆ 当 (CX) = 0或ZF=0时退出循环 REPZ执行流程

REPNE/REPNZ 当不相等/不为零时重复串操作 格式:REPNE(或REPNZ)string primitive REPNZ前缀: 当不相等重复 串指令可为 : CMPS , SCAS 1、CMPS(Compare string ) 串比较指令 2、SCAS (Scan string ) 串扫描指令,搜索指令

执行过程: 注意: REPNZ执行流程 ◆ (CX)减1操作不影响标志 ◆ ZF标志由串操作决定 当(CX )= 0 , 结束REPNZ, 执行REPNZ下一条指令。 (2) 当(CX)≠0,将CX 的内容减1, 执行REPNZ后的串指令。 当ZF = 0, 返回(1); 当ZF≠0, 则结束REPNZ, (4) 执行REPNZ下一条指令。 注意: ◆ (CX)减1操作不影响标志 ◆ ZF标志由串操作决定 ◆ 当 (CX) = 0或ZF=1时退出循环 REPNZ执行流程

1、CMPS(Compare string ) 串比较指令 (SI)—作为源串地址,(DI)—目的串地址 串比较指令有3种格式: CMPS dst,src ; CMPSB (字节); CMPSW (字); 执行操作: ((ES) :(DI) -(DS):(SI)),结果不存,置标志。 字节操作:(SI) (SI)±1,(DI)←(DI) ±1 字操作:(SI) (SI)±2,(DI) (DI)±2 注意:两数相减,只影响标志,不影响操作数。 其它操作规定与MOVS同。

REPZ CMPSB指令应用 例: 利用CMPS指令对STRING1和STRING2二个字符串进行比较,相同在RESULT 单元送00H,不同送0FFH。 MOV SI,OFFSET STRING1 MOV DI,OFFSET STRING2 MOV CX,COUNT CLD REPZ CMPSB JNZ UNMAT ;若串不同,在RESUL单元中置0FFH MOV AL,0 ; 若串相等,在RESULT单元中置00H JMP OULPT UNMAT:MOV AL,0FFH OUTPT: MOV RESULT,AL HLT

2、SCAS (Scan string ) 串扫描指令,搜索指令 (DI)—字符串起始地址,(AL)或(AX) — 关键字 串扫描指令有3种格式: 格式:SCAS dst SCASB(字节);(AL)-((ES):(DI)),(DI)(DI)±1 SCASW(字);(AX)-((ES):(DI)),(DI)  (DI)±2 注意:(AL)或(AX) - 目的串 两数相减,只影响标志,不影响操作数。 其它特性与MOVS同。

REPNE SCASB指令应用。 例:要搜索的关键字放在(AL)或(AX)中,搜索某一数据块或字符串中有无关键字,若有,把搜索次数记下来,且记录关键字地址;若搜索次数为0,表示没有要搜索的关键字。 MOV DI,0FFSET BLOCK;设置数据块地址指针 MOV CX,COUNT ;设置数据块长度 MOV AL,CHAR ; 关键字送入AL或AX REPNE SCASB ;(CX)≠0,ZF=0 继续SCASB JZ FOUND MOV DI,0 ;没有搜索到,搜索次数为0 JMP DONE FOUND:DEC DI MOV POINTR,DI ;记录关键字地址 MOV BX, OFFSET BLOCK SUB DI , BX ;把搜索次数记下来 DONE:HLT

应用举例: 例:一个数据块由大小写英文字母、数字、其他符号组成, 用CR(ASCII码0DH)结束。数据块首地址为BLOCK1。 将其传送到BLOCK2为首地址的内存区,并将英文中小 写英文字母(a~z)转换成大写英文字母(A~Z),其余不变。 分析: 大小写英文字母中相应ASCII码的关系: ‘a’~’z’相应ASCII码为: 61H~7AH ‘A’~’Z’相应ASCII码为:41H~5AH 英文中小写英文字母(a~z)转换成大写英文字母(A~Z): 只要将小写的ASCII码减去20H即可。 程序和流程图如下:

程序: 流程图 LEA SI , BLOCK1 LEA DI , BLOCK2 CLD NEXT: LODSB CMP AL , 0DH JZ DONE CMP AL , 61H JC OK CMP AL , 7BH JNC OK SUB AL , 20H OK: STOSB JMP NEXT DONE: HLT 流程图

小结:串操作指令重复前缀,操作数,地址指针 地址指针寄存器 MOVS REP 源,目标 (DS): (SI) , (ES): (DI) CMPS REPE/REPNE (DS): (SI) ,(ES): (DI) SCAS 目标 (ES): (DI) LODS 无 源 (DS): (SI) STOS

作业三(续1): 教材:P121 习题 7,8,9,13