微型计算机系统原理及应用--第2章--指令系统.ppt_第1页
微型计算机系统原理及应用--第2章--指令系统.ppt_第2页
微型计算机系统原理及应用--第2章--指令系统.ppt_第3页
微型计算机系统原理及应用--第2章--指令系统.ppt_第4页
微型计算机系统原理及应用--第2章--指令系统.ppt_第5页
已阅读5页,还剩138页未读 继续免费阅读

下载本文档

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

文档简介

1 第2章微型计算机指令系统 2 1寻址方式2 28086指令系统 2 一 概述 指令 指令是指示计算机完成特定操作的命令指令系统 指令系统是计算机能够执行全部命令的集合 它取决于计算机的硬件设计 指令系统因机而异 没有通用性 3 指令格式 操作码 操作数 操作数 源操作数 指令加工之前的数据目的操作数 指令加工之后形成的数据 4 指令中的操作数表征方法 表征参加操作的数据本身立即数表征数据存放的地址 寄存器存储器 5 指令中的操作数表征方法 表征参加操作的数据本身立即数表征数据存放的地址 寄存器存储器 6 1 立即数操作数 表示参加操作的数据本身 可以是8位或16位例 MOVAX 1234H AX1234HMOVBL 22H注意 1 立即数只能用作源操作数 如MOVAL 86H MOV86H AL 2 立即数必须和其他操作数位数相等MOVAL 3456H MOVAX 34H 3 立即数不能直接送段寄存器 7 2 寄存器操作数 表示参加运算的数存放在指令给出的寄存器中 可以是16位或8位 例 MOVAX BXMOVDL CH 8 3 存储器操作数表示当前参加运算的操作数存放在内存数据区中 指令中直接或间接的给出此操作数的地址 操作数的物理地址 段地址 偏移地址 段基址 16 偏移地址段基址一般由数据段寄存器DS的内容来确定 段内偏移地址 有效地址EA 由指令的操作数部分指明 EA是不带符号的16位数 表示操作数所在地址与所在段的首址之间的字节距离 9 例 MOVAX 1200H MOVAL 1200H MOVAL BX 10 2 1寻址方式 寻找指令中操作数所在地址的方法1 立即寻址指令操作数部分直接给出指令的操作数 它与指令操作码相接 顺序存放在代码段中 11 注意 1 立即数寻址方式只能用于源操作数 主要用于给寄存器或存储单元赋值 2 立即数寻址方式不执行总线周期 执行速度快 2 寄存器寻址方式操作数放在寄存器内 由指令直接给出某个寄存器的名字 以寄存器的内容作为操作数 寄存器可以是16位的AX BX CX DX SI DI SP BP寄存器 也可以是8位的AH AL BH BL CH CL DH DL寄存器 12 例2 MOVAX CXDECAL注意 1 寄存器寻址方式的指令操作在CPU内部执行 不需要执行总线周期 执行速度快 2 寄存器寻址方式既适用于指令的源操作数 也适用于目的操作数 并且可同时用于源操作数和目的操作数 13 3 直接寻址方式操作数在存储器中 指令中直接给出操作数所在存储单元的有效地址EA 即段内偏移地址 表示操作数所在存储单元距离段首址的字节数 有效地址是一个无符号的16位二进制数 例3 MOVAH 2100H 将DS段中2100H单元的内容送给AHMOVAX 2100H 将DS段中2100H单元的内容送给AL 2101H单元的内容送给AH MOV 1000H AH DS 1000H AH 14 DS 3000HMOVAX 2000H 15 注意 1 直接寻址方式的操作数所在存储单元的段地址一般在数据段寄存器DS中 2 如果操作数在其他段 则需要在指令中用段超越前缀指出相应的段寄存器名 例4 MOVAH ES 2000H 将附加段寄存器ES的内容乘16 再加上2000H作为操作数所在存储单元的地址 取出该存储单元的内容送到寄存器AH中 16 4 寄存器间接寻址方式操作数在存储器中 指令中寄存器的内容作为操作数所在存储单元的有效地址EA 偏移地址 寄存器仅限于BX BP SI DI 当使用BX SI DI作为间址寄存器时 操作数所在存储单元的段地址存在数据段寄存器DS中 当使用BP时 操作数所在存储单元的段地址存在堆栈段寄存器SS中 17 MOVBX SI 18 例5 已知 DS 2100H DI 2000H指令 MOVAX DI 解 物理地址 16 DS DI 16 2100H 2000H 23000H指令执行结果是将23000H和23001H单元的内容送入寄存器AX中 注意 1 只有SI DI BX BP可作为间址寄存器 如MOVAX CX 2 若操作数所在存储单元不在数据段DS中 需要在指令中用段超越前缀表明其所在段的段名 19 5 变址寻址方式操作数在存储器内 指令将变址寄存器SI DI内容与指令指定的位移量之和作为操作数所在存储单元的有效地址EA 偏移地址 段地址规定为DS的内容 例7 DS 3000H SI 1000H COUNT 2000H指令 MOVAX COUNT SI 解 物理地址 16 DS SI 16位偏移量 30000H 1000H 2000H 33000H指令执行结果是将33000H和33001H单元的内容送入寄存器AX中 20 MOVAX 2 DI AX DS DI 2 MOVAX DI 2 AX DS DI 2 MOVBX COUNT SI 21 6 基址寻址方式操作数在存储器内 指令中寄存器 BX或BP 的内容与指令指定的位移量之和作为操作数所在存储单元的有效地址EA 偏移地址 使用BX时 段地址为DS的内容 使用BP时 段地址为SS的内容 22 例6 SS 2000H BP 1000H COUNT 2000H 16位偏移量 指令 MOVAX COUNT BP 解 物理地址 16 SS BP 16位偏移量 20000H 1000H 2000H 23000H指令执行结果是将23000H和23001H单元的内容送入寄存器AX中 MOVBL 2 BX 或MOVBL BX 2 DS BX 2 BL 23 7 基址加变址寻址方式操作数在存储器内 指令将基址寄存器BX BP与变址寄存器SI DI的内容之和再加上偏移量 8位或16位 得到操作数所在存储单元的有效地址EA 当使用BX时 段寄存器为DS 当使用BP时 段寄存器为SS 24 例8 已知 DS 2000H BX 1000H SI 0500H MK 1120H指令 MOVAX MK BX SI 解 物理地址 20000H 1000H 0500H 1120H 22620H指令执行结果是将22620H 22621H单元的内容送入寄存器AX中 25 MOVAX BX SI 26 例 设BX 0158H DI 10A5H 位移量 1B57H DS 2100H 求各寻址方式下 有效地址和物理地址 MOVAX 1B57H 直接寻址 MOVAX BX 寄存器间接寻址 寄存器为BX MOVAX BX 1B57H 基址寻址 有效地址 1B57H物理地址 21000H 1B57H 22B57H有效地址 0158H物理地址 21000H 0158H 21158H有效地址 0158H 1B57H 1CAFH物理地址 21000H 1CAFH 22CAFH 27 MOVAX DI 变址寻址 寄存器为DI MOVAX DI 1B57H 变址寻址 MOVAX BX DI 1B57H 基址加变址的寻址 BX为基址寄存器 DI为变址寄存器 EA 10A5H物理地址 21000H 10A5H 220A5HEA 10A5H 1B57H 2BFCH物理地址 21000H 2BFCH 23BFCHEA 0158H 10A5H 1B57H 2D54H物理地址 21000H 2D54H 23D54H 28 寻址方式举例 例 MOVAX 1000H AX 1000HMOVDS AX DS 1000HMOVAX 3000H AX 3000HMOVSS AX SS 3000HMOVAX 22A0H AX 22A0HMOVBX AX BX 22A0HMOVBP AX BP 22A0HMOVSI AX SI 22A0HMOVDI AX DI 22A0HMOVAX 22A0H AX 2010HMOVAX SS 22A0H AX 6050HMOVAX BX 100H AX 4030HMOVAX BP 100H AX 8070HMOVAX DI 100H AX 4030HMOVAX BP DI 100H AX 90H 29 2 28086的指令系统 指令系统包括九大类 133种基本指令 通过寻址方式的变化与数据形式 字节 字型 的组合 可构成上千条指令 指令系统按功能分为数据传送类 算术运算类 逻辑运算与移位类 串操作类 控制转移类 处理机控制类 本节将分别说明 目标 熟练掌握8086系统常用指令及各类寻址方式读懂简单的程序 30 2 2 1数据传送指令数据传送类指令实现CPU内部寄存器之间 CPU与存储器之间 CPU与I O端口之间的数据传送 1 通用数据传送指令包括MOV 进栈 出栈指令 交换指令和换码指令 1 一般数据传送指令MOV 8位 16位 格式 MOVOP目 OP源功能 OP源OP目要求 OP目可以是寄存器 除CS外 存储器OP源可以是寄存器 存储器和立即数 31 32 例 MOVAL BL BL寄存器的内容送ALMOVSP 2AC0H 立即数2AC0H送SPMOV DI AX AX中的16位数送DI和DI 1单元MOVSI ES BP 附加段中BP所指向的两个单元的内容送SI寄存器 33 注意 MOV指令的两个操作数 源 目的 均可采用不同的寻址方式 源操作数和目的操作数的类型必须一致不允许把立即数作目的操作数 也不允许向段寄存器直接送立即数 不允许在段寄存器之间 存储器单元之间直接传送数据 CS IP寄存器不能用作目的操作数 MOVCS AX 一般传送指令不影响标志位 34 例 判断下列指令正确与否 MOVAL BLMOVCX BXMOVDX 34HMOVES AXMOV SI CXMOV DI SI MOV2000H AXMOVDS 1234HMOVBX DLMOVCS BX 35 2 堆栈操作指令堆栈 是按 先进后出 原则工作的一段存储器区域 堆栈寄存器SS 段地址堆栈指针SP 始终指向当前栈顶所在的存储单元地址 即最新入栈数据所在的存储单元的地址 压栈操作 PUSHOP功能 把OP字数据压入栈中 结果SP 2 SP原则 高字节压在高地址 低字节压在低地址执行过程 SP SP 1 SP OPHSP SP 1 SP OPL 36 例 MOVAX 3456HPUSHAXSP 1 SP 压AH 2 SP 1 SP 压AL SP SP SP 1 SP 34 56 SP SP 1 37 出栈操作 POPOP功能 从栈中弹出数据 OP 结果SP 2 SP执行过程 OPL SP SP SP 1OPH SP SP SP 1 例 POPDX弹出AL DL SP 1 SP 2 弹出AH DH SP 1 SP SP SP SP 1 SP SP 1 38 例 将CX的内容压入堆栈 然后 弹出栈顶至CX中 已知 SS 0200H SP 0008H CX 12FAH 39 40 例 已知 AX 1122H BX 3344H SP 1010H执行指令 PUSHAXPUSHBXPOPAXPOPBX执行后AX BX SP的结果 解 执行结果为AX 3344HBX 1122HSP 1010H 41 注意 堆栈操作总是按字 16位 进行的 操作数可以是存储器 寄存器或段寄存器操作数 CS不能用于POP 不能是立即数 PUSHCS POPCS PUSH1200H POP2300H 这两条指令主要用来进行现场保护和恢复 以保证子程序调用或中断程序的正常返回 42 3 数据交换指令 8 16位 格式 XCHGOP1 OP2功能 实现OP1和OP2内容的相互交换 操作数 通用寄存器或存储器 但不能均为内存单元 注意 段寄存器和IP不能作为交换指令的操作数 例 XCHGAX BX XCHGBH BL XCHGAX 1122H XCHGDS AX XCHG SI BP XCHG SI DI 43 46 4 换码指令 查表指令 翻译指令 44 例 数据段中存放有一张16进制数的ASCII码转换表 设首地址为2000H 查表查出第10个元素 A 的ASCII码 设DS 4000H 可用如下指令实现 MOVBX 2000H BX 表首地址MOVAL 0AH AL 序号XLAT 查表转换执行后得到 AL 41H 45 2 输入输出指令CPU对外设端口有两种寻址方式 即直接寻址和间接寻址 直接寻址范围为00H FFH个端口 间接寻址范围为0000H 0FFFFH共64K个端口 间接寻址时 只能用DX作间址寄存器 1 输入指令格式 IN累加器 端口功能 把一个字节 字由输入端口传送到AL AX中 例 INAL 21H 将端口21H的8位数读到AL中INAX 21HMOVDX 201HINAL DXINAX DX 46 2 输出指令格式 OUT端口 累加器功能 把AX中的16位数或AL中的8位数输出到指定端口 例 OUT22H AL 将AL中的数传到22H端口MOVDX 511HOUTDX AX 47 3 目标地址传送指令此类指令的功能是将操作数所在存储器的地址送入目标寄存器 注意 1 OP源必须是存储器操作数 OP目必须是16位的通用寄存器 2 地址传送指令不影响状态标志位 1 取有效地址EA指令 格式 LEAOP目 OP源功能 将源操作数的有效地址EA送到目的操作数 例 LEAAX 5678H AX 5678HLEABX BP SI BX BP SI 48 符号地址 49 2 指针送寄存器和DS指令格式 LDSOP目 OP源功能 把OP源指定的4个字节内容取出 低地址的两字节 OP目 高地址的两字节 DS 例 LDSDI 2130H 2130H和2131H单元中的内容 DI 2132H和2133H单元中的内容 DS 50 3 指针送寄存器和ES指令 格式 LESOP目 OP源功能 本指令与LDS指令的操作基本相同 所不同的是将OP源4个字节中高地址的两字节 ES 例 LESDI 2130H 2130H和2131H单元中的内容 DI 2132H和2133H单元中的内容 ES 51 4 标志传送指令读取标志指令格式 LAHF AH 标志寄存器低8位特点 此指令操作结果不影响标志寄存器 2 设置标志指令格式 SAHF 标志寄存器低8位 AH特点 此指令直接为标志寄存器的低8位赋值 52 3 对标志寄存器的堆栈操作指令格式 PUSHF 将标志寄存器的值压栈 POPF 从栈顶弹出一个字送标志寄存器 特点 1 PUSHF不影响标志寄存器 而POPF直接为标志寄存器赋值 2 通常两指令成对出现 用来保护和恢复标志寄存器的内容 53 2 2 2算术运算指令8086的算术运算类指令能够对二进制或十进制 BCD码 数进行加 减 乘 除运算 操作数的数据形式可以是8位或16位的无符号数或带符号数 1 加法指令加法指令对操作数的要求与MOV指令相同 1 不带进位的加法指令 格式 ADDOP目 OP源 功能 OP目 OP源 OP目 根据结果设置标志位例 ADDAL 50H AL 50H ALADDDI SI DI SI DIADDAX DI DI 1 DI AX AXADDAX DATA BX 54 ADD BX DI AX BX DI 和 BX DI 1 2个单元的内容 AX 结果放在BX DI和BX DI 1所指单元ADDAX BX 2000H BX 2000H和BX 2001H所指单元内容和AX的内容相加 结果在AX中 注意 两操作数的类型相同 类型明确 不能同为存储器 55 例 判断下列指令正确与否ADDAL BX ADDCL CH ADDAX BX ADD BX 28 ADD BX SI ADD1000H AX ADD SI BX ADDDS BX 56 2 进位的加法指令 格式 ADCOP目 OP源 功能 OP目 OP源 OP目 CF 置标志位 CF为前面指令产生的CF 说明 主要用于多字节运算 多字节运算时低位字节产生的进位应加到高位 例 ADCAX SI AX SI CF AX例 两个双字 32位 相加 123FAB5H 0ABC212AH MOVDX 0123HMOVAX 0FAB5HADDAX 212AH 先加低字 CF 1AX 1BDFHADCDX 0ABCH 高字带进位加CF 0DX 0BE0H 57 3 加1指令格式 INCOP功能 OP OP 1说明 常用于修改偏移地址和计数次数 操作数可以是8 16位通用寄存器或存储器 不能为立即数 例 INCAL AL AL 1INCBYTEPTR BX DI BX DI BX DI 1INCWORDPTR BX DI 例 判断对错INCCL INC DI INCBYTEPTR DI INC2000H 58 注意 INC指令不影响CF位 影响标志位AF OF PF SF和ZF 操作数视为无符号数 总结 以上三条指令 ADD ADC INC 运算结果将影响状态标志位 但INC不影响标志CF 59 例 00000001 01111111 10000000以上运算可用两条指令实现 MOVAH 01HADDAH 7FH 由结果可知 CF 0OF 1ZF 0SF 1AF 1PF 0 60 BCD码 二进制编码的十进制数 又称为二 十进制数 非组合 非压缩 BCD码 用一个字节表示一位十进制数 组合 压缩 BCD码 用一个字节表示二位十进制数 61 调整原则 运算结果 9或D3 D7 向高位有进位 借位 进行加6 或减6 调整 62 4 加法的ASCII调整指令 非组合BCD码的加法调整指令 格式 AAA功能 对AL中的由两个非压缩BCD码相加的和进行调整 结果 非压缩BCD码 存于AX中 调整过程 若AL的低4位大于9或AF 1 则AL AL 6 AF 1 CF 1 AH AH 1 AL AL 0FH 清除AL的高四位 否则清除AL的高4位以及AF和CF标志 63 5 组合BCD码的加法调整指令格式 DAA功能 对AL中的由两个组合BCD码相加的和进行调整 将结果 组合BCD码 存于AL中 调整过程 调整方法与AAA类似 只是此指令要分别考虑AL的高4位和低4位 若AL低4位大于9或AF 1 则AL 6 AL 置AF 1 若AL高4位大于9或CF 1 则AL 60H AL 置AF 1注意 AAA DAA使用时必须紧跟在ADD或ADC之后 64 2 减法指令 1 不带借位的减法指令格式 SUBOP目 OP源功能 OP目 OP目 OP源 并根据结果设置标志例 SUBBX CX BX CX BXSUBAL SI 2 AL SI 2 单元中的数 ALSUB BP 2 CL 将 BP 2 单元中值 CL BP 2所指的堆栈单元中SUBAL 20 AL 20 AL 65 2 带借位的减法指令格式 SBBOP目 OP源功能 OP目 OP目 OP源 CF 根据结果设置标志说明 主要用于多字节数据相减的运算例 SBBAX 2030H AX 2030H CF AXSBBWORDPTR DI 2 1000H 将DI 2和DI 3所指两单元的内容 1000H CF 结果存在DI 2和DI 3所指的单元 66 3 减1指令格式 DECOP功能 OP OP 1 根据结果置标志位 不影响CF 说明 在循环程序中常用来修改循环次数 例 DECAX AX 1 AXDECBL BL 1 BLDECBYTEPTR DI 2 将DI 2所指单元的内容减1 结果送回此单元 67 4 取补指令格式 NEGOP功能 0 OP OP 将操作数取补后送回源操作数OP可以是8 16位通用寄存器和存储器操作数 不能为立即数 说明 利用NEG指令可以得到负数的绝对值例 NEGAL 0 AL ALMOVAX 1 AX 0001HNEGAX AX 0FFFFH 68 5 比较指令 格式 CMPOP目 OP源功能 OP目 OP源 不回送结果 只根据结果置标志位 例 CMPAX BX AX BX 根据结果置标志位CMPAL 20H AL 20H 根据结果置标志位说明 本指令主要通过比较 相减 结果置标志位 表示两个操作数的关系 指令执行的结果不影响目标操作数 用途 用于比较两个数的大小 可作为条件转移指令转移的条件 69 比较有以下几种情况 以CMPA B示例说明 1 判断两个操作数是否相等 根据ZF判断2 判断两个操作数的大小 可分两种情况 1 判断两个无符号操作数的大小 根据CF判断 70 71 P82例2 9在内存数据段从DATA开始的存储单元中分别存放了两个8位无符号数 比较大小 将大数传送到MAX单元 LEABX DATAMOVAL BX INCBXCMPAL BX JNCDONEMOVAL BX DONE MOVMAX AL 72 6 非组合BCD码的减法调整指令格式 AAS功能 对AL中由两个非组合BCD码相减的差进行调整 将结果 非组合BCD码 存于AL中 调整过程 调整方法与AAA类似 不同的是当AL的低4位 9或AF 1时 将AL 6 AL AH AH 并将AF和CF置1 清除AL的高四位 7 组合BCD码的减法调整指令格式 DAS功能 对AL中由两个组合BCD码相减所得的结果进行调整 并将结果 组合BCD码 存于AL中 调整过程 调整方法与DAA类似 不同的是当AL的低4位 9或者AF 1 则AL 6 AL 并置AF 1 而当AL的高4位大于9或者CF 1时 则AL 60H AL 并置AF 1 注意 使用AAS DAS指令必须紧跟在减法指令之后 73 例2 7 计算4609 3875 假设被加数和加数的每一位数都以ASCII码形式存放在内存中 低位在前 另留出4个存储单元 以存放结果 74 例2 7 计算4609 3875 假设被加数和加数的每一位数都以ASCII码形式存放在内存中 低位在前 另留出4个存储单元 以存放结果 流程图见P77图2 18 LEASI STR1LEABX STR2LEADI SUMMOVCX 4CLCNEXT MOVAL SI ADCAL BX AAAMOV DI ALINCSIINCDIINCBXDECCXJNZNEXT 75 例2 8 内存数据段存放了100个带符号数 首地址为AREA1 要求将各数取绝对值后存入以AREA2为首址的内存区 LEASI AREA1LEADI AREA2MOVCX 100CHECK MOVAL SI ORAL ALJNSNEXTNEGALNEXT MOV DI ALINCSIINCDIDECCXJNZCHECK 76 例2 6 有两个5字节数3B74AC60F8H 20D59E36C1H分别放在自DATA1和DATA2开始的存储区中 低字节在低地址处 编一程序段将两数相加 结果存放于从DATA1开始的单元中 MOVCX 5 循环次数MOVSI 0 偏移值CLC CF 0LPER MOVAL DATA2 SI ADCDATA1 SI ALINCSIDECCXJNZLPER 77 例2 8 内存数据段存放了100个带符号数 首地址为AREA1 要求将各数取绝对值后存入以AREA2为首址的内存区 LEASI AREA1LEADI AREA2MOVCX 100CHECK MOVAL SI ORAL ALJNSNEXTNEGALNEXT MOV DI ALINCSIINCDIDECCXJNZCHECK 复习 78 3 乘法指令 1 无符号数乘法格式 MULOP功能 AX AL OP8位数乘法 DX AX AX OP16位数乘法 2 带符号数乘法格式 IMULOP功能 操作同上 但是操作数为带符号数注意 MUL和IMUL操作数必须在寄存器或存储单元中 79 例 MULBYTEPTR BX 80 运算结果只影响CF OF 其他的无定义 例 已知AL 0FEH 视为无符号数为254 视为带符号数 数值为 2 BH 0AH 视为无符号数为10 视为带符号数 数值为 10 执行指令MULBH后AX 09ECH CF OF 1执行指令IMULBH后AX FFECH CF OF 0 MULBL AL BL AX中MULCX AX CX DXAXMULBYTEPTR DI AL DI AXIMULBX AX和BX中的两个有符号数相乘 结果在DX和AX中 81 3 非组合BCD码的乘法调整指令格式 AAM功能 对AX中的由两个非组合BCD码相乘所得的结果进行调整 并将调整后的结果存于AX中 调整过程 AH AL 0AH 商 AL AL 0AH 余数 注意 本指令必须紧跟在MUL指令之后使用 82 4 除法指令指令要求被除数是除数的双倍字长 即当除数是8 16位时 要求被除数是16 32位的二进制数 1 无符号数除法格式 DIVOP功能 2 带符号数除法格式 IDIVOP功能 操作同DIV 但是操作数为带符号数 83 注意 1 当除数是字节时 被除数必须放在AX中 当除数是字时 被除数必须放在DX AX中 2 商超出规定的范围时 将产生0号中断 3 IDIV运算结果余数的符号与被除数相同 4 带符号数除法运算中 当被除数位数不够时 则需将被除数扩展到所需的位数 8086 8088设有带符号数扩展指令 84 例 DIVCL AX CL 商 AL 余数 AHDIVWORDPTR DI DX和AX中32位数除以DI DI 1所指的16位数 商 AX 余数 DXIDIVBX DX AX BX 商 AX 余数 DXIDIVBYTEPTR DI AX中16位数除以DI所指单元中的8位数 商 AL 余数 AH 85 3 非组合BCD码的除法调整指令格式 AAD功能 把AX中的两个非组合BCD码进行调整 然后可按DIV指令实现两个非组合BCD码的除法运算调整过程 AL 10 AH AL AH 0注意 本指令必须在DIV运算前使用 例 求73 2 MOVAX 0703HMOVBL 02HAAD AX 49H 73DIVBL AL 24H AH 01HAAM AH 03H AL 06H 86 5 转换指令 符号扩展指令 字节扩展指令 8位 16位 格式 CBW功能 将AL中的符号位扩展到AH规则 若最高位 1 则执行后AH FFH若最高位 0 则执行后AH 00H字扩展指令 16位 32位 格式 CWD 功能 将AX中的符号位扩展到DX 规则 若最高位 1 则执行后DX FFFFH若最高位 0 则执行后DX 0000H这两条指令不影响标志位 87 例 分析指令执行后的结果MOVAL 44HCBWMOVAX 0AFDEHCWDMOVAL 86HCBW 结果 AX 0044H结果DX FFFFH AX 0AFDEH结果 AX FF86H 88 例 在内存中 有一个从DATA1开始的存储区 此存储区的前两个字节是一个16位带符号的被除数 第二 三字节是一个16位带符号的除数 其后的四个单元依次存放商和余数 LEABX DATA1MOVAX BX CWDIDIVWORDPTR BX 2 MOV BX 4 AXMOV BX 6 DX 89 2 2 3逻辑运算和移位指令1 逻辑运算指令OP源 8 16位通用寄存器 存储器操作数或立即数OP目 通用寄存器和存储器操作数 除 非 运算外 其余指令都会使OF CF 0 1 逻辑与运算指令格式 ANDOP目 OP源功能 对两个操作数按位进行与操作 结果回送OP目 说明 该指令常用于保留 或屏蔽 若干位二进制数例 已知AL 6 将AL中数的ASCII码转换成非压缩BCD码ANDAL 0FH AL 06H 屏蔽高4位 高位清0 保留低4位 即对应位为0则清0 对应位为1则不变 90 例 把AL中的小写字母转换成大写字母ANDAL 11011111B例 判断AL中字符是否为 y 不区分大小写 ANDAL 11011111BCMPAL Y JZYES 91 2 测试指令格式 TESTOP目 OP源功能 将OP目与OP源进行与运算 不回送结果 只根据结果置标志位 说明 主要用来检测目的操作数的某些位是1或0 根据测试结果 决定转向例 测试AX中的D15位是1还是0TESTAX 8000H 若D15为1 ZF 0 否则ZF 1例如 与 的结果最高位是1还是0 结果是否为全0 结果中1的个数是奇数还是偶数等 分别由SF ZF PF标志位体现 92 3 逻辑或运算指令格式 OROP目 OP源功能 对两个操作数进行或运算 结果回送到OP目 说明 可用于组合某个字 或将某位置1 例 MOVAX 8888H ORAX 00FFH AX 88FFH 将AX的低8位置1 其他位不变 例 将AL中的非组合BCD码转换成ASC 码 ORAL 30H 93 4 逻辑异或运算指令格式 XOROP目 OP源功能 对两个操作数进行异或运算 结果回送到OP目 说明 用于对某个二进制数按位取反或对某寄存器清0 例 XORAL 0FFH AL数据按位求反例 MOVAX 3333HXORAX 00FFH 结果 AX 33CCH AH数据保持不变 对AL数据求反 即对应0不变 对应1求反 例 寄存器清0 有4条指令可达到AX清0目的 XORAL AL AL清0MOVAX 0SUBAX AXANDAX 0 94 5 逻辑非运算指令格式 NOTOP功能 对操作数逐位取反后回送到原处 例 MOVAX 1NOTAX AX 0FFFEH注意 1 该指令只是执行求反操作 而不是求反码指令 对符号位也求反 2 不影响标志位 总结 1 ANDORXORTEST均影响标志 CF 0 OF 0 而PF SF ZF由结果而定 AF无意义 此类指令可用来清CF 常用于拆字 拼字 2 NOT不影响标志 95 例 读取端口地址为PORT的外设输入的数据 若输入的数据的第1 2 5位中的任一位不等于零 则转移到NEXT INAL PORTTESTAL 00100110BJNZNEXT NEXT 96 2 移位指令 规定 移动一位时由指令中的计数值直接给出 移动两位及以上 则移位次数由CL指定 即必须将移位位数N事先装入CL中 97 将操作数的内容左移 每移一次 最低位补0 最高位 CF 将操作数的内容右移 每移一次 最高位补0 最低位 CF 将操作数的内容右移 每移一次 最高位不变 最低位 CF 2 移位指令 算术左移与逻辑左移相同 可用于无符号数乘2操作 逻辑右移可用于无符号数除2操作 算术右移可以用于有符号数除2操作 98 算术逻辑移位指令是双操作数指令 操作数可以是除立即数之外的任何寻址方式 当计数值大于1时 必须使用CL作计数器 例 MOVBX FFFCHSARBX 1结果 BX FFFEH BX由 4变为 2 例 MOVBL 0CH BL 12SHLBL 1 BL 24 99 例 对AX中无符号数进行乘10运算 设无溢出 乘10后仍为一个字 分析 AX 10 AX 23 2 AX 2 AX 23 程序 MOVBX AXSALBX 1 原数 2 BXMOVCL 3SALAX CL 原数 23 AXADDAX BX 原数 10 AX 100 3 循环移位指令 前面指令产生的CF移至最低位 前面指令产生的CF移至最高位 101 循环移位之后 操作数中原来各数位的信息不会丢失 而只是移到了操作数中的其他位或进位标志CF上 必要时还可以恢复 利用循环移位指令可以对寄存器或存储器中的任一位进行位测试 例如要求测试AL寄存器中第5位是1还是0 MOVCL 3ROLAL CLJNCZERO 102 2 2 4串操作指令串操作指令实现对内存中地址连续的字节串或字串进行操作 在每次操作后 能自动修改地址 为下一次操作做好准备 串操作分为基本串操作指令和重复前缀指令 基本串操作指令每执行一次只能处理一个数据 与重复前缀指令结合可以处理一串数据 103 串操作有如下共同点 1 源串一般存放在数据段 DS 允许段超越 偏移地址由SI指定 目标串在附加段 ES 不允许段超越 偏移地址由DI指定 2 每执行一次串操作后自动修改指针SI DI 若方向标志DF 0 则每次操作后SI和DI自动加1 或加2 若DF 1 则每次操作后SI和DI自动减1 或减2 修改 3 串长 字或字节个数 存放在CX中 注意 在执行指令前必须DS ES SI DI DF CX置好需要的值 它们是串操作指令的隐含操作数 源串段地址 DS 目的串段地址 ES建立方向标志 CLD使DF 0 STD使DF 1 源串首地址或末地址 SI目的串首地址或末地址 DI串长度 CX 104 1 字符串串操作指令 1 字符串传送指令格式 MOVS功能 把位于数据段由SI指定的内存单元的字节 字数据传送到附加段由DI指定的内存单元 指令不影响状态标志位 过程 MOVSB ES DI DS SI SI SI 1 DI DI 1MOVSW ES DI 1 DS SI 1 ES DI DS SI SI SI 2 DI DI 2 必须说明操作数的类型 确定是字节 字传送 说明 串传送指令常与无条件重复前缀REP连用操作重复次数由CX决定 每传送完一个元素使CX减1 该指令重复执行 直至CX 0为止 105 例 将数据段中首地址为BUFFER1的200个字节的数据传送到附加段首地址为BUFFER2开始的存储区中 1 用一般传送指令实现LEASI BUFFER1 源串首地址送SILEADI BUFFER2 目的串首地址送DIMOVCX 200 串长送CXPL1 MOVAL SI 按SI所指地址取一字节MOV DI AL 按DI所指地址存一字节INCSI 源区地址加1INCDI 目的区地址加1DECCX 计数器减1JNZPL1 未传送完则继续 106 2 用串传送指令实现LEASI BUFFER1 源串首地址送SILEADI BUFFER2 目的串首地址送DIMOVCX 200 串长送CXCLD 清方向标志位 使正向传送PL1 MOVSB 串传送一字节 SI DI SI DI加1DECCX 计数器减1JNZPL1 未传送完则继续 3 用重复传送指令LEASI BUFFER1 源串首地址送SILEADI BUFFER2 目的串首地址送DIMOVCX 200 串长送CXCLD 清方向标志位 使正向传送REPMOVSB 每传送完一个元素使CX减1 若CX 0 则重复字节传送 直到CX 0 跳出循环 107 2 字符串比较指令格式 CMPS功能 把位于数据段由SI指定的字节 字数据与附加段由DI指定的字节 字数据进行比较 结果不保存 但影响状态标志位 并由DF状态决定SI DI的修改方向 过程 CMPSB DS SI ES DI SI SI 1 DI DI 1CMPSW DS SI 1 ES DI 1 DS SI ES DI SI SI 2 DI DI 2说明 串比较指令常与条件重复前缀连用 指令的执行不改变操作数 仅影响标志位 108 条件重复前缀 重复前缀REPE REPZ重复条件 比较结果相等 ZF 1 且串未结束 CX 0 则继续比较 结束条件 两串比较完 CX 0 或比较的元素不相等 ZF 0 比较结果 若两串相等 则ZF 1 否则ZF 0作用 判断两串是否完全相同 重复前缀REPNE REPNZ重复条件 比较结果不相等 ZF 0 且串未结束 CX 0 继续比较 结束条件 两串比较完 CX 0 或比较的元素相等 ZF 1 比较结果 若两串完全不相等则ZF 0 否则ZF 1 作用 判断两串是否完全不相同 109 例2 14 比较串长为20的两个字节串 找出其中第一个不相等字符的地址存放在SI DI 若两串完全相同 则给SI DI赋0 MOVSI 0FFSETSTRING1LEADI STRING2CLDMOVCX 20REPECMPSBJZALLMATCHDECSIDECDIJMPDONEALLMATCH MOVSI 0MOVDI 0DONE HLT 110 3 字符串搜索指令格式 SCAS功能 把AL AX中的内容与附加段由DI指定的一个字节 字数据进行比较 结果不保存 但影响状态标志位 并由DF状态决定DI的修改方向 过程 SCASB字节 AL DI DI DI 1SCASW字 AX DI DI DI 2 111 例2 15 在首地址为STRING的包含100个字符的字符串中寻找第一个回车符CR 找到后将其地址保留在 ES DI 中 并在屏幕上显示字符 Y 如果字符串中没有回车符 则在屏幕上显示字符 N LEADI STRINGMOVAL 0DHMOVCX 100CLDREPNESCASBJZMATCHMOVDL N JMPDSPYMATCH DECDIMOVDL Y DSPY MOVAH 02HINT21H 112 4 取字符串指令格式 LODSB AL DS SI SI SI 1LODSW AX DS SI SI SI 2功能 把位于数据段由SI指定内存单元的内容取到AL或AX中 并修改SI的内容 指向下一字节 字单元 5 存字符串指令格式 STOSB ES DI AL DI DI 1STOSW ES DI AX DI DI 2功能 把寄存器AL或AX中的内容存到附加段由DI指定的内存单元 并修改DI的内容 指向下一字节 字的存放单元 113 例2 18 一个数据块由大写或小写的英文字母 数字和各种其他符号组成 其结束符是回车符CR 数据块的首地址为BLOCK1 要求将数据块传送到以BLOCK2为首址的内存区 并将其中的所有英文小写字母转换成相应的大写字母 其余不变 LEASI BLOCK1LEADI BLOCK2CLDNEXT LODSBCMPAL 0DHJZDONECMPAL a JCOKCMPAL z JNCOKSUBAL 20HOK STOSBJMPNEXTDONE 114 注意 重复前缀指令不能单独使用 其后必须紧跟基本串操作指令 控制基本串操作指令重复执行 其执行过程相当于一个循环程序的运行 在每次重复之后 地址指针SI和DI都被修改 但指令指针IP仍保持指向带有前缀的串操作指令的地址 重复执行次数由数据串长度决定 数据串长度应预置在寄存器CX中 执行重复前缀指令不影响标志位 115 例 将20个0AAAAH送入3000H开始的地址单元 程序段如下 CLDLEADI 3000H MOVCX 14HMOVAX 0AAAAHREPSTOSW 116 1 转移指令通过修改指令的偏移地址 IP 或段地址 CS 及偏移地址 IP 实现程序的转移 2 2 5控制转移指令 117 段内转移指令 8位带符号补码数 转移范围是 128至 127 16位带符号补码数 转移范围是 32768至 32767 寄存器 程序中设定的标号 1 无条件转移指令JMP指令格式 JMPOP功能 无条件地将控制转移到目标地址去 118 例 段内间接寻址JMPBX BX中16位数据为转移有效地址EAJMPWORDPTR SI 以SI所指定的字单元中的16位数据为转移有效地址EA 119 段间转移指令 段间直接转移JMPfar label 远转移 IP 标号的段内偏移地址CS 标号的段地址JMP2000H 1000H CS 2000H IP 1000HJMPFARPTRNEXT段间间接转移JMPmem32转移的目标段地址及偏移地址存放在内存的连续4个单元之内 前两个单元为偏移地址 后两个单元为段地址 JMPDWORDPTR DI 高字送给CS 低字送给IP 120 2 条件转移指令指令格式 JccOPcc 转移条件OP 目标标号 满足条件后的目的地址指令功能 执行指令时 首先测试条件 当条件满足时 程序转移到目标标号执行 否则顺序执行下一条语句 绝大多数条件转移指令将标志位的状态作为测试的条件 因此应先执行影响有关的标志为状态的指令 如CMP TEST 之后用条件转移指令配合使用 121 122 LEABX DATA BX指向数据首址MOVAX BX 用AX暂存最大的数 DX暂MOVDX BX 存最小的数MOVCX 99 CX作计数器NEXT INCBXINCBX BX指向下一个数CMP BX AX 两数比较JGGREATER 大于AX中的数 转GREATERCMP BX DX 两数比较JLLESS 小于DX中的数 转LESSJMPGOON 不大也不小 转GOONGREATER MOVAX BX 将 BX 中大数 AXJMPGOONLESS MOVDX BX 将 BX 中小数 DXGOON DECCX 计数器减1JNZNEXT 没找完 转NEXTMOVMAX AX 找完送结果MOVMIN DX 找完送结果 例2 20 在DATA开始的存储区中存放了100个16位带符号数 找出其中最大和最小的数分别存入以MAX和MIN为首地址的内存单元 123 2 循环控制指令使用循环控制指令之前 必须在CX 计数器 中预置循环次数的初值 不影响状态标志位 主要用于数据块比较 查找关键字等操作 计数循环格式 LOOP目标标号功能 CX 1 CX 若CX 0 循环转移到目标标号 直到CX 0退出循环 124 结果不为0 不相等循环格式 LOOPNZ LOOPNE目标标号功能 CX 1 CX 若CX 0且ZF 0时 循环转移到目标标号 直到CX 0或ZF 1时退出循环 结果为0 相等循

温馨提示

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

评论

0/150

提交评论