8086汇编语言程序设计.pptx
几个概念汇编语言汇编语言源程序汇编汇编程序第1页/共56页41 8086汇编语言的语句 汇编语言由指令性语句和指令性语句组成一、指令性语句格式标号:操作码操作数1,操作数2;注释二、指示性语句格式标识符(名字)指示符(伪指令)表达式三、有关属性存储器操作数的属性有三种:段值、段内偏移量和类型。第2页/共56页42 8086汇编中的伪指令一、符号定义语句1、等值语句格式:符号名EQU表达式例:PORT EQU1234BUFFEQUPORT58MEMEQUDS:BP20HCOUNTEQUCXABCEQUAAA第3页/共56页2、等号语句格式:NUM34NUM341第4页/共56页二、变量定义语句格式:符号名DB/DW/DD表达式第5页/共56页1、定义一组数据例1:BUFFDW1234H,0ABCDH,8EHDW79DH,7B6AH2、定义一串字符例2:STRDBWelcome!3、定义保留存储单元例3:SUMDW?,?第6页/共56页4、复制操作复制操作符DUP(Duplication)可预置重复的数值例4:ALL_ZERODB0,0,0,0,0用复制操作可改为:ALL_ZERODB5DUP(0)5、将已定义的地址存入内存单元例5:LITDDCYCCYC:MOVAX,BX第7页/共56页三、段定义语句1、段定义语句格式:段名SEGMENT定位类型组合类型类别段名ENDS只需要掌握段名SEGMENT段名ENDS第8页/共56页2、段假设语句ASSUME段寄存器名:段名,3、ORG伪指令与地址计数器$ORG伪指令格式:ORG4、PUBLIC和EXTRN伪指令第9页/共56页四、过程定义语句过程名PROCNEAR/FARRET过程名ENDP第10页/共56页43 8086汇编中的运算符 一、常用运算符1、算术运算符 (加)、(减)、*(乘)、/(除)、MOD(求余)。2、逻辑运算符AND、OR、XOR、NOT第11页/共56页3、关系运算符EQ(相等)、NE(不等、)LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)。例:MOV DL,10H LT 16 例:AND AX,555 GT 222第12页/共56页二、常用的操作符4、分析操作符1)SEG操作符例:MOV AX,SEG BUFF2)OFFSET操作符 例:MOV BX,OFFSET BUFF第13页/共56页3)TYPE操作符 对于变量有3种:1 字节型;2 字型;4 双字型;对于标号有2种:1 NEAR(段内),2 FAR(段间)。例:BUFF DB 20H MOV BX,OFFSET BUFF MOV BX,01第14页/共56页4)LENGTH操作符5)SIZE操作符SIZETYPELENGTH例:BUFF DB 10DIP(?)MOV CX,LENGTH BUF MOV CX,10 MOV CX,SIZE BUF MOV CX,20第15页/共56页5、综合运算符(合成操作符)1)PTR运算符格式:类型PTR表达式例:INC WORD PTR BX 2)THIS操作符格式:THIS类型(或属性)例:FIRST EQU THIS BYTE SECOND DW 100 DUP (?)第16页/共56页44汇编语言程序设计 常用的汇编语言程序框架:DATA SEGMENT;定义数据段VAL1 DB 12H,8EH ;定义变量 DATA ENDS ;数据段结束 CODE SEGMENT;定义代码段 ASSUME DS:DATA,CS:CODE;段属性说明 START:MOV AX,DATA;初始化DS MOV DS,AX MOV AX,4C00H;返回DOS INT 21H CODE ENDS ;代码段结束 END START ;源程序结束第17页/共56页一、汇编语言程序设计基本步骤分析问题绘制流程图编写程序检查和调试二、汇编语言程序的基本结构第18页/共56页1、顺序结构第19页/共56页2、分支结构第20页/共56页3、循环结构第21页/共56页第22页/共56页4、子程序Call proc1ret第23页/共56页45 宏定义与宏调用 1、宏定义宏指令名MACROENDM2、宏调用宏指令名实元表第24页/共56页例:MULTYMACROOPR1,OPR2,RESULT;宏定义PUSHAXMOVAL,OPR1MOVAH,OPR2IMULOPR2MOVRESULT,AXPOPAXENDMDATASEGMENTXXDB12YYDB34ZZDW?MULTYXX,YY,ZZ;宏调用,实参替代虚参第25页/共56页4.6汇编语言程序设计实例 1、算术运算例题例1:在偏移首地址为ARRAY的内存储区,有100个字型数据,要求将数组的每个元素加1,试编写汇编语言程序完成该要求。DATASEGMENTARRAYDW100DUP(?);定义100个字型随机数DATAEDNSCODESEGMENTASSUMEDS:DATA,CS:CODE第26页/共56页 LEA BX,ARRAY ;设数组首地址指针 MOV CX,LENGTH ARRAY ;数组数据长AA1:INC WORD PTR BX,1 ;指定为字型数加1 ADD BX,2 ;移动地址指针 LOOP AA1 ;循环操作 完整程序请参看教材第27页/共56页例2:有两个无符号字节型数组,设数组元素个数相等,编程将数组中的对应元素相加,结果存入另一内存区。DATA SEGMENTM1DB20DUP(?)M2DB20DUP(?)M3DW20DUP(0)DATAENDSCODESEGMENT第28页/共56页LEASI,M1;设数组1的地址指针LEADI,M2;设数组2的地址指针LEABX,M3;设结果区的地址指针MOVCX,20AA1:MOVAL,SIADDAL,DIMOVBX,ALADCBYTEPTRBX+1,0;存结果的进位INCSIINCDIADDBX,2LOOPAA1第29页/共56页2、逻辑处理题例1:将寄存器AL中高、低4位交换MOVAL,0ABH MOVCL,4 ROLAL,CL;移出位补充移空位4次第30页/共56页例2:将AX中的内容按相反顺序存入BX中MOVAL,1234H MOVCX,16AA1:SHLAX,1;移出的位进到CF RCRBX,1;AX中移出的位进入BX LOOPAA1第31页/共56页3、代码转换例题例1:编程将以$结束的字符串中的小写字母改为大写字母。DATASEGMENTSTRDBheLLo,eveRyboBY!,$DATAENDS第32页/共56页LEABX,STRA1:MOVAL,BX CMPAL,$;是$符,则结束 JEDONE CMPAL,a JBNEXT;低于,则为大写字母 CMPAL,z JANEXT;高于,则不是字母 SUBAL,20H;将小写字母改为大写 MOVBX,ALNEXT:INCBX JMPA1第33页/共56页例2:十六进制数到十进制数的转换。除10取余法第34页/共56页MOVAX,4B6CHMOVCX,0;统计除法次数MOVBX,10;A1:MOVDX,0;被除数扩展为32位DIVBXPUSHDX;将转换好的数存入堆栈INCCXORAX,AX;转换直到商为0JNZA1第35页/共56页4、表格处理题例1:编程序将09的数字转换成所要求的密码明码和密码的映射关系为:01234567892716908345DATASEGMENTTABLEDB2,7,1,6,9,0,8,3,4,5;密码表VAL1DB8,4,1,7,5;被加密码(明码)VAL2DB5DUP(?)DATAENDS第36页/共56页MOVSI,OFFSETVAL1MOVDI,OFFSETVAL2MOVCX,5LEABX,TABLE;表格首地址指针A1:MOVAL,SI;取明码XLAT;转换为密码MOVDI,ALINCSIINCDILOOPA1第37页/共56页6、按数据大小排序题例1:编程序实现,从一串带符号字型数据中找出最大值。DATASEGMENTBLOCK DW 762EH,6A8BH,664AH,0B945H,85DHCOUNTEQU($BLOCK)2DATAENDS第38页/共56页LEASI,BLOCKMOVCX,COUNTMOVAX,SI;取第1个数DECCX;准备与下个数比较AA1:ADDSI,2CMPAX,SI;与下个数比较JGAA2;前一个数大,则保留下次再比MOVAX,SI;否则,取后一个数下次再比AA2:LOOPAA1第39页/共56页4.7 DOS功能调用与子程序设计 调用过程为:DOS功能调用号送AH寄存器;如果需要,按要求给定输入参数(有的不需要输入参数);写入中断指令INT21H。调用结束,按功能使用其输出参数。第40页/共56页1、单字符输入1号功能:从键盘输入1个字符输入参数:无输出参数:AL=ASCII码第41页/共56页2、单字符输出2号功能:在屏幕上显示1个字符(ASCII码)输入参数:DL=ASCII码输出参数:无例:从键盘输入两个1位十进制数,求两数之和并在屏幕上显示结果。第42页/共56页 MOVAH,1;DOS调用输入第一个数INT21HMOVBL,AL;保存输入的第一个数MOVAH,1INT21HADDAL,BL;两个ASCII码相加AAA;调整加法结果为非压缩BCD数MOVDL,ALADDDL,30H;加法结果转换成ASCII码MOVAH,2;DOS调用输出到屏幕INT21H第43页/共56页3、多字符输入0AH功能:多个字符输入到缓冲区输入参数:DS:DX=输入缓冲区首地址输出参数:DS:DX=输入字符串所在缓冲区地址第44页/共56页 4、多字符输出9号 功 能:多个字符输出到屏幕显示 输入参数:DS:DX=输出字符缓冲区首地址 输出参数:无例1:在屏幕上显示一串字符。DATASEGMENTBUFFDBHowdoyoudo?,0DH,0AH,$DATAENDS 第45页/共56页 CODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXLEADX,BUFFMOVAH,9INT21H第46页/共56页5、单字符输入/输出6号 6号DOS功能实际上是1号和2号功能的组合,当DL寄存器的内容为0FFH时,6号功能与1号功能同,即从键盘输入单个字符;而当DL寄存器中放入字符的ASCII值,它就是2号功能。第47页/共56页6、过程终止4CH号 该调用的功能是结束当前程序,并返回调用它的程序,如在DEBUG状态下运行,则返回DEBUG;如果在DOS下运行,则返回DOS。在汇编语言程序结束处放上MOV AX,4C00H和INT 21H两条指令,以利于程序执行完毕,返回操作系统控制。第48页/共56页7、子程序设计设计子程序要提供以下信息:子程序的功能调用时需要的输入参数(入口参数)调用后提供的输出参数(出口参数)子程序中所使用的寄存器(以便调用前做必要的保护)第49页/共56页例1:编写一子程序,完成一个2位十六进制数到对应的ASCII码的转换。子程序名:CONHA功能:将2位十六进制数转换成对应的ASCCII码输入参数:AL待转换的数输出参数:BX转换好的ASCII码使用寄存器:AL、AH、BX、CL第50页/共56页CONHA PROCFARMOVAH,AL;保存待转换的数ANDAL,0FH;处理十六进制数低位CMPAL,0AH;是16进制中的字母吗?JBASC1;否,转移ADDAL,07;是,先加7ASC1:ADDAL,30H;转换为ASCII码MOVBL,AL;保存转换好的低位MOVCL,4;移位控制SHRAH,CL;将原数右移,处理高位CMPAH,0AH;是16进制中的字母吗?JBASC2;否,转移ADDAH,07;是,先加7ASC2:ADDAH,30HMOVBH,AH;保存转换好的高位RETCONHAENDP第51页/共56页例2:用子程序调用形式,编写从键盘输入4位16进制数的程序。子程序名:ZH功 能:检查键盘输入错误,将键入值转换成16进制数输入参数:AL输出参数:AL 使用寄存器:BX,CX第52页/共56页 CODE SEGMENT ASSUME CS:CODE START:MOV CX,4 ;输入4次 MOV DX,CX ;转换4次 MOV BX,0 ;用BX保存输入数 RE1:MOV AH,1 ;从键盘输入 INT 21H CALL ZH ;通过子程序转换 SHL BX,CL ;组合成16进制数第53页/共56页ADD BL,AL DEC DX JNZ RE1 ;循环输入4个数 MOV AX,4C00H INT 21H第54页/共56页ZH PROC CMP AL,9 ;将ASCII码转换为16进制 JBE A2 ;键入值9(0-9)则减30H CMP AL,a ;键入值a(A-F)则减37H JB A1 SUB AL,20H ;值在a-f则先减20H,再减37HA1:SUB AL,7A2:SUB AL,30H RETZH ENDPCODE ENDS END START第55页/共56页谢谢大家观赏!第56页/共56页