《汇编程序设计》PPT课件.ppt
3.4 汇编语言程序设计,80C51汇编语言语句结构的基本格式 伪指令的功能和应用 汇编的概念 程序设计的步骤和基本方法 顺序程序 分支程序 循环程序 查表程序 散转程序,3.4.1 汇编程序伪指令,在汇编时起控制作用,自身并不产生机器码,而仅是为汇编服务的一些指令,称为伪指令。伪指令不属于80C51指令系统。常用的伪指令有以下几种:,起始伪指令 ORG(Origin),功能:规定ORG下面目标程序的起始地址。,格式:ORG 16位地址,功能:将一个数据或特定的汇编符号赋予规定 的字符名称。,结束伪指令 END,功能:汇编语言源程序的结束标志。在END后面的指令,汇编程序不再处理。,格式:END,等值伪指令 EQU(Equate),格式:字符名称 EQU 数据或汇编符号,数据地址赋值伪指令 DATA,格式:字符名称 DATA 表达式,功能:将数据地址或代码地址赋予规定的 字符名称。,定义字节伪指令DB(Define Byte),格式:DB 8位二进制数表,功能:从指定的地址单元开始,定义若干 个8位内存单元的数据。数据与数据之间用“,”分割。,格式:字符名称 BIT 位地址,定义字伪指令DW(Define Word),格式:DW 16位二进制数表,功能:从指定的地址单元开始,定义 若干个16位数据。,定义位地址伪指令BIT,功能:将位地址赋予所规定的字符名称。,汇编语言基本概念,将汇编语言源程序转换为计算机所能识别的机器语言代码程序的过程称为汇编。汇编可分为:手工汇编 计算机汇编,汇编和调试,程序设计的基本方法,编写程序要求:不仅要完成规定的功能任务,而且还要求:执行速度快、占用内存少、条理清晰、阅读方便、便于移植、巧妙而实用。一般应按以下几个步骤进行:,分析问题,确定算法或解题思路,画流程图,编写源程序,顺序程序是指按顺序依次执行的程序,也称为简单程序或直线程序。顺序程序结构虽然比较简单,但也能完成一定的功能任务,是构成复杂程序的基础。,3.4.2 顺序程序,CONT:MOV A,R0;读低8位CPL A;取反ADD A,#1;加1MOV R2,A;存低8位MOV A,R1;读高8位CPL A;取反ADDC A,#80H;加进位及符号位MOV R3,A;存高8位RET;,【例】已知16位二进制负数存放在R1R0中,试求其补码,并将结果存在R3R2中。,解:二进制负数的求补方法可归结为“求反加1”,符号位不变。利用CPL指令实现求反;加1时,则应低8位先加1,高8位再加上低位的进位。注意这里不能用INC指令,因为INC指令不影响标志位。,程序如下:,根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。80C51指令系统中的条件转移指令、比较转移指令和位转移指令,可以实现分支程序。,3.4.3 分支程序,S0单独按下,红灯亮,其余灯灭;S1单独按下,绿灯亮,其余灯灭;其余情况,黄灯亮。,【例】已知电路如图4-5所示,要求实现:,解:程序如下SGNL:ANL P1,#11100011B;红绿黄灯灭 ORL P1,#00000011B;置P1.0、P1.1输入态,P1.5P1.7状态不变SL0:JNB P1.0,SL1;P1.0=0,S0未按下,转判S1 JNB P1.1,RED;P1.0=1,S0按下;且P1.1=0,S1未按下,转红灯亮YELW:SETB P1.4;黄灯亮 CLR P1.2;红灯灭 CLR P1.3;绿灯灭 SJMP SL0;转循环SL1:JNB P1.1,YELW;P1.0=0,S0未按下;P1.1=0,S1未按下,转黄灯亮GREN:SETB P1.3;绿灯亮 CLR P1.2;红灯灭 CLR P1.4;黄灯灭 SJMP SL0;转循环RED:SETB P1.2;红灯亮 CLR P1.3;绿灯灭 CLR P1.4;黄灯灭 SJMP SL0;转循环,课堂练习题:电路及灯亮灭要求同上述【例】题,其中第3、4两条指令JNB P1.0和JNB P1.1按下列要求修改,试重新编程。JBP1.0,JBP1.1,JBP1.0,JNB P1.1,JNB P1.0,JBP1.1,,循环程序一般包括以下几个部分:循环初值;循环体;循环修改;循环控制;以上四部分可以有两种组织形式,其结构如下图所示。,3.4.4 循环程序,【例】设Xi均为单字节数,并按顺序存放在以50H为首地址的内RAM存储单元中,数据长度(个数)N存在R2中,试编程求和S=X1+X2+XN,并将S(双字节)存放在R3R4中,(设S65536)。,解:程序如下:SXN:MOV R2,#N;置数据长度(循环次数)MOV R3,#00H;和单元(高8位)清0 MOV R4,#00H;和单元(低8位)清0 MOV R0,#50H;求和数据区首址LOOP:MOV A,R4;读前次低8位和 ADD A,R0;低8位累加 MOV R4,A;存低8位和 CLR A;ADDC A,R3;高8位加进位 MOV R3,A;存高8位和 INC R0;指向下一数据 循环修改 DJNZ R2,LOOP;判N个数据累加完否?循环控制 RET;退出循环 退出循环,置循环初值,循环体,【例】编写延时10ms子程序,fosc=12MHz。解:fosc=12MHz,一个机器周期为1s。DY10ms:MOV R6,#20;置外循环次数DLP1:MOV R7,#250;置内循环次数DLP2:DJNZ R7,DLP2;2机周250=500机周 DJNZ R6,DLP1;500机周20=10000机周 RET;说明:MOV Rn指令为1个机器周期;DJNZ指令为2个机器周期;RET指令为2个机器周期;(2机周250)+1+220+1+21s/机周=10063s10ms【课堂练习题】按下列要求编写延时子程序:延时2ms,fosc=6MHz;延时5ms,fosc=12MHz;延时10s,fosc=12MHz;,设80C51单片机的P1口作为输出口,经驱动电路74LS240(8反相三态缓冲/驱动器)接8只发光二极管,如下图所示。当输出位为“1”时,发光二极管点亮,输出位为“0”时为暗。试编程实现:每个灯闪烁点亮10次,再转移到下一个灯闪烁点亮10次,循环不止。,【例】编制一个循环闪烁灯的程序。,FLASH:MOV A,#01H;置灯亮初值FSH0:MOV R2,#0AH;置闪烁次数FLOP:MOV P1,A;点亮 LCALL DY1s;延时1s MOV P1,#00H;熄灭 LCALL DY1s;延时1s DJNZ R2,FLOP;闪烁10次 RL A;左移一位 SJMP FSH0;循环 RET;,解:程序如下:,延时子程序可根据延时长短,自行编写。,【课堂练习题】根据上图电路,设计灯亮移位程序,要求8只发光二极管每次点亮一个,点亮时间为250ms,顺序是从下到上一个一个地循环点亮。设fosc=6MHz。,【例】已知P1口数据每隔10ms刷新一次,试求其1s内的平均值,平均值存30H。,解:本题需求100个数据的平均值,一般有两种方法:一种是全部累加后再平均;另一种是边平均边累加,现给出两种方法的程序。,AVRG1:MOV R2,#0;低8位累加寄存器清0 MOV R3,#0;高8位累加寄存器清0 MOV R4,#100;置平均次数ALOP:MOV A,P1;读P1口数据 ADD A,R2;低8位累加 MOV R2,A;回存 CLR A;高8位与进位累加 ADDC A,R3;MOV R3,A;回存 LCALL DY10ms;延时10ms DJNZ R4,ALOP;判100次累加完否?未完继续 MOV A,R3;100次累加完,求平均值,被除数A、B MOV B,R2;MOV R0,30H;置商间址 MOV R6,#0;置除数100,除数R6R5 MOV R5,#100;LCALL SUM;(A、B)(R6、R5)=商 R0,余数A CJNE A,#50,NEXT;四舍五入NEXT:JC GRET;C=1,50,舍 INC 30H;C=0,50,入GRET:RET;,全部累加后再平均,注:SUM子程序可参阅例4-9,AVRG2:MOV 30H,#0;商累加寄存器清0MOV31H,#0;余数累加寄存器清0 MOVR4,#100;置平均次数ALOP:MOVA,P1;读P1口数据 MOVB,#100;置除数(平均次数)DIVAB;P1口数据除以100ADDA,30H;商累加MOV 30H,A;回存MOV A,B;ADDA,31H;余数累加MOV31H,A;回存CLRC;SUBBA,#100;JCGON;余数累加100,余数累加寄存器不变INC30H;余数累加100,商累加寄存器+1MOV31H,A;减去100后差余数累加寄存器GON:LCALLDY10ms;延时10msDJNZR4,ALOP;判100次累加完否?未完继续MOVA,31H;100次累加完毕,余数累加四舍五入CJNEA,#50,NEXT;NEXT:JCGRET;C=1,50,舍INC30H;C=0,50,入GRET:RET;,边平均边累加,【课堂练习题】已知某单片机系统每隔20ms测一次温度,8位温度A/D值存在特殊功能寄存器SBUF中,试分别求其1s和1分内的平均值,分别存30H和31H。,当用PC作基址寄存器时,其表格首地址与PC值间距不能超过256字节,且编程要事先计算好偏移量,比较麻烦。因此,一般情况下用DPTR作基址寄存器。,3.4.5 查表程序,用于查表的指令有两条:MOVC A,A+DPTR MOVC A,A+PC,当用DPTR作基址寄存器时,查表的步骤分三步:基址值(表格首地址)DPTR;变址值(表中要查的项与表格首地址之间的 间隔字节数)A;执行MOVC A,A+DPTR。,解:编程如下:CHAG:MOV DPTR,#TABD;置共阴字段码表首址MOV A,30H;读显示数字 MOVC A,A+DPTR;查表,转换为显示字段码 MOV 30H,A;存显示字段码 RET;TABD:DB 3FH,06H,5BH,4FH,66H;04共阴字段码表 DB 6DH,7DH,07H,7FH,6FH;59共阴字段码表,【例】在单片机应用系统中,常用LED数码管显示数码,但显示数字(9)与显示数字编码并不相同,需要将显示数字转换为显示字段码,通常是用查表的方法。现要求将30H中的显示数字转换为显示字段码并存入30H。已知共阴字段码表首址为TABD。,【课堂练习题】已知8位显示数字已存入首址为30H的内RAM中,试将其转换为共阴显示字段码,存入首址为40H的内RAM中。,解:编程如下:CUBE:MOV DPTR,#TAB;置立方表首址MOV A,30H;读数据ADD A,30H;数据2AMOV 30H,A;暂存立方表数据序号 MOVC A,A+DPTR;读立方数据高8位XCH A,30H;存立方数据高8位,立方表数据序号AINC A;指向立方数据低8位MOVC A,A+DPTR;读立方数据低8位 MOV 31H,A;存立方数据低8位RET;TAB:DW 0,0,0,1,0,8,0,27,0,64;040立方表 DW 0,125,0,216,0FAH,00H;说明:数据2A原因是立方表数据为双字节,【例】用查表程序求040之间整数的立方。已知该整数存在内RAM 30H中,查得立方数存内RAM 30H(高8位)31H。已知立方表(双字节)首地址为TAB。,在单片机系统中设置+、四个运算命令键,它们的键号分别为0、1、2、3。当其中一个键按下时,进行相应的运算。操作数由P1口和P3口输入,运算结果仍由P1口和P3口输出。具体如下:P1口输入被加数、被减数、被乘数和被除数,输出运算结果的低8位或商;P3口输入加数、减数、乘数和除数,输出进位(借位)、运算结果的高8位或余数。键盘号已存放在30H中。,3.4.6 散转程序,散转程序是一种并行多分支程序。,【例】单片机四则运算系统。,解:程序如下:PRGM:MOV P1,#0FFH;P1口置输入态 MOV P3,#0FFH;P3口置输入态 MOV DPTR,#TBJ;置“”表首地址 MOV A,30H;读键号 RL A;键号2A ADD A,30H;键号3A JMP A+DPTR;散转TBJ:LJMP PRGM0;转PRGM0(加法)LJMP PRGM1;转PRGM1(减法)LJMP PRGM3;转PRGM3(除法)LJMP PRGM2;转PRGM2(乘法)PRGM0:MOV A,P1;读加数 ADD A,P3;P1+P3 MOV P1,A;和P1 CLR A;ADDC A,#00H;进位A MOV P3,A;进位P3 RET;,PRGM1:MOV A,P1;读被减数 CLR C;SUBB A,P3;P1-P3 MOV P1,A;差P1 CLR A;RLC A;借位A MOV P3,A;借位P3 RET;PRGM2:MOV A,P1;读被乘数MOV B,P3;置乘数 MUL AB;P1P3 MOV P1,A;积低8位P1 MOV P3,B;积高8位P3 RET;PRGM3:MOV A,P1;读被除数 MOV B,P3;置除数 DIV AB;P1P3 MOV P1,A;商P1 MOV P3,B;余数P3 RET;说明:由于LJMP为3字节指令,因此键号需先乘3,以便转到正确的位置。,