3.第三章 8086的寻址方式和指令系统.ppt_第1页
3.第三章 8086的寻址方式和指令系统.ppt_第2页
3.第三章 8086的寻址方式和指令系统.ppt_第3页
3.第三章 8086的寻址方式和指令系统.ppt_第4页
3.第三章 8086的寻址方式和指令系统.ppt_第5页
已阅读5页,还剩128页未读 继续免费阅读

下载本文档

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

文档简介

第三章8086的寻址方式和指令系统 本章主要教学内容 指令系统的一般概念 对操作数的寻址方式 七大类指令的操作原理 指令格式及应用本章教学目的使学生掌握指令系统及其应用 教学重点 指令系统的应用教学难点 指令的寻址方式 第三章8086的寻址方式和指令系统 3 1寻址方式3 28086指令系统 3 1寻址方式 3 1 1基本概念1 指令系统与指令格式简单例子 movAX 3102H表示将16位立即数3102H送入AX累加器 指令执行后 AH 31H AL 02H 什么是指令和指令系统呢 计算机可以执行的各种操作命令称为指令 通常一条指令对应一种基本操作 例如加 减 传送 移位等 计算机所能执行的全部命令的集合即为该计算机的指令系统 计算机指令是完成特定操作的命令 CPU能直接识别和执行的指令是用二进制代码表示的 这种代码称为机器代码 计算机中的指令由操作码字段和操作数字段两部分组成 8086指令一般格式 操作码 操作数 操作数 例子 ADDAX BXINCAXHLT 1 操作码字段说明计算机要执行的具体操作 如传送 运算 移位 跳转等操作 是指令中必不可少的组成部分 2 操作数字段说明在指令执行的过程中需要的操作数 单地址指令的操作只需一个操作数 如加1指令 INCAX 大多数运算型指令都需要两个操作数 如加法指令 ADDAX BX 运算的结果送到AX中 AX称为目的操作数 BX称为源操作数 2 寻址及寻址方式的概念计算机中的指令有些不需要操作数 大多数指令采用一个或两个操作数 立即数 一般来说 操作数可以跟随在指令操作码之后 称为立即数 如 ADDAX 3000H寄存器操作数 操作数也可以存放在CPU内部的寄存器中 称为寄存器操作数 如 MOVDS AX 不允许将立即数直接送段寄存器 可用通用寄存器作中间桥梁 存储器操作数 绝大多数的操作数存放在内存储器中 称为存储器操作数 如 MOVAX 3102H 隐含段地址在DS中 不允许源和目标操作数都是存储器操作数 指令给出操作数地址信息 在执行时需要根据这个地址信息找到需要的操作数 这种寻找操作数的过程称为寻址 而寻找操作数的方法称为寻址方式 3 1 28086指令系统的寻址方式 1 立即寻址立即寻址方式中 源操作数是一个立即数 它作为指令的一部分紧跟在指令操作码之后 都存放于内存的代码段中 立即数可以是8位或16位整数 若为16位 低8位放低地址单元 高8位放高地址单元 例子 MOVAX 3102H如下图所示 操作码 02H 31H AH AL 代码段 101110000000001000110001 B80231H 2 寄存器寻址 寄存器寻址方式的操作数在指令指明的寄存器中 可以是数据寄存器 变址寄存器 段寄存器 例 MOVSI AX 2333H 2333H 将AX的内容送SI AX的内容不变 SI原内容丢失 则执行指令后 AX 2333H SI 2333H 采用寄存器寻址方式 执行指令不必访问内存取操作数 执行速度较快 SIAX 3 存储器寻址 如果操作码所需操作数存放在内存储器中 则指令中需要给出操作数的地址信息 为了提高程序的灵活性 8086指令系统提供了多种存储器寻址方式 1 直接寻址 2 寄存器间接寻址 3 寄存器相对寻址 4 基址变址寻址 5 基址 变址 相对寻址 6 与I O端口有关的寻址方式 1 直接寻址 直接寻址指令是在操作码后面直接给出操作数的16位偏移地址 与操作码一起放在内存的代码段 也是低8位在前 高8位在后 若无特别声明段超越 操作数本身默认存放在内存数据段DS中 例1 MOVAX 3102H 将数据段中偏移地址为3102H和3103H两单元内容送AX中 如 DS 2000H 则操作数物理地址为 20000H 3102H 23102H 操作码 1B 56 23102H 31H AL AH 代码段 数据段 1B 56 23103H 02H 2 寄存器间接寻址 寄存器间接寻址方式中 寄存器的内容为操作数的偏移地址EA 操作数在存储器中 间址寄存器 SI DI BX BP默认段寄存器DSSS 4个间址寄存器都允许段超越 如 ES SI 寄存器间接寻址示意图 例如 MOVAX BX 若 DS 2000H BX 1000H 操作数的物理地址 20000H 1000H 21000H 指令执行后 AX 50A0H 指令执行情况如下 2000 1000 DS BX 如果操作数所在的段是ES 指令形式 MOVAX ES BX 20000 3 寄存器相对寻址 寄存器相对寻址方式是在指令中给定一个间址寄器存名和一个8位或16位的相对位移量 两者之和作为操作数的有效地址 对BX SI DI这三个间址寄存器 指示的是数据段中的数据 而用BP作间址寄存器 则指示的是堆栈段中的数据 同寄存器间接寻址 例1 MOVAX DATA BX 偏移地址EA DATA BX 假设 DS 6000H BX 1000H DATA 08H 则操作数的物理地址 60000 1000H 08H 61008H 操作码 08 00 代码段 偏移量低字节 偏移量高字节 xx xx AH AL AX 61008 61009 60000 1000 0008 61008 DATA DS BX 数据段 例2 数据表首地址为TABLE 取数据表中的第10字节 存到AL中 编程 MOVSI 9 位移量是从0开始的MOVAL TABLE SI 第十个数偏移地址 TABLE 9B0B1B2 B9B10 TABLE 另外 以下书写格式等同 MOVAL DATA SI MOVAL DATA SI MOVAL DATA SI 4 基址 变址寻址 基址变址寻址方式是 由一个基址寄存器 BX或BP 和一个变址寄存器 SI或DI 的内容相加形成操作数的偏移地址EA 但指令中不能同时出现两个基址寄存器或两个变址寄存器 如果基址寄存器为BX 则段寄存器使用DS 如果基址寄存器用BP 则段寄存器用SS 允许段超越默认配对 BXDS BPSS 例 MOVAX BX SI 或MOVAL BX SI 设 DS 1000H BX 0010H SI 0002H 10012H 45H 10013H 10H指令执行后 AX 1045H 操作码 45 AH AL AX 10 1000 0010 0002 10012 DS BX SI 10012 10013 PA 代码段 数据段 操作数偏移地址EA计算方法如下 MOVAX BX BP XMOVAX SI DI X 但指令中不能同时出现两个基址寄存器或两个变址寄存器 同性恋是不行的吆 5 基址 变址 相对寻址 基址 变址 相对寻址方式是 指令中指定一个基址寄存器 一个变址寄存器 一个8位或16位移量 三者相加就得到操作数的偏移地址 例 MOVAX DATA BX DI 偏移地址 EA DATA BX DI 物理地址 PA DS EA默认的段寄存器仍由基址寄存器 BX BP 决定 注意 MOVAX DATA DI SI MOVAX DATA BX BP 非法 6 I O端口寻址方式 a 直接端口寻址直接端口寻址是在指令中直接给出要访问的端口地址 一般采用2位十六进制数表示 也可以用符号表示 可访问的端口范围为0 255 0 FFH 例如 INAL 25H 表示从I O端口地址为25H的 端口中取数据送到寄存器AL I O指令只有2条 IN OUT 只有累加器AL AX 才能与I O端口进行数据传送 寄存器间接寻址 端口地址由DX指定 强调 b 寄存器间接端口寻址它是把I O端口的地址先送到DX中 用DX作为间接寻址寄存器 此种方式可访问的端口范围为0 65535 0 FFFFH 例如 MOVDX 285H 将端口地址285H送到DXOUTDX AL 将AL中的内容输出到DX指定的端口 典型例题解析 目录 寄存器寻址 寄存器相对寻址 1 MOVAX 2408H源操作数 目的操作数 2 ADDBX SI 源操作数 目的操作数 寄存器间接寻址 寄存器寻址 立即寻址 3 ADC BP 100H AX源操作数 目的操作数 寄存器寻址 4 SBBVAL BP DI DX源操作数 目的操作数 寄存器寻址 相对 基址变址寻址 3 28086指令系统 8086CPU指令系统按功能可以分为以下6类指令 数据传送类指令 算术运算类指令 逻辑运算 位操作 与移位指令 串操作类指令 控制转移类指令 处理器控制类指令 目录 3 2 1数据传送类指令 1通用数据传送指令2累加器专用传送指令3地址传送指令4标志寄存器传送指令 节目 1 通用数据传送指令 1 一般传送指令MOV 2 数据交换指令XCHG 3 堆栈指令PUSH POP 1 一般传送指令MOV语句格式 MOVOPD OPS目标操作数在前 源操作数在后 功能 将源操作数传送入目的地址 源地址内容不变 即 OPS OPD 实际是一次数据的复制 下图描述了MOV指令在传送数据时允许传送的路径及类型 图MOV指令所允许的数据传送路径及类型 MOV指令的形式有如下几种 1 从通用寄存器到通用寄存器MOVreg1 reg22 立即数传送到通用寄存器MOVreg imm3 通用寄存器和存储单元之间MOVmem reg reg mem 4 立即数传送到存储单元MOVmem imm5 段寄存器与通用寄存器间的数据传送MOVseg reg或MOVreg seg6 段寄存器与存储单元间的数据传送MOVseg mem或MOVmem seg 例 存储器与寄存器间数据传送 MOVAX BUF BUF是变量 源操作数为直接寻址例 MOVAX 6000H DS段的6000H 6001H单元 AXMOVBH DI 源操作数为寄存器间接寻址MOVDI ES 3 SI 源操作数为寄存器相对寻址 使用跨段前缀MOVBP 3 BX SI 源操作数为基址加变址相对寻址MOVBUFA DL BUFA是一字节变量例 MOV DI DL 使用DS段寄存器MOV BP AX 使用SS段寄存器MOVDS BP DL 使用跨段前缀 请注意如下几中非法数据传送 1 MOVAX BL类型必须相同2 MOV BX SI 内存之间不能直接传送数据 这样做 MOVAX SI MOV BX AX3 MOVDS DATA立即数不能直接给段寄存器赋值 4 MOVDS ES段寄存器之间数据不能传送这样做 MOVAX ESOK MOVDS AX5 CS不能作为指令的目标操作数 但可以作为源操作数 6 IP不能作为指令的操作数 错 错 利用MOV指令完成内存中数据块的传送 例 把内存中首地址为MEM1的200字节送到首地址为MEM2的区域中 XXX 012 199 XX MEM1SI MEM2DI MOVSI OFFSETMEM1 源数据块首址送SIINCDIMOVDI OFFSETMEM2 目标数据块首址送DIDECCX 计数器 1MOVCX 200 数据块长度送CXJNZNEXT 不为零继续循环NEXT MOVAL SI HLT 停机MOV DI ALINCSI 2 数据交换指令XCHG语句格式 XCHGOPD OPS功能 OPD OPS 例1 寄存器与寄存器之间数据交换 MOVAX 5678H AX 5678HMOVBX 0FFFFH BX 0FFFFHXCHGAX BX AX 0FFFFH BX 5678H 例2 寄存器与存储器之间数据交换 XCHG SI DL设 SI 0230H DL 88H 0230H 44H 执行指令后 DL 44H 0230H 88H交换指令对操作数要求如下 存储器存储器 段寄存器的内容不能参加交换 字长必须相等 字字字节字节 回想一下数据传送指令MOV是有规律的呀 3 堆栈操作指令PUSH和POP1 堆栈的概念堆栈为存储器中设置的一个区域 该区域用来在微处理器执行程序调用和中断处理时保存程序返回地址和寄存器中重要数据 该区域称作堆栈段 段地址放在SS中 堆栈段是由段定义语句在存储器中定义的一个段 堆栈段容量最大为64KB 可以放在1MB内存的任意位置 堆栈指示器SP指示当前栈顶 即站顶偏移地址 堆栈中存取数据按后进先出LIFO Last in First out 原则进行 见下面示意图 栈顶SP 空单元 堆栈区 堆栈增长方向 由高地址到低地址 FFFFH 栈底 0000H SS 堆栈就像手枪的子弹匣 SP总是指向栈顶 最后压入的那颗子弹 最后压入的那颗子弹总是最先射出 堆栈示意图 明白了 64K 2 进栈指令PUSHOPS PushWordontoStack 出栈指令POPOPD PopWordoffStack ALAH ALAH SPSp SP 2 堆栈操作例 8086 PUSHAXPOPAX PUSHOPS执行过程 SP 2SPOPS低8位 SP OPS高8位 SP 1 POPOSD执行过程 SP OPD低8位 SP 1 OPD高8位 SP 2SP 为什么 想一想 sp sp 2 sp 说明 堆栈操作指令的源操作数 OPS 目的操作数 OPD 可以是 通用寄存器 数据寄存器 地址指针和变址寄存器 段寄存器 CS除外 存储单元 以上操作数类型必须是字 16位字长 例 执行如下程序 看堆栈区和寄存器内容的变化 MOVAX 9000HMOVSS AXMOVSP 0E200HMOVDX 38FFHPUSHDXPUSHAX POPDXPOPAX 38FF 9000 38 FF 90 00 9E200H 9E1FCH SS段 DHDL AHAL 38 FF 90 00 AHAL DHDL SS段 执行PUSH指令后执行POP指令后 啊 结果AX DX的内容可是张冠李戴了呀 SP SP SP SP 节目 38 FF 90 00 2 累加器专用传送指令 1 输入指令IN 输入指令用来从指定的外设寄存器取信息送入累加器 它有四种形式 语句格式 INAL PORT功能 PORT AL语句格式 INAX PORT功能 PORT AX语句格式 INAL DX功能 DX AL语句格式 INAX DX功能 DX AX 2 输出指令OUT 输出指令用来把累加器的内容送往指定的外设存储器 它有四种形式 语句格式 OUTPORT AL功能 AL PORT语句格式 OUTPORT AX功能 AX PORT语句格式 OUTDX AL功能 AL DX 语句格式 OUTDX AX功能 AX DX 3 查表转换指令XLAT 语句格式 XLATtable或XLAT功能 将 BX 为首址 AL 为位移量的字节存储单元中的数据送AL寄存器 即 BX AL AL 例 内存数据段存放0 9的ASCII码转换表 首地址为tab0 现要把8转换成ASCII码 用以下指令实现 tab0DB30H 31H 32H 33H 34HDB35H 36H 37H 38H 39HLEABX tab0 表的起始地址 BXMOVAL 8 位移量 ALXLATtab0 30 31 32 38 39 tab0 3 地址传送指令共3条 LEA LDS LES 1 传送有效地址指令LEA语句格式 LEAreg16 mem源操作数mem必须是存储器单元 目标操作数必须是16位寄存器 不能是段寄存器 该寄存器常作地址指针 例1 LEABX BUFFER 将内存BUFFER偏移地址送BXMOVAX BX 将BUFFER中第一个数送AL 将BUFFER中第二个数送AH LEABX MEMMOVBX OFFSETMEM 这两条指令等价 例2 比较下面两条指令的执行结果 设 BX 1000H DS 6000H 61050H 33H 61051H 44HMOVBX BX 50H LEABX BX 50H 33 44 4433 BX BX 4433 1050 61050 61051 DS段 执行MOV指令后 执行LEA指令后 里注意 LEA MOV区别在那里 BX 4433H BX 1050H 2 传送偏移地址及数据段地址指令LDS 语句格式 LDSreg16 mem32mem32是内存中连续4个字节单元的首地址 reg16必须是基 变址寄存器 BX BP SI DI 常用SI mem32内存中存放32位 2个字 远地址指针 功能 将mem32主存中前1个字送reg16 后一字装入DS 例 设 DS 6000H 首地址60348H4个字节单元中存放32位远指针98011H 低字 8011H 高字 9000H LDSSI 0348H 将指针装入DS SIMOVAX SI 11 80 00 90 12 34 60348H SI DS 98011H AX 3412 执行结果 DS 9000H SI 8011H AX 3412H 3 传送偏移地址及附加数据段地址指令LES 语句格式 LESreg16 mem32功能 将mem32主存中前1个字送reg16 后一字装入ES 与LDS不同的是 Mem32的高地址单元存放段的地址不是送DS而是送ES reg16常用DI 4 标志寄存器传送指令 1 LAHF SAHFL LOAD 装入 F FLAGAH 语句格式 LAHFS STORE 存储 F FLAGAH功能 将标志寄存器的低8位装入AH寄存器 即 FLAGS 7 0 AH 该指令的执行对标志位无影响 D15D8 AH D0 D15 SZAPC D2 D4 D6 D7 FLAGS 语句格式 SAHF功能 将AH的内容存入标志寄存器的低8位 高8位不变 即 AH FLAGS7 0 从该指令功能可看出 SAHF为LAHF的逆过程 经常配对使用 怎样记忆 怎样记忆 2 PUSHF POPF 语句格式 PUSHF功能 将标志寄存器的内容压入堆栈 即 FLAGS SP 首先 SP 2SP 再压栈 执行指令不影响标志位 语句格式 POPF功能 将栈顶内容弹出送入标志寄存器中 即 SP FLAGS 首先出栈 再 SP 2SP POPF指令与PUSHF指令互为逆过程 在过程调用中配对使用 用来保护标志的状态 3 2 2算术运算类指令 1加法类指令2减运算指令3乘运算指令4除运算指令5BCD码调整指令 节目 1加法运算指令 1 不带进位加法指令ADD 2 带进位加指令ADC 3 加1指令INC 1 不带进位加指令ADD语句格式 ADDOPD OPS功能 将目的操作数与源操作数相加 结果存入目的地址中 源地址的内容不改变 即 OPD OPS OPD 目的操作数可以是 累加器 任一通用寄存器 存储器 源操作数可以是 立即数 累加器 任一通用寄存器 存储器 例如 ADDCL 20H ADDAX SI ADDDATA BX ALADDDX BX SI 非法指令 ADD SI BX 目的操作数与源操作数都是存储器ADDDS AX 不允许段寄存器作为操作数影响标志位 OF SF CF ZF AF PF标志位说明 CF 判别无符号数加法是否溢出 OF 判别有符号数加法是否溢出 SF 判断运算结果的符号 结果最高位为1时 SF 1 负数 不允许 2 带进位加法指令ADC语句格式 ADCOPD OPS功能 将目的操作数加源操作数再加低位进位 结果送目的地址 即 OPD OPS CF OPD ADC对操作数的规定与ADD相同 影响标志位也相同 ADC主要用于多字节加法 因为高位相加时 必须考虑低位相加时的进位 例 求2个4字节无符号数0107A379H 10067E4FH MOVAX A379H 第一个数低字MOVDX 0107H 第一个数高字MOVBX 7E4FH 第二个数低字MOVCX 1006H 第二个数高字ADDAX BX 低字相加ADCDX CX 高字相加 进位 结果 DX AX 110E21C8H 3 加1指令INC语句格式 INCOPD功能 将目的操作数加1 结果送目的地址 即 OPD 1 OPD INC指令是一个单操作数指令 操作数可以是寄存器或存储器操作数 但不能是段寄存器 也不能是立即数 如 INCBX BX 1 BX INCBYTEPTR SI SI指向的存储单元 1BYTEPTR存储器指针标志 伪指令加1指令常用于循环程序中修改地址指针和循环计数器 INC指令不影响CF 但影响其他5个标志A O Z S P 2减法运算指令 1 不带借位减法指令SUB 2 带借位减指令SBB 3 减1指令DEC 4 求负指令NEG 5 比较指令CMP 1 不带借位减法指令SUB语句格式 SUBOPD OPS功能 目的操作数减源操作数 结果存于目的地址 源地址内容不变 即 OPD OPS OPDSUB对操作数的要求及对状态标志的影响与ADD相同 例 减法运算 SUBAL BP SI AL SS段中 BP SI 单元内容 AL 2 带借位减指令SBB语句格式 SBBOPD OPS功能 目的操作数减源操作数再减低位借位CF 结果送目的地址 即 OPD OPS CF OPDSBB对操作数的要求及对状态标志的影响与SUB相同 SBB主要用于多字节减法运算 3 减1指令DEC语句格式 DECOPD功能 将目的操作数减1 结果送目的地址 即 OPD 1 OPD DEC指令是一个单操作数指令 操作数可以是寄存器或存储器操作数 对标志位的影响也与INC相同 减1指令常用于循环程序中修改循环次数 例 延时程序MOVCX 0FFFFH 送计数初值 NEXT DECCX CX 1JNZNEXT 若 CX 不等于0 转NEXT 继续循环 HLT 停机 4 取负指令NEG 求补 语句格式 NEGOPD功能 CPU进行一次0 0PD OPD 即将目的操作数的每一位求反 包括符号位 后加1 结果送目的地址 NEG对6个标志均有影响 但要记住2点 1 执行NEG后 大多数情况CF 1 只有操作数 0时 CF 0 2 当操作数 80H 128 或8000H 32768 时 执行NEG 结果不变 但OF 1 最高位有借位 次高位无借位 则溢出 其他情况OF 0 亲自动手 算算呀 5 比较指令CMP语句格式 CMPOPD OPS功能 目的操作数减源操作数 结果只设置标志位 不送入目的地址 即 OPD OPS 判断2个操作数大 小 相等的方法如下 相等关系 根据ZF 如果ZF 1 两数相等 否则不相等 大小关系 可分为有符号数和无符号数 无符号数 根据CF 如果CF 1 被减数减数 指令 JG JNLE SF OF 1 被减数 减数 指令 JL JNGE 可能 例 设AL 10110001B DL 01001010B求AL DL解 执行指令 SUBAL DL二进制减法当成无符号数当成有符号数10110001177 79 01001010 74 7401100111103 103运算后标志位 ZF 0 AF 1 CF 0 SF 0 PF 0 OF 1 若把两数当成无符号数 CF 0 表示无借位 差 103 SF 0 OF 1无意义 若把两数当成有符号数 OF 1 表明有溢出 运算结果错误 3乘法运算指令 1 无符号数乘法指令MUL 2 有符号乘指令IMUL 1 无符号数乘法指令MUL 语句格式 MULOPS功能 字节乘法 AX AL OPS OPS 8位 隐含AX AL 字乘法 DX AX AX OPS OPS 16位 隐含AX DX 例 MULBX DX AX AX BX MULDL AX AL DL MULBYTEPTR SI AX AL SI MULWORDPTR DI DX AX AX DI 1 DI 说明 要求两个操作数字长相等 且不能为立即数 若CF OF 1 说明乘积高半部分不为0 AH DX 里有乘积的有效数字 若CF OF 0 说明乘积高半部分为0 2 有符号乘指令IMUL IntegerMultiply 语句格式 IMULOPS功能 字节乘法 AX AL OPS 字乘法 DX AX AX OPS IMUL指令除计算对象是带符号二进制数外 补码 其他都与MUL一样 但计算结果不同 说明 若CF OF 1 说明乘积高半部分不为0 AH DX 里有乘积的有效数字 若CF OF 0 说明乘积高半部分为低半部分的符号扩展 该部分可以舍掉 计算对象为补码 输出结果也为补码 例 设 AL FEH CL 11H求 AL CL 无符号数 指令MULCL执行后 AX 10DEH AH 0 CF OF 1有符号数 指令IMULCL执行后 AX FFDEH 34 CF OF 0 AH 为 AL 的符号扩展 4除法运算指令 1 无符号除指令DIV 2 有符号除指令IDIV 3 符号扩展指令 1 无符号除指令DIV语句格式 DIVOPS功能 字节除法 AH 余数 AL 商 AX OPS 隐含被除数AX 字除法 DX 余数 AX 商 DX AX OPS 隐含被除数AX DX 例 DIVBL AX BL 商放 AL 余数放 AH DIVWORDPTR SI DX AX SI 1 SI 商放 AX 余数放 DX 规定 被除数字长必须是除数的2倍 字长不够 使用CBW CWD来扩展 且除数不能为立即数 若除数 0 CPU产生一个类型0中断 2 有符号除指令IDIV除操作数为有符号数外 规定 功能与DIV类似 语句格式 IDIVOPS功能 字节除法 AH 余数 AL 商 AX OPS 字除法 DX 余数 AX 商 DX AX OPS 除法指令DIV和IDIV虽然对标志的影响未定义 但可产生溢出 例 写出实现有符号数0400H 0B4H运算的程序段 MOVAX 0400H AX 0400H 1024MOVBL 0B4H BL 0B4H 76IDIVBL 商 AL 0F3H 13 余数 AH 24H 36 若用divbl 则结果是7c05H IDIV执行的结果 商和余数均为带符号数 补码存放 且余数的符号与被除数相同 3 符号扩展指令1 字节转换成字指令CBW语句格式 CBW 隐含AH AL 功能 将AL中的符号位数据扩展至AH 不影响标志位 该指令在两个字节相除前 产生一个双字节被除数 例 将字节数据扩展成字数据 MOVAL 0A5H AL A5HCBW AX FFA5HMOVAL 15H AL 15HCBW AX 0015H 2 将字转换成双字指令CWD语句格式 CWD 隐含AX DX 功能 将AX中的符号位数据扩展至DX 不影响标志位 该指令在两个字相除前 产生一个双倍长被除数 例 计算7FA2H 03DDHMOVAX 07FA2HMOVBX 03DDHCWD DX AX 00007FA2HIDIVBX 商 AX 0021H 余数 DX 0025H 5BCD码 十进制 调整指令 1 加法的十进制调整指令 DAA 压缩BCD码调整指令 AAA 非压缩BCD码调整指令 2 减法的十进制调整指令DAS DAS 压缩BCD码减法的十进制调整 AAS 非压缩BCD码减法的十进制调整 3 乘法的十进制调整指令AAM 非压缩BCD码 4 除法的十进制调整指令AAD 非压缩BCD码 1 加法的十进制调整指令i 压缩BCD码加法调整DAA 隐含AL 两个压缩BCD码相加结果在AL中 通过DAA调整得到一个正确的压缩BCD码 指令操作 调整方法 若AL的低4位 9 AF 1则 AL AL 6 AF 1若AL的高4位 9 CF 1则 AL AL 60H CF 1除OF外 DAA指令影响所有其它标志 DAA指令应紧跟在ADD或ADC指令之后 调整原理 先看一个例子例 0100100048HMOVAL 48H 0111010074HMOVBL 74H10111100BCHADDAL BL 0110011066HDAA100100010122H 进位 进位 结果应为122 而计算机相加为BCH 原因在于ADD是二进制加法 按逢十六进一的规则 但BCD码要求逢十进一 要产生正确进位 就要进行加6调正 执行ADD后 AL BCH 高4位 低4位均大于9 故DAA指令执行加66H调整 最后结果为 AL 22H CF 1 AF 1 AAA 非压缩BCD码加法的十进制调整指令语句格式 AAA 隐含AH AL 功能 AAA用于对2个非压缩BCD码相加的和 在AL中 进行调整 产生正确的非压缩BCD码 结果低位在AL中 高位在AH中 调整方法 如果AL的低4位 9或 AF 1 则 AL AL 6 AH AH 1 AL高4位清零 AF CF 1AAA只影响AF和CF标志 注意 DAA AAA只能紧跟在ADD ADC指令后面使用 指令的执行结果必须放在AL中 单独行动要犯错误的吆 2 减法的十进制调整指令DAS DAS 压缩BCD码减法的十进制调整语句格式 DAS 隐含AL 功能 DAS用于对2个压缩BCD码相减的差 在AL 中进行调整 产生正确的压缩BCD码 调整方法 如果AL低4位 9或AF 1则 AL AL 6 且使 AF 1 如果AL高4位 9或CF 1 则 AL AL 60H 且使 CF 1 对标志位影响与DAA相同 例 计算压缩BCD码 32 15 MOVAL 32HMOVBL 15HSUBAL BL 二进制减法 AL 1DH 9DAS 十进制调整 1DH 06H 实现压缩BCD码减法 32 15 17 00110010 0001010100011101011000010111 向高位借1 本该作10 对于十进制 这儿当作16 二进制 多算了 6 减掉就对了 OK AAS 非压缩BCD码减法的十进制调整语句格式 AAS 隐含AH AL 功能 AAS用于对2个非压缩BCD码相减的差 在AL 中进行调整 产生正确的非压缩BCD码 其低位在AL中 高位在AH中 调整方法 如果AL低4位 9或AF 1 则AL 6 AH 1且使AF 1 AL高4位清零 CF AF AAS对标志位影响与AAA相同注意 DAS AAS只能紧跟在SUB SBB指令后面使用 指令的执行结果必须放在AL中 AH或高字节中的数如何调整呢 都必须放在AL中 3 乘法的十进制调整指令AAM 非压缩BCD码 语句格式 AAM 隐含AH AL 功能 AAM用于对2个非压缩BCD码相乘的积 在AL中 进行调整 产生正确的非压缩BCD码 调整方法 AH AL 0AH AL AL 0AH 即把 AL 除以0AH 商放在 AH 余数放在 AL 注意 相乘的2个非压缩BCD码 必须是一位十进制数 AAM只能紧跟在MUL指令后面使用 MUL将2个非压缩BCD码相乘 BCD码总视为无符号数 影响标志位 PF SF ZF 例 用非压缩BCD码计算7 9 MOVAL 07HMOVBL 09HMULBL AX 003FH 63DAAM AX 0603H 即非压缩BCD码63 呀 原来是把二进制转换为十进制 4 除法的十进制调整指令AAD 非压缩BCD码 语句格式 AAD 隐含AH AL 功能 在2个非压缩BCD码相除之前 先用一条AAD指令 对AX 进行调整 然后再用DIV 调整方法 AL AH 10 AL AH 0影响标志位 PF SF ZF 同AAM 例 计算 MOVAX 0203H 非压缩BCD码 MOVBL 4AAD AX 02H 0AH 03H 0017H 23 10DIVBL AL 05H AH 03H 即商5余3 呀 原来是把十进制转换为二进制 节目 3 2 3逻辑运算与移位指令 1逻辑运算指令2移位指令3循环移位指令 节目 1逻辑运算指令 1 求反指令NOT 2 逻辑乘指令AND 3 测试指令TEST 4 逻辑加指令OR 5 按位加指令XOR 1 求反指令NOT语句格式 NOTOPD功能 将目的地址中的内容逐位取反后送入目的地址 说明 OPD可以是寄存器或存储器操作数 8位或16位 但不能是立即数 NOT对标志位无影响 例 逻辑非运算 NOTAXNOTBLNOTWORDPTR SI 将SI指向的 SI SI 1 两存储器单元内容按位变反 再送回这两单元 2 逻辑乘 指令AND语句格式 ANDOPD OPS功能 将目的操作数和源操作数进行逻辑乘 与 运算 结果存目的地址 即OPD OPD OPS 说明 该指令用于清除目的操作数中与源操作数置0的对应位 而源操作数置1的那些位不变 OPS可以是寄存器 存储器 立即数 OPD必须是寄存器和存储器 影响标志位 使CF OF 0 影响SF PF ZF 例 MOVAL 0FFHAL 11111111ANDAL 77H 将AL中第3位和第7位清零 01110111AL 01110111 如何设置屏蔽字 哪些位要清0 就把对应位置0 其它位置1 设置屏蔽字 3 测试指令TEST语句格式 TESTOPD OPS功能 将目的操作数和源操作数的内容执行按位的逻辑乘运算 结果不送入目的地址 与AND的唯一不同 即 OPD OPS 例 TESTAL 02H 若AL的D1位 1 则ZF 0 否则ZF 1TESTAX 8000H 若AX最高位 1 则ZF 0 否则ZF 102H00000010AL0100001100000010结果 0 ZF 0TEST常用于在不破坏目的操作数的内容的情况下 检测某些位是 0 还是 1 测试字如何设置 要测试的那位置1 其它位置0 4 逻辑加 指令OR语句格式 OROPD OPS功能 将目的操作数和源操作数按位的逻辑加 或 运算 结果存目的地址 即OPD OPD OPS 说明 用于把目的操作数的某些位置1 其它位保持不变 方法是 哪些位要置1 就把源操作数对应位置1 其它位置0 对操作数的要求及对标志位的影响同AND 例 将AL寄存器中第3位和第7位置1 AL 00000000MOVAL 0 10001000ORAL 88HAL 10001000 例 奇偶效验 传送的ASCII码1的个数为偶数 为偶效验 为奇数称奇效验 偶效验程序如下 ORAL AL 置奇偶标志JPECONTINUE 为偶跳转OR80H 原ASCII码的高位置1CONTINUE 5 按位加 异或 指令XOR语句格式 XOROPD OPS功能 目的操作数与源操作数做按位加 异或 运算 结果送入目的地址 即OPD OPD OPS 说明 按位加的运算法则为 1 1 0 1 0 1 0 1 1 0 0 0 即 异或 操作是两位相同时 结果为0 不同时结果为1 程序中常 异或 自身 使寄存器清0 对操作数的要求及对标志位的影响同AND 例 按位加运算 MOVAL 45H AL 45H01000101XORAL 31H AL 74HXOR0011000101110100 逻辑运算综合实例 例 从4000H单元开始放32个有符号数 要求统计出负数的个数 将个数存入BUFFER单元 XORDX DX 对DX清0 DX放结果MOVSI 4000H 设起始指针MOVCX 32 设计数器初值 控制查找次数AGAIN MOVAL SI 取数INCSI 指针 1TESTAL 80H 测试是否为负数 负数符号位 1 JZNEXT 不是负数 测试结果 0 转NEXTINCDX 是负数 DX 1NEXT DECCXJNZAGAIN 若CX 0 继续MOVBUFFER DX 2移位指令 移位指令包括算术移位指令 逻辑移位指令和循环移位指令 分别进行左移和右移操作 这些指令均有统一的语句格式 标号 操作符OPD 1或 标号 操作符OPD CL其功能为将目的操作数的所有位按操作符规定的方式移动1位或按寄存器CL规定的次数 0 255 移动 结果送入目的地址 目的操作数是8位 或16位 的寄存器数据或存储器数据 1 算术左移和逻辑左移指令SAL SHL语句格式 SALOPD 1或SHLOPD 1 DEBUG不认SALSALOPD CL或SHLOPD CL OPD 指寄存器或存储器操作数 功能 SAL SHL执行相同的操作 将 OPD 向左移动1位 或CL指定的次数 每左移一位 最低位补入相应的 左边最高位移入 说明 移动次数为1时 若移位后最高位与CF不同 则OF 1 否则OF 0 这用于判别移位前后符号位是否一致 另外指令还影响P S Z SAL和SHL的区别 SHL将操作数视为无符号数 OF 1 不表示左移后溢出 SAL将操作数视为有符号数 OF 1 表示左移后超出了符号数的范围 请回答 为什么 例 MOVAL 41HSHLAL 1 AL 82H CF 0 OF 1 视82H为无符号数 没溢出 若改为SALAL 1则视82H为有符号数 有溢出 每左移1位相当于 2 SAL SHL 2 算术右移指令SAR ShiftArithmeticRight 语句格式 SAROPD 1或SAROPD CL功能 将 OPD 顺序向右移动1位 或CL指定的次数 且最高位保持不变 右边最低位移入 说明 影响标志位CF OF PF SF ZF 算术右移可完成有符号数 2 SAR 例 算术右移运算 MOVBH 0F4H BH 0F4H 12 10MOVCL 2 CL 2SARBH CL BH 0FDH 3 10 CF 0该例语句 SARBH CL 实际上完成了 BH BH的运算 所以 用SAR指令可以实现对有符号数除2n的运算 n为移位次数 1111010011111010CF 011111101CF 0 3 逻辑右移指令SHR ShiftLogicRight 语句格式 SHROPD 1或SHROPD CL功能 将 OPD 顺序向右移动1位 或CL规定的次数 左边最高位补入 右边最低位移入 说明 与SHL相同 把目标操作数视为无符号数 用SHR指令可以实现对无符号数除2n的运算 n为移位次数 速度比除法指令快得多 SHR 3 循环移位指令 1 循环左移指令ROL RotateLeft 语句格式 ROLOPD 1或ROLOPD CL功能 将目的操作数的最高位与最低位连成一个环 将环中的所有位一起向左移动1位 或CL规定的次数 最高位移入CF 说明 移动次数为1时 若移位后最高位与CF不同 则OF 1 否则OF 0 这用于判别移位前后符号位是否一致 该指令只影响CF和OF ROL 2 循环右移指令ROR RotateRight 语句格式 ROROPD 1或ROROPD CL功能 将目的操作数的最高位与最低位连成一个环 将环中的所有位一起向右移动1位 或CL规定的次数 最低位移入CF 说明 移动次数为1时 若移位后最高位与次高位不同 则OF 1 否则OF 0这用于判别移位前后符号位是否一致 该指令只影响CF和OF CF 70 ROR 3 带进位的循环左移指令RCL RotatethroughCfleft 语句格式 RCLOPD 1或RCLOPD CL功能 将目的操作数连同CF标志一起向左循环移动1位 或CL规定的次数 最高位移入CF CF原值进入最低位 对标志位影响同ROL RCL 4 带进位的循环右移指令RCR RotatethroughCfRight 语句格式 RCROPD 1或RCROD CL功能 将目的操作数连同CF标志一起向右循环移动1位 或CL规定的次数 最低位移入CF CF原值进入最高位 对标志位影响同ROR RCR 移位指令综合实例 例 将AX和DX两寄存器组成一整体 使这32位数一起逻辑左移一位 SHLAX 1 CF AX 最高位RCLDX 1 DX最低位 CF CF CF D15DXD0 D15AXD0 0 实现双字DX AX逻辑左移一位 节目 3 2 4串操作类指令 串操作指令 数据传送类指令每次只能传送一个数据 若要传送大批数据就需要重复编程 这样就浪费了大量的时间和空间 为此8086提供了一组处理主存中连续存放数据串的指令 这就是串操作指令 下面流程图总结了串操作的过程 图串操作流程图 1 传送指令MOVS语句格式 MOVSB 字节串传送 MOVSW 字串传送 MOVSOPD OPS 需要段超越时用功能 将以SI为指针的源串存储单元中的一个字节 或字 传送至以DI为指针的目的地址中去 并自动修改指针 使之指向下一个字节 或字 即 DS SI ES DI 源串可用段超越前缀 指定在其它段 当DF 0时 SI 和 DI 增量 当DF 1时 SI 和 DI 减量MOVS解决了MOV指令不能直接在内存单元之间传送数据的限制 传送指令MOVS不影响标志位 例 将2000H 1200H地址开始的100个字节传送到6000H 0000H开始的内存单元中 MOVAX 2000H 设定源串段地址MOVDS AXMOVSI 1200H 设定源串偏移地址MOVAX 6000H 设定目标串段地址MOVES AXMOVDI 0 设定目标串偏移地址MOVCX 100 串长度CLD 清 0 DF 使地址指针按增量方向修改NEXT REPMOVSB 每次传送1个字节 按DF方向自动修改地址指针 REP 每次传送CX 1 直到 CX 0 REP 无条件重复前缀 无条件重复前缀 2 串比较指令CMPS语句格式 CMPSB 字节串比较 CMPSW 字串比较 CMPSOPD OPS 需要段超越时用功能 将SI所指的源串存储单元中的一个字节 或字 与DI所指的目的串中的一个字节 或字 相减 并根据相减的结果设置标志 但结果并不送回目标串 即 DS SI ES DI 修改串指针 使之指向串中的下一个元素 当DF 0时 SI 和 DI 增量 当DF 1时 SI 和 DI 减量 CMP常和条件重复前缀连用 REPE REPZ REPNE REPNZ 例 比较两字串 找出其中第一个不相等字符的地址 将该地址送BX 不相等字符送AL 字符串长为200字节 源串首址M1 目标串首址M2 LEASI M1 送源串首址LEADI M2 送目标串首址MOVCX 200CLD 地址增量REPECMPSB 字符相同或 CX 0则重复比较JESTOP CX 0 未找到不同字符转停机DECSI SI 1 指向不相等单元 Z 0 找到不同字符 MOVBX SI MOVAL SI STOP HLT 想一想 为什么 每比较一次 指针自动 1 3 串搜索指令SCAS ScanString 语句格式 SCASB 字节串搜索 SCASW 字串搜索功能 AL 字节 或AX 字 中的内容与DI所指的目的串中的一个字节 或字 相减 根据相减结果设置标志位 不改变目的操作数 即 字节操作 AL ES DI 字操作 AX ES DI 修改指针使之指向串中的下一个元素 当DF 0时 DI 增量 当DF 1时 DI 减量 例 在ES段从2000单元开始存放10个字符 寻找有无字符 A 若有记下的地址 放在DATA1 MOVDI 2000H 目的串首址送DIMOVAL A 关键字 A 送ALMOVCX 10 串长度送CXCLD 地址指针增量REPNZSCASB 没找到 A 或 CX 0继续扫描JZFOUND 找到 A 转MOVDI 0 没找到 A 使DI 0JMPDONEFOUND DECDI 恢复 A 的地址DONE MOVDATA1 DI A 的地址送DATA1 4 串装入指令LODS LoadString 语句格式 LODSB 从字节串中取数 LODSW 从字串中取数 LODSOPS功能 将SI所指的源串中的一个字节 或字 取出来送入AL 或AX 中 即 字节操作 DS SI AL 字操作 DS SI AX 修改指针SI 使它指向串中的下一个元素 当DF 0时 SI 增量 当DF

温馨提示

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

评论

0/150

提交评论