第3章-汇编程序设计_第1页
第3章-汇编程序设计_第2页
第3章-汇编程序设计_第3页
第3章-汇编程序设计_第4页
第3章-汇编程序设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

会计学1第3章-汇编程序设计3.4.1汇编程序伪指令

在汇编时起控制作用,自身并不产生机器码,而仅是为汇编服务的一些指令,称为伪指令。伪指令不属于80C51指令系统。常用的伪指令有以下几种:⒈起始伪指令

ORG(Origin)

功能:规定ORG下面目标程序的起始地址。格式:ORG16位地址第1页/共31页功能:将一个数据或特定的汇编符号赋予规定 的字符名称。⒉结束伪指令END功能:汇编语言源程序的结束标志。在END后面的指令,汇编程序不再处理。格式:END⒊等值伪指令

EQU(Equate)格式:字符名称EQU

数据或汇编符号第2页/共31页⒋数据地址赋值伪指令

DATA格式:字符名称DATA

表达式功能:将数据地址或代码地址赋予规定的 字符名称。⒌定义字节伪指令DB(DefineByte)格式:DB8位二进制数表功能:从指定的地址单元开始,定义若干 个8位内存单元的数据。数据与数据之间用“,”分割。第3页/共31页格式:字符名称BIT

位地址⒍定义字伪指令DW(DefineWord)格式:DW16位二进制数表功能:从指定的地址单元开始,定义 若干个16位数据。⒎定义位地址伪指令BIT功能:将位地址赋予所规定的字符名称。第4页/共31页汇编语言基本概念

将汇编语言源程序转换为计算机所能识别的机器语言代码程序的过程称为汇编。汇编可分为:⒈手工汇编⒉计算机汇编第5页/共31页⑷

汇编和调试程序设计的基本方法编写程序要求:

不仅要完成规定的功能任务,而且还要求:

执行速度快、占用内存少、条理清晰、

阅读方便、便于移植、巧妙而实用。一般应按以下几个步骤进行:⑴分析问题,确定算法或解题思路⑵画流程图⑶编写源程序第6页/共31页

顺序程序是指按顺序依次执行的程序,也称为简单程序或直线程序。顺序程序结构虽然比较简单,但也能完成一定的功能任务,是构成复杂程序的基础。3.4.2顺序程序第7页/共31页CONT:MOV A,R0 ;读低8位

CPL A ;取反

ADD A,#1 ;加1 MOV R2,A ;存低8位

MOV A,R1 ;读高8位

CPL A ;取反

ADDC A,#80H ;加进位及符号位

MOVR3,A ;存高8位

RET ;【例】已知16位二进制负数存放在R1R0中, 试求其补码,并将结果存在R3R2中。解:二进制负数的求补方法可归结为“求反加1”,符号位不变。利用CPL指令实现求反;加1时,则应低8位先加1,高8位再加上低位的进位。注意这里不能用INC指令,因为INC指令不影响标志位。程序如下:第8页/共31页

根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。

80C51指令系统中的条件转移指令、比较转移指令和位转移指令,可以实现分支程序。3.4.3分支程序第9页/共31页①S0单独按下,

红灯亮,其余灯灭;②S1单独按下,

绿灯亮,其余灯灭;③其余情况,黄灯亮。【例】已知电路如图4-5所示,要求实现:第10页/共31页解:程序如下SGNL:ANLP1,#11100011B;红绿黄灯灭

ORLP1,#00000011B;置P1.0、P1.1输入态,

P1.5~P1.7状态不变SL0:JNBP1.0,SL1 ;P1.0=0,S0未按下,转判S1JNBP1.1,RED ;P1.0=1,S0按下;且P1.1=0,S1未按下,转红灯亮YELW:SETBP1.4 ;黄灯亮

CLRP1.2 ;红灯灭

CLRP1.3 ;绿灯灭

SJMPSL0 ;转循环SL1:JNBP1.1,YELW ;P1.0=0,S0未按下;P1.1=0,S1未按下,转黄灯亮GREN:SETBP1.3 ;绿灯亮

CLRP1.2 ;红灯灭

CLRP1.4 ;黄灯灭

SJMPSL0 ;转循环RED:SETBP1.2 ;红灯亮

CLRP1.3 ;绿灯灭

CLRP1.4 ;黄灯灭

SJMPSL0 ;转循环

第11页/共31页课堂练习题:

电路及灯亮灭要求同上述【例】题,其中第3、4两条指令JNBP1.0和JNBP1.1按下列要求修改,试重新编程。 ⑴ JB P1.0,… JB P1.1,… ⑵ JB P1.0,… JNBP1.1,… ⑶ JNBP1.0,… JB P1.1,…第12页/共31页

循环程序一般包括以下几个部分: ⑴循环初值; ⑵循环体; ⑶循环修改; ⑷循环控制; 以上四部分可以有两种组织形式,其结构如下图所示。3.4.4

循环程序第13页/共31页第14页/共31页【例】设Xi均为单字节数,并按顺序存放在以50H为首地址的内RAM存储单元中,数据长度(个数)N存在R2中,试编程求和S=X1+X2+‥‥+XN,并将S(双字节)存放在R3R4中,(设S<65536)。解:程序如下:SXN:MOVR2,#N ;置数据长度(循环次数)MOVR3,#00H;和单元(高8位)清0MOVR4,#00H;和单元(低8位)清0MOVR0,#50H;求和数据区首址LOOP:MOVA,R4 ;读前次低8位和

ADDA,@R0 ;低8位累加

MOVR4,A ;存低8位和

CLRA;

ADDCA,R3;高8位加进位

MOVR3,A;存高8位和

INCR0;指向下一数据循环修改

DJNZR2,LOOP;判N个数据累加完否?循环控制

RET;退出循环退出循环

置循环初值循环体第15页/共31页【例】编写延时10ms子程序,fosc=12MHz。

解:fosc=12MHz,一个机器周期为1s。DY10ms:MOVR6,#20;置外循环次数DLP1:MOVR7,#250;置内循环次数DLP2:DJNZR7,DLP2;2机周×250=500机周

DJNZR6,DLP1;500机周×20=10000机周

RET;说明:MOVRn指令为1个机器周期;DJNZ指令为2个机器周期;RET指令为2个机器周期;{[(2机周×250)+1+2]×20+1+2}×1s/机周=10063s≈10ms【课堂练习题】

按下列要求编写延时子程序:⑴延时2ms,fosc=6MHz;⑵延时5ms,fosc=12MHz;⑶延时10s,fosc=12MHz;第16页/共31页

设80C51单片机的P1口作为输出口,经驱动电路74LS240(8反相三态缓冲/驱动器)接8只发光二极管,如下图所示。当输出位为“1”时,发光二极管点亮,输出位为“0”时为暗。试编程实现:每个灯闪烁点亮10次,再转移到下一个灯闪烁点亮10次,循环不止。【例】编制一个循环闪烁灯的程序。第17页/共31页FLASH:MOVA,#01H ;置灯亮初值FSH0:MOVR2,#0AH ;置闪烁次数FLOP:MOVP1,A ;点亮

LCALLDY1s ;延时1sMOVP1,#00H ;熄灭

LCALLDY1s ;延时1sDJNZR2,FLOP ;闪烁10次

RL A ;左移一位

SJMPFSH0 ;循环

RET ;解:程序如下:延时子程序可根据延时长短,自行编写。第18页/共31页【课堂练习题】

根据上图电路,设计灯亮移位程序,要求8只发光二极管每次点亮一个,点亮时间为250ms,顺序是从下到上一个一个地循环点亮。设fosc=6MHz。第19页/共31页【例】已知P1口数据每隔10ms刷新一次,试求其1s内的平均值,平均值存30H。解:本题需求100个数据的平均值,一般有两种方法:一种是全部累加后再平均;另一种是边平均边累加,现给出两种方法的程序。第20页/共31页AVRG1:MOVR2,#0 ;低8位累加寄存器清0MOVR3,#0 ;高8位累加寄存器清0MOVR4,#100 ;置平均次数ALOP:MOVA,P1 ;读P1口数据

ADDA,R2 ;低8位累加

MOVR2,A ;回存

CLRA ;高8位与进位累加

ADDCA,R3 ;MOVR3,A ;回存

LCALLDY10ms ;延时10msDJNZR4,ALOP ;判100次累加完否?未完继续

MOVA,R3 ;100次累加完,求平均值,被除数→A、BMOVB,R2 ;MOVR0,30H ;置商间址

MOVR6,#0 ;置除数100,除数→R6R5MOVR5,#100 ;LCALLSUM ;(A、B)÷(R6、R5)=商@R0,余数A

CJNEA,#50,NEXT ;四舍五入NEXT:JC GRET ;C=1,<50,舍

INC 30H ;C=0,≥50,入GRET:RET ;⑴全部累加后再平均注:SUM子程序可参阅例4-9第21页/共31页AVRG2: MOV 30H,#0 ;商累加寄存器清0 MOV 31H,#0 ;余数累加寄存器清0 MOV R4,#100 ;置平均次数ALOP: MOV A,P1 ;读P1口数据

MOV B,#100 ;置除数(平均次数) DIV AB ;P1口数据除以100 ADD A,30H ;商累加

MOV 30H,A ;回存

MOV A,B ; ADD A,31H ;余数累加

MOV 31H,A ;回存

CLR C ; SUBB A,#100 ; JC GON ;余数累加<100,余数累加寄存器不变

INC 30H ;余数累加≥100,商累加寄存器+1 MOV 31H,A ;减去100后差→余数累加寄存器GON: LCALL DY10ms ;延时10ms DJNZ R4,ALOP ;判100次累加完否?未完继续

MOV A,31H ;100次累加完毕,余数累加四舍五入

CJNE A,#50,NEXT ;NEXT: JC GRET ;C=1,<50,舍

INC 30H ;C=0,≥50,入GRET: RET;⑵边平均边累加第22页/共31页【课堂练习题】

已知某单片机系统每隔20ms测一次温度,8位温度A/D值存在特殊功能寄存器SBUF中,试分别求其1s和1分内的平均值,分别存30H和31H。第23页/共31页

当用PC作基址寄存器时,其表格首地址与PC值间距不能超过256字节,且编程要事先计算好偏移量,比较麻烦。因此,一般情况下用DPTR作基址寄存器。3.4.5查表程序用于查表的指令有两条:⑴MOVCA,@A+DPTR⑵MOVCA,@A+PC

当用DPTR作基址寄存器时,查表的步骤分三步:①基址值(表格首地址)→DPTR;②变址值(表中要查的项与表格首地址之间的间隔字节数)→A;③执行MOVCA,@A+DPTR。第24页/共31页解:编程如下:CHAG:MOVDPTR,#TABD;置共阴字段码表首址

MOVA,30H;读显示数字

MOVCA,@A+DPTR;查表,转换为显示字段码

MOV30H,A;存显示字段码

RET;TABD:DB3FH,06H,5BH,4FH,66H;0~4共阴字段码表

DB6DH,7DH,07H,7FH,6FH;5~9共阴字段码表【例】在单片机应用系统中,常用LED数码管显示数码,但显示数字(≤9)与显示数字编码并不相同,需要将显示数字转换为显示字段码,通常是用查表的方法。现要求将30H中的显示数字转换为显示字段码并存入30H。已知共阴字段码表首址为TABD。第25页/共31页【课堂练习题】

已知8位显示数字已存入首址为30H的内RAM中,试将其转换为共阴显示字段码,存入首址为40H的内RAM中。第26页/共31页解:编程如下:CUBE: MOVDPTR,#TAB;置立方表首址

MOVA,30H ;读数据

ADDA,30H ;数据×2→A MOV30H,A ;暂存立方表数据序号

MOVCA,@A+DPTR;读立方数据高8位

XCHA,30H;存立方数据高8位,立方表数据序号→A INCA ;指向立方数据低8位

MOVCA,@A+DPTR;读立方数据低8位

MOV31H,A ;存立方数据低8位

RET;TAB:DW0,0,0,1,0,8,0,27,0,64;0~40立方表

DW0,125,0,216,…,0FAH,00H;说明:数据×2→A原因是立方表数据为双字节【例】用查表程序求0~40之间整数的立方。已知该整数存在内RAM30H中,查得立方数存内RAM30H(高8位)31H。已知立方表(双字节)首地址为TAB。第27页/共31页

在单片机系统中设置+、、、四个运算命令键,它们的键号分别为0、1、2、3。当其中一个键按下时,进行相应的运算。操作数由P1口和P3口输入,运算结果仍由P1口和P3口输出。具体如下:P1口输入被加数、被减数、被乘数和被除数,输出运算结果的低8位或商;P3口输入加数、减数、乘数和除数,输出进位(借位)、运算结果的高8位或余数。键盘号已存放在30H中。3.4.6散转程序散转程序是一种并行多分支程序。【例】单片机四则运算系统。第28页/共31页解:程序如下:PRGM:MOVP1,#0FFH;P1口置输入态

MOVP3,#0FFH;P3口置输入态

MOVDPTR,#TBJ;置“+-×÷”表首地址

MOVA,30H;读键号

RLA;键号2→A ADDA,30H;键号3→A JMP@A+DPTR;散转TBJ:LJMPPRGM0

;转PRGM0(加法)LJMPPRGM1

;转PRGM1(减法)LJMPPRGM3

;转P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论