微机原理与接口技术 第6章.ppt
第6章 汇编语言程序设计,用汇编语言编程属结构化程序设计。需按照结构化的思想来进行汇编程序的设计,分析题意,确定算法根据算法画出程序框图根据框图编写程序上机调试程序执行程序,按照自上而下的设计方法,设计一个汇编程序的步骤:,顺序程序 分支程序 循环程序,从结构上来讲,一般的汇编程序可分为:,Eg:从键盘输入一个字符并存储到字节变量BUF单元中.,分析:用DOS功能调用完成键入,输入 的字符保存在AL寄存器中 将AL中的内容存到定义在数据 段的变量BUF所指单元中,顺序程序设计,.486DATA SEGMENT USE16 BUF DB?DATA ENDS,源程序清单:,CODESEGMENT USE16 ASSUME CS:CODE,DS:DATABEG:MOV AX,DATAMOV DS,AXMOV AH,1INT 21H;AL=键入字符的MOV BUF,AL ASIIC码MOV AH,4CHINT 21HCODEENDSEND BEG,分支程序设计,转移指令可用来实现分支程序设计,分支程序分三种:简单分支 复合分支 多分支,简单分支 即两路分支,该分支程序结构为:,Eg:将BX寄存器的内容以二进制数格式显在屏幕上,简单分支,486CODE SEGMENT USE16 ASSUME CS:CODE BEG:MOV BX,5678H MOV CX,16 LAST:MOV AL,0 ROL BX,1 JNC NEXT MOV AL,1 NEXT:MOV AH,0EH INT 10H LOOP LAST MOV AH,4CH INT 21H CODE ENDS END BEG,源程序清单:,复合分支判断的条件是复合条件,称复合判断 复合分支程序结构为:,Eg:某科室9人,统计月收入在800900间的人数,并用十进制数显示,复合分支,分析:月收入是无符号数,对一批数处理应该用间址。,多分支判断条件后有多个出口,判断一次只能选择一个分支。多分支程序结构为:,1,例.多分支段内转移要求:键入0,转P0程序段 键入1,转P1程序段 键入9,转P9程序段,思路:用比较指令配合直接转移指令实现 CMP 键入字符,0 JE P0 CMP 键入字符,1 JE P1,用转移地址表配合间接转移指令实现,多分支,486DATA SEGMENT USE16TAB DW P0,P1,P9;汇编后自动装入相应的偏移地址MESG DB 0DH,0AH,strike 09:$DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG:MOV AX,DATA MOV DS,AXAGA:MOV AH,9 MOV DX,OFFSET MESG INT 21H MOV AH,1 INT 21H CMP AL,0 JC AGA,CMP AL,9JA AGASUB AL,30HMOVZX BX,ALADD BX,BX;2BXBXMOV SI,OFFSET TABJMP BX+SI;DS:BX+SI IPP0:P1:P9:CODE ENDS END BEG,源程序清单:,循环程序设计,循环程序的组成:循环准备 循环体 循环控制,1.循环程序的结构,Eg:假设从BUF单元开始为一个 ASCII码字符串,找出其中的最大数送屏幕显示。,循环程序设计,思路:ASC码数为无符号数,无符号数的最小数为0,486 DATA SEGMENT USE16 BUF DB QWERTYUIOP123 COUNT EQU$-BUF;统计串长度 MAX DB MAX=,?,0DH,0AH,$DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA BEG:MOV AX,DATA MOV DS,AX MOV AL,0;无符号最小数 0 AL LEA BX,BUF;串首址偏移量BX MOV CX,COUNT;串长度CX,LAST:CMP BX,AL;比较 JC NEXT MOV AL,BX;大数ALNEXT:INC BX LOOP LAST;循环计数 MOV MAX+4,AL;最大数MAX+4 单元 MOV AH,9 MOV DX,OFFSET MAX INT 21H;显示结果 MOV AH,4CH INT 21H;返回 DOSCODE ENDS END BEG,源程序清单1:,486DATA SEGMENT USE16BUF DB QWERTYUIOP123FLAG DB 1;设置串结束标志MAX DB MAX=,?,0DH,0AH,$DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG:MOV AX,DATA MOV DS,AX MOV AL,0;无符号最小数 0 AL LEA BX,BUF;串首址偏移量BXLAST:CMP BYTE PTR BX,-1;BX=串结束标志?,JE DISP;是,转 CMP BX,AL JC NEXT MOV AL,BX;大数ALNEXT:INC BX JMP LASTDISP:MOV MAX+4,AL;最大数MAX+4 单元 MOV AH,9 MOV DX,OFFSET MAX INT 21H;显示结果 MOV AH,4CH INT 21H;返回 DOSCODE ENDS END BEG,源程序清单2:,汇编程序设计举例,代 码 转 换,代码转换,常见的代码转换有:二进制数显示 二进制数十进制数显示 二进制数十六进制数显示 BCD码数二进制数,代码转换,A,Please Enter:,Please Enter:,9,=00001001B,代码转换,思路:键盘缓冲区中是键入字符的ASC码。09的ASC码为30H39H。二进制数每一位代码的判断:,本程序采用两种格式设计源程序:一种是EXE文件编程格式,另一种是COM文件编程格式。,程序框图:,.486DATA SEGMENT USE16MESG1 DB Please Enter!,0DH,0AH,$MESG2 DB-Error!$DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATABEG:MOV AX,DATA MOV DS,AX MOV AH,9 MOV DX,OFFSET MESG1 INT 21H;显示操作提示 MOV AH,1 INT 21H;等待键入 CMP AL,3AH JNC ERROR;9转 CMP AL,30H,EXE格式程序清单,JC ERROR;0转 SUB AL,30H MOV BL,AL;BL=09 的二进制数 MOV AH,2 MOV DL,=INT 21H CALL DISP MOV AH,2 MOV DL,B INT 21H JMP EXITERROR:MOV AH,9 MOV DX,OFFSET MESG2 INT 21H;显示错误信息EXIT:MOV AH,4CH INT 21H,;-DISP PROC;显示BL中的二进制数 MOV CX,8LAST:MOV DL,0 RCL BL,1 JNC NEXT MOV DL,1NEXT:MOV AH,2 INT 21H LOOP LAST RETDISP ENDPCODE ENDS END BEG,EXE格式程序清单,.486CODE SEGMENT USE16 ASSUME CS:CODE ORG 100HSTART:JMP BEGMESG1 DB Please Enter!,0DH,0AH,$MESG2 DB-Error!$BEG:MOV AH,9 MOV DX,OFFSET MESG1 INT 21H;显示操作提示 MOV AH,1 INT 21H;等待键入 CMP AL,3AH JNC ERROR;9 转 CMP AL,30H JC ERROR;0 转 SUB AL,30H,MOV BL,AL;BL=09 的二进制数 MOV AH,2 MOV DL,=INT 21H CALL DISP MOV AH,2 MOV DL,B INT 21H JMP EXIT MOV DX,OFFSET MESG2 INT 21H;显示错误信息 INT 21H,ERROR:MOV AH,9,EXIT:MOV AH,4CH,COM格式程序清单,;-DISP PROC;显示BL中的二进制数 MOV CX,8LAST:MOV DL,0 RCL BL,1 JNC NEXT MOV DL,1NEXT:MOV AH,2 INT 21H LOOP LAST RETDISP ENDPCODE ENDS END START,COM格式程序清单,问题:键入的是两位十进制数时,如何将该十进制数的二进制数显示在屏幕上?,代码转换,二.二进制数十六进制数显示,算法:,代码转换,编程技巧:,8位二进制数,截取高4位,显示,显示,截取低4位,XXXX,XXXX,XXXX,0 0 0 0,XXXX,0 0 0 0,16进制数ASC码,16进制数ASC码,代码转换,例.设从BNUM单元开始,有4个16位的二进制数,要求把它们转换成16进制数,并送屏幕显示。,程序清单.486 DATA SEGMENT USE16;1234H;5678H;1A2BH;3C4DH BUF DB 4 DUP(?),H$;输出缓冲区 COUNT DB 4 DATA ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,BEG:MOV AX,DATA MOV DS,AX MOV CX,4 MOV BX,OFFSET BNUMAGA:MOV DX,BX SAL EDX,16 CALL N2_16ASC MOV AH,9 MOV DX,OFFSET BUF INT 21H;显示一个16进数 ADD BX,2;地址加 2 LOOP AGA MOV AH,4CH INT 21H,;二进数十六进数ACSII码N2_16ASC PROC MOV SI,OFFSET BUF;输出缓冲区地址SI MOV COUNT,4LAST:ROL EDX,4 AND DL,0FH CMP DL,10 JC NEXT ADD DL,7NEXT:ADD DL,30H MOV SI,DL INC SI;地址加1 DEC COUNT;计数 JNZ LAST RETN2_16ASC ENDPCODE ENDS END BEG,EXE格式程序清单,代码转换,三.BCD码二进制数例.4位BCD码数二进制数显示,算法:设4位BCD码数列为:N3 N2 N1 N0,等值二进制数=N31000+N2100+N110+N0=(010+N3)10+N2)10+N1)10+N0,编程考虑:4位BCD码最大为9999H,等值的二进制数最大为16位(超过8位),而且D15位肯定为0分离出BCD千位N3,百位N2,十位N1,个位N0设计一个AX10+BX AX的子程序供调用,首次调用时,令AX=0,BX=N3,共调用4次,则AX中即为等值的二进制数。,486CODE SEGMENT USE16 ASSUME CS:CODENUM DW 4567H;BCD码表示BEG:MOV CX,4;4次调用 MOV AX,0AGA:ROL NUM,4 MOV BX,NUM AND BX,000FH IMUL AX,10 ADD AX,BX LOOP AGA 显示AX中的二进制数 返回DOSCODE ENDS END BEG,本例数据放在代码段!本例:因为AX的D15=0,是正的有符号数,所以可用IMUL指令,AX10+BXAX,EXE格式程序清单,代码转换,三.二进制数十进制数,方法:比较法,恢复余数法,除法,8位二进制数最大为11111111,等值的十进制数为255,比较法的关键:判断某二进制数(假设为BEN单元的内容)包含几个100,几个10,几个1,1.8位二进制数十进制数,比较法:,.486CMPDISP MACRO NN LOCAL LAST,NEXT MOV DL,0;DL清0LAST:CMP BEN,NN;比较 JC NEXT;BENNN转 INC DL;DL加1 SUB BEN,NN JMP LASTNEXT:ADD DL,30H MOV AH,2 INT 21H;显示 ENDM,CODE SEGMENT USE16 ASSUME CS:CODEBEN DB 10101110B;=174BEG:CMPDISP 100 CMPDISP 10 CMPDISP 1 MOV AH,4CH INT 21HCODE ENDS END BEG,EXE格式程序清单,代码转换,2.8位二进制数十进制数,恢复余数法(请自学)3.8位二进制数十进制数,“除权值求商”的算法分析,把11110101B十进制数245,算法:依次用权值100,10,1去除上次的余数,直到余数为0时停止。每次除法所得的商数顺序排列,即为十进制数。,例.将NUM单元中的16位二进制数,转换成十进制数显示。,思路:16 位二进制数:最大为11,其等值的十进制数为65535,故应判断NUM单元的数包含几个10000,几个1000,几个100,几个10,几个 1设计一个XXYY并显示商值的宏指令供调用,XX为32位,YY为16为二进制数。,DX,AX为被除数,486DIVIDE MACRO XX,YY MOV AX,XX MOV DX,0 MOV CX,YY;CX为除数 DIV CX;AX=商,且1010B,DX=余数 MOV AH,0EH ADD AL,30H INT 10H ENDMCODE SEGMENT USE16 ASSUME CS:CODENUM DW 65530;汇编后为二进制数BEG:DIVIDE NUM,10000 DIVIDE DX,1000,本题在代码段中设置数据,这是COM格式?EXE格式?如果改为:BEG:MOV BX,OFFSET NUM DIVIDE BX,10000 是错误的,为什么?,DIVIDE DX,100 DIVIDE DX,10 DIVIDE DX,1 MOV AH,4CH INT 21HCODE ENDS END BEG,显示一位商值,分析:,应写成:DIVIDE CS:BX,10000,程序清单,代码转换,4.8位二进制数十进制数,“除十取余”的算法分析 把11110101十进制数245,算法:N被(10)10除,商再被(10)10除,直到商数为0时止。每次所得的余数按倒序方式排列显示。,编程技巧:每次除法的余数栈,除法结束后,再从堆栈中依次弹出余数+30H屏。,8位 32位二进制数转换成十进制数,通用的除法求余框图:(书程序,自学)设N为待转换的8位32位二进制数,EAX=商,EDX=余数,且余数肯定1010B统计除法的次数,CODE SEGMENT USE16 ASSUME CS:CODEBEN DB 10101110B;=174BEG:CMPDISP 100 CMPDISP 10 CMPDISP 1 MOV AH,4CH INT 21HCODE ENDS END BEG,代码转换,.486CODE SEGMENT USE16 ASSUME CS:CODEBEN DB 10101110B;=174BEG:MOV BL,100 CALL CMPDISP MOV BL,10 CALL CMPDISP MOV BL,1 CALL CMPDISP MOV AH,4CH INT 21H,代码转换,CMPDISP PROC MOV DL,0;DL清0LAST:CMP BEN,BL;比较 JC NEXT;BEN BX 转 INC DL;DL加1 SUB BEN,BL;BEN-BXBEN JMP LASTNEXT:ADD DL,30H MOV AH,2 INT 21H;显示 RETCMPDISP ENDPCODE ENDS END BEG,代码转换,