您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第四章__汇编语言程序设计
第四章汇编语言程序设计基本要求:能熟练编写各类一般难度的程序第一节汇编语言的构成一、汇编语言格式2.操作码[标号:]操作码[操作数][;注释]LOOP:MOVA,30H;A(30H)1.标号可有可无;字母打头;字母、数字、下划线组成;不超过8位;不与操作码相同。必不可少;不可更改。3.操作数可有可无;可一可二;可以是数或地址;可二进制、十进制、十六进制或ASCII码。4.注释可有可无;可各种文字或符号。第二节伪指令1.ORG----汇编起始[标号:]ORGaddr16如:ORG2000HSTART:MOVA,#20H2.END----结束汇编[标号:]END3.EQU----赋值标号名称EQU数或汇编符号AAEQUR1K1EQU40H4.DATA----数据地址赋值标号名称DATA表达式表达式----数、地址,不可是汇编符号AADATAR45.DB、DW、DS----定义字节、字、空间[标号:]DB字节常数[标号:]DW字常数[标号:]DS表达式(预留空间数)例1ORG2000HHETA:DB50H,85H,10,15汇编以后有:(2000H)=50H(2001H)=85H(2002H)=0AH(2003H)=0FH例2分析下列程序。ORG2000HDS08HDB30H,8AH,10,’B’DW54H,1F80H6.BIT----位地址符号标号名称BIT位地址如:DBIT20.700H54H(2000H)=_____H(2008H)=_____H(200AH)=_____H(200BH)=_____H(200CH)=_____H(200DH)=_____H不定30H0AH42H第三节简单程序设计FIRSTEQU30HSECOEQU31HTHIREQU32HMOVA,20HMOVB,#64HDIVABMOVFIRST,AMOVA,BMOVB,#0AHDIVABMOVSECO,AMOVTHIR,BSJMP$ENDSJMP$即为LL:SJMPLL例3将20H单元中8位无符号数转换成3位BCD码,并分别放到FIRST(百位)、SECO(十位)和个位THIR中。一、顺序结构FIRSTDATA30HSECONDDATA31HORG0200HMOVA,20HMOVB,#64HDIVABMOVFIRST,AMOVA,BMOVB,#0AHDIVABSWAPAORLA,BMOVSECOND,ASJMP$END例4已知20H单元有一个二进制数,请编程把它转换为三位BCD数送入FIRST单元的低四位,十位和个位BCD数在SECOND单元中(十位在高位)。二、分支程序设计例5以知VAR单元内有一个自变量X,请按如下条件编程求Y,并将它存入FUNC单元的程序段。1当X0Y=0当X=0-1当X0ORG0010HVRADATA30HFUNCDATA31HMOVA,VARJZDONEJNBACC.7,POSIMOVA,#0FFHSJMPDONEPOSI:MOVA,#01HDONE:MOVFUNC,ASJMP$END例5*将例5的方程改为如下形式,设X,Y为无符号数,分别存放在地址X1和Y1中,试编写求值程序。1当X20Y=020=X=10-1当X10ORG2000HX1EQU20HY1EQU21HMOVA,X1CJNEA,#10,NEXT1NEXT1:JCLOOP1CJNEA,#21,NEXT2NEXT2:JNCLOOP2MOVY1,#00HSJMPHALTLOOP1:MOVY1,#0FFHSJMPHALTLOOP2:MOVY1,#01HHALT:SJMP$END例6将内部RAM30H开始的10个无符号字节数相加结果存入30H单元,设和不超过8位。MOVR7,#09HMOVR0,#31HMOVA,@R0LOOP:INCR0ADDA,@R0DJNZR7,LOOPMOV30H,ASJMP$例7设从内部RAM的BLOCK单元开始存放一组无符号数,数据长度存放在NUM单元,试编写程序求它们最小值,并存入MIN单元。ORG2000HBLOCKEQU31HMINEQU30HNUMEQU2FHSTART:DECNUMMOVR0,#BLOCKMOVA,@R0LOOP1:INCR0MOVB,@R0CJNEA,B,NEXTNEXT:JCLOOPMOVA,BLOOP:DJNZNUM,LOOP1MOVMIN,AEND三、循环程序设计BLOCKAB例8设内部RAM中从地址BLOCK开始存放一组无符号数,只有最后一个数为0,其余均不为0,试编程判断AAH个数,存入NUM单元ORG2000HBLOCKEQU31HNUMEQU30HMOVR0,#BLOCKMOVNUM,#00HLOOP:CJNE@R0,#00H,LOOP1SJMPHALTLOOP1:CJNE@R0,#0AAH,LOOP2INCNUMLOOP2:INCR0SJMPLOOPHALT:SJMP$END例9假设一台8051单片机的时钟频率为12MHz,要求设计一个软件延时程序,延时时间为10MS。ORG2000HMOVR6,#0AH1LOOP2:MOVR7,#2001LOOP1:NOP1NOP1NOP1DJNZR7,LOOP12DJNZR6,LOOP22END1+(1+1+1+2)*200=1001TM[1+(1001+2)*10]*TM=10031*1μs=10.031ms例10将单字节无符号二进制数(在累加器A中),转换成非压缩型BCD码。分析:单字节无符号数最大为255,因此最多可以转换成3位BCD码。入口条件:单字节无符号二进制数在累加器A中,R0中为起始结果地址。出口条件:R0中为起始结果地址,即个位BCD码的地址,R0中内容加1得高位BCD码的地址…。HEXBCD:INCR0INCR0PUSHBMOVB,#100DIVABMOV@R0,ADECR0MOVA,#10XCHA,BDIVABMOV@R0,ADECR0MOV@R0,BPOPBRET四、子程序设计例11利用上述子程序将8031单片机内部RAM的30H单元单字节无符号二进制数,转换成非压缩型BCD码,放在42H、41H、40H单元中。相关程序段如下:MOVA,30HMOVR0,40HLCALLHEXBCD:例12利用子程序技术编程,将20H—2AH,30H—3EH,40H—4FH三个子域清零.MOVSP,#70HMOVR0,#20HMOVR2,#0BHACALLZEROMOVR0,#30HMOVR2,#0FHACALLZEROMOVR0,#40HMOVR2,#10HACALLZEROSJMP$ZERO:MOV@R0,#00HINCR0DJNZR2,ZERORET例13用程序实现c=a2+b2,设a、b、c存在内部RAM的DA、DB、DC单元ORG2000HDAEQU30HDBEQU31HDCEQU32HMOVA,DAACALLSUBMOVR0,AMOVA,DBACALLSUBADDA,R0MOVDC,ASJMP$SUB:MOVDPTR,#TABMOVCA,@A+DPTRRETTAB:DB0,1,4,9,16,25,36,49,64,81,END例14求两个无符号数据块的最小值,设数据块的首地址分别为50H、60H,且第一个数据均为数据块的长度。试编程求两个数据块中的最小值,结果存入MIN单元。ORG2000HMINEQU30HMOVR0,#50HACALLSMINMOVMIN,AMOVR0,#60HACALLSMINCJNEA,MIN,NEXTNEXT:JNCHALTMOVMIN,AHALT:SJMP$MOVA,@R0LOOP1:INCR0MOVB,@R0CJNEA,B,NEXT1NEXT1:JCLOOPMOVA,BLOOP:DJNZR7,LOOP1RETSMIN:MOVA,@R0MOVR7,ADECR7INCR0五、查表程序设计例15将一个16进制数码0~F(R0的低4位)转换成ASCII码,存放到原单元。ORG2000HMOVDPTR,#TAB;表格首地址→DPTRMOVA,R0ANLA,#0FH;保留低四位MOVCA,@A+DPTR;查表求ASCII码MOVR0,ASJMP$TAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H方法二:ORG2000H2000HMOVA,R02001HANLA,#0FH2003HADDA,#03H2005HMOVCA,@A+PC2006HMOVR0,A2007HSJMP$2009H:DB30H,31H,32H,33H,34H,35H,36H,37H,.38H,39H,41H,42H,43H,44H,45H,46H,调整值(03H)=表首址-(MOVC所在地址+1)例16编程求逻辑函数L的值,。式中L、U、V、W、X、Y、Z均为位变量;逻辑变量从P1口的P1.0~P1.5输入,从P1.7输出,即有下列对应关系:ZWYXWVUL)(P1.0----UP1.1----VP1.2----WP1.3----XP1.4----YP1.5----ZP1.7----LORG2000HUEQUP1.0VEQUP1.1WEQUP1.2XEQUP1.3YEQUP1.4ZEQUP1.5LEQUP1.7MOVC,WCPLCORLC,VCPLCANLC,UMOV07H,C;暂存中间结果MOVC,WANLC,YORLC,ZCPLCANLC,XORLC,07HMOVL,CSJMP$六、位操作程序设计七、运算程序设计例17十进制转换为二进制整数程序设单字节BCD码a3、a2、a1、a0依次存放于内部RAM中的50H(高位)~53H(低位)单元。转换成的二进制整数存放于R3(高位)R4(低位)中IDTB:MOVR0,#50HMOVR2,#3MOVR3,#0MOVA,@R0MOVR4,ALOOP:MOVA,R4MOVB,#10MULABMOVR4,A;R4*10低8位MOVA,BXCHA,R3;暂存R4*10高8位MOVB,#10MULAB;R3*10为一个字节ADDA,R3;R3*10+R4*10高8位MOVR3,AINCR0MOVA,R4ADDA,@R0MOVR4,AMOVA,R3ADDCA,#0MOVR3,ADJNZR2,LOOPRET例18二进制整数转换为十进制数将R2(高位)R3(低位)中的16位二进制整数转换为压缩BCD码十进制整数送R4(高位)R5R6(低位)。IBTD2:CLRAMOVR4,AMOVR5,AMOVR6,AMOVR7,#16LOOP:CLRCMOVA,R3RLCAMOVR3,AMOVA,R2RLCAMOVR2,AMOVA,R6ADDCA,R6DAAMOVR6,AMOVA,R5ADDCA,R5DAAMOVR5,AMOVA,R4ADDCA,R4DAAMOVR4,ADJNZR7,LOOPRET例19二进制小数转换为十进制数将(R2R3)中的16位二进制小数转换为5位BCD码依次存放于内部RAM中(高位)50H~54H(低位)单元。PBTD:MOVR0,#50HMOVR4,#5LOOP:MOVA,R3MOVB,#10MULABMOVR3,AMOVA,#10XCHA,BXCHA,R2MULABADDA,R2MOVR2,ACLRAADDCA,BMOV@R0,AINCR0DJNZR4,LOOPRET例20多字节加法程序。设有1组三字节的被加数和加数,分别存放在首地址为BLOCK1和BLOCK2的两个数据块中(低字节在前,高字节在后),试编程分别求这1组数的和(仍为三字节),并将结果送到以BLOCK1为首地址的数据块中。ORG2000HBLOCK1EQU40HBLOCK2EQU60HMOVR0,#BLOCK1MOVR1,#BLOCK2MOVR7,#10LP:MOVR6,#3CLRCLP1:MOVA,@R0ADDCA,@R1MOV@R0,AINCR0INCR1DJNZR6,LP1DJNZR7,LPHLT:SJMP$JNCHLT
本文标题:第四章__汇编语言程序设计
链接地址:https://www.777doc.com/doc-3230123 .html