第2章指令系统及汇编语言程序设计2.18086(88)的寻址方式2.1.1决定操作数地址的寻址方式1.立即寻址2.直接寻址3.寄存器寻址4.寄存器间接寻址5.寄存器相对寻址6.基址、变址寻址7.基址、变址、相对寻址8.隐含寻址2.1.2决定转移地址的寻址方式1.段内转移2.段间转移2.28086(88)的指令系统2.2.1传送指令1.MOVOPRD1,OPRD2图2.1数据传送微型计算机原理与接口技术(第2版)22.交换指令3.地址传送指令4.堆栈操作指令图2.2堆栈操作5.字节、字转换指令6.标志寄存器传送指令7.XLAT换码指令2.2.2算术指令图2.3加减运算操作数之间的关系1.加法指令2.减法指令3.乘法指令4.除法指令5.调整指令2.2.3逻辑运算和移位指令1.逻辑运算指令2.移位指令微型计算机原理与接口技术(第2版)3图2.4SAL/SHL操作图2.5SAR操作图2.6SHR操作3.循环移位指令图2.7循环移位指令2.2.4串操作指令1.MOVS/MOVSB/MOVSW2.CMPS/CMPSB/CMPSW3.SCAS/SCASB/SCASW4.LODS/LODSB/LODSW5.STOS/STOSB/STOSW6.REP7.REPE/REPNE2.2.5程序控制指令1.无条件转移、子程序调用和返回指令2.条件转移指令微型计算机原理与接口技术(第2版)43.循环控制指令4.软中断指令及中断返回指令2.2.6处理器控制指令1.标志位操作指令2.外部同步指令微型计算机原理与接口技术(第2版)52.2.7输入输出指令1.直接寻址2.寄存器间接寻址2.3汇编语言2.3.1汇编语言的语句格式1.标号2.指令助记符3.操作数4.注解2.3.2常数2.3.3伪指令1.定义数据伪指令2.符号定义伪指令EQU3.段定义伪指令SEGMENT和ENDS4.定义段寄存器伪指令ASSUME5.定义过程的伪指令PROC和ENDP6.模块间通信的伪指令PUBLIC、EXTRN7.条件伪指令8.宏命令伪指令9.汇编结束伪指令END2.3.4汇编语言的运算符1.取值运算符SEG和OFFSET2.属性运算符微型计算机原理与接口技术(第2版)62.3.5汇编语言源程序的结构2.4汇编语言程序设计2.4.1程序设计概述2.4.2程序设计的基本方法1.顺序程序2.分支程序图2.8分支程序的基本结构图2.9选择程序结构3.循环程序微型计算机原理与接口技术(第2版)7图2.10循环控制的两种结构形式4.子程序图2.11多层子程序嵌套5.表6.DOS的功能调用2.4.3汇编语言程序举例2.4.4汇编语言程序的查错与调试1.编写源程序2.源程序输入微型机3.汇编4.连接5.调试微型计算机原理与接口技术(第2版)8图2.12程序的查错与调试过程习题2.1判断下列指令的寻址方式:MOVAX,00HSUBAX,AXMOVAX,\[BX\]ADDAX,TABLEMOVAL,ARAY1\[SI\]MOVAX,\[BX+6\]2.2若1KB的数据存放在TABLE以下,试编程序将该数据搬到NEST之下。2.3试编写10个字(16位二进制数)之和的程序。2.4某16位二进制数,放在DATA连续两单元中,试编程序求其平方根和余数,将其分别存于ANS和REMAIN中。2.5试编程序将BUFFER中的一个8位二进制数,转换为ASCII码,并按位数高低顺序存放在ANSWER之下。2.6在DATA1之下顺序存放着以ASCII码表示的千位数,现欲将其转换成二进制数,试编程序。2.7试编程序将MOLT中的一个8位二进制数乘以20,乘积放在ANS单元及其下一个单元中(用3种方法来完成)。2.8在DATA之下存放100个无符号8位数,试编程序找出其中最大的数并将其放在KVFF中。2.9在题2.8中,若要求将数据按大小顺序,试编程序。2.10在BVFF单元中有一个BCD数A,试写程序,计算Y,结果送DES单元。其中,Y=3AA20A—2020≤A6080A≥602.11在当前数据段(DS决定),偏移地址为DATAB开始的顺序80个单元中,存放着某班80个同学某门考试的成绩。①编写程序统计≥90分、80~89分、70~79分、60~69分、60分的人数各为多少,并将结果放在同一数据段、偏移地址为BTRX开始的顺序单元中。微型计算机原理与接口技术(第2版)9②试编程序,求该班这门课的平均成绩(整数部分),并放在该数据段的LEVT单元中。2.12在当前数据段(DS所决定)的DAT1和DAT2分别存放两个符号的8位数,现欲求两数差的绝对值,并将其放在DAT3中,试编程序。2.13试编程序将内存从40000H到4BFFFH的每个单元中均写入55H,并再逐个单元读出比较,看写入的与读出的是否一致。若全对,则将AL置7EH;只要有错,则将AL置81H。2.14接口03FBH的BIT5为状态标志,当该位为1时,表示外设忙;当其为0时,表示可以接收数据。当CPU向接03F8H写入一个数据时,上述标志就置1;当它变为0状态时,又可以写入下一个数据。根据上述要求,编写程序,将当前数据段偏移地址为SEDAT的顺序50个单元中的数据由接口输出。2.15在题2.14中,若要发送的数据由0AH结束,试重新编程序将包括0AH在内的,由偏移地址SEDAT开始的数据逐个发送出去。2.16若接口02E0H的BIT2和BIT5同时为1,表示外设接口02E7H有一个准备好的8位数据,当CPU从该接口读走数据后,02E0H接口的BIT2和BIT5就不再同时为1;只有当又有一个准备好的数据时,它们会再次同时为1。试编程序,从上述接口读入32个数据,顺序放在A0100H单元开始的各单元中。2.17在内存40000H开始的16KB个单元中存放一组数据,试编程序将它们顺序搬移到A0000H开始的顺序16KB个单元中。2.18在题2.17的基础上,将两个数据块逐个单元进行比较,若有错将BL置00H,全对则将BL置FFH,试编程序。2.19试编程序,统计由40000H开始的16KB个单元中所存放的字符“A”的个数,并将结果存放在DX中。2.20编写一个子程序,对AL中的数据进行偶校验,并将经过校验的结果放回AL中。2.21利用题2.20的子程序,对80000H开始的256个单元的数据加上偶校验,试编程序。