汇编语言程序设计知识BH_第1页
汇编语言程序设计知识BH_第2页
汇编语言程序设计知识BH_第3页
汇编语言程序设计知识BH_第4页
汇编语言程序设计知识BH_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言程序设计知识BH第一页,共76页。内容提要

第1章微机基础知识第2章89C51单片机硬件结构和原理第3章89C51指令系统第4章汇编语言程序设计知识

第4章C-51程序设计知识第5章中断系统第6章定时器及应用第7章89C51串行口及通信技术第8章单片机小系统片外扩展第9章应用系统配置及接口技术第二页,共76页。第4章汇编语言程序设计知识§4.1编程的步骤、方法和技巧§4.2汇编语言源程序的编辑和汇编§4.3汇编语言程序设计基础与举例第三页,共76页。§4.1编程的步骤、方法和技巧§4.1.1编程的步骤§4.1.2编程的方法和技巧§4.1.3汇编语言程序的基本结构第四页,共76页。§4.1.1编程的步骤一、分析问题二、确定算法三、画程序流程图四、编写程序第五页,共76页。一、分析问题对需要解决的问题进行分析,以求对问题由正确的理解。如,解决问题的任务是什么?工作过程?现有的条件,已知数据,对运算的精度和速度方面的要求?硬件资源如何访问?第六页,共76页。二、确定算法算法是如何将实际问题转化成程序模块来处理。在编程以前,先要对几种不同的算法进行分析、比较,找出最适宜的算法第七页,共76页。三、画程序流程图程序流程图是使用各种图形、符号、有向线段等来说明程序设计过程的一种直观的表示。流程图步骤分得越细致,编写程序是也越方便。画流程图是程序结构设计是采用的一种重要手段。一个系统软件有总的流程图(主程序框图)和局部的流程图。流程图常采用的图形和符号。第八页,共76页。椭圆框或桶形框:表示程序的开始或结束。矩形框:表示要进行的工作。菱形框:表示要判断的事情,菱形框内的表达式表示要判断的内容。圆圈:表示连接点指向线:表示程序的流向第九页,共76页。四、编写程序用89C51汇编语言编写的源程序行(一条语句)包括四个部分,也叫四个字段:〔标号:〕〔操作码〕〔操作数〕;〔注释〕

每个字段之间要用分隔符分隔,而每个字段内部不能使用分隔符。可以用作分隔符的符号:空格“”、冒号“:”、、逗号“,”、分号“;”等。例:LOOP:MOVA,#00H;立即数00H→A第十页,共76页。§4.1.2编程的方法和技巧一、模块化的程序设计方法二、编程技巧第十一页,共76页。一、模块化的程序设计方法1、程序功能模块化的优点2、划分模块的原则第十二页,共76页。1、程序功能模块化的优点单个模块结构的程序功能单一,易于编写、阅读、调试和修改。便于分工,从而可使多个程序员同时进行程序的编写和调试工作,加快软件研制进度。程序可读性好,便于功能扩充和版本升级。对程序的修改可局部进行,其它部分可以保持不变。对于使用频繁的子程序可以建立子程序库,便于多个模块调用。第十三页,共76页。2、划分模块的原则每个模块应具有独立的功能,能产生一个明确的结果,即单模块的功能高内聚性。模块之间的控制耦合应尽量简单,数据耦合应尽量少,即模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换方式、交换量的多少及交换频繁程度。模块长度适中。第十四页,共76页。二、编程技巧1、尽量采用循环结构和子程序。2、尽量少用无条件转移指令。3、对于通用的子程序,考虑到其通用性,除了用于存放子程序入口参数的寄存器外,子程序中用到的其他寄存器的内容应压入堆栈(返回前再弹出),即保护现场。4、在中断处理程序中,除了要保护处理程序中用到的寄存器外,还要保护标志寄存器。5、用累加器传递入口参数或返回参数比较方便,在子程序中,一般不必把累加器内容压入堆栈。第十五页,共76页。§4.2汇编语言源程序的编辑和汇编§4.2.1源程序编辑§4.2.2源程序的汇编§4.2.3伪指令第十六页,共76页。§4.2.1源程序编辑在微型计算机上,借助编辑软件,编写或修改汇编语言源程序。如行编辑或屏幕编辑软件。第十七页,共76页。§4.2.2源程序的汇编汇编:将汇编语言源程序转换为机器码表示的目标程序的过程。对单片机有:一、手工汇编二、机器汇编三、反汇编第十八页,共76页。一、手工汇编通过手工方式查指令编码表,逐个把助记符指令“翻译”成机器码,然后把得到的机器码程序键入单片机,进行调试和运行。手工汇编的缺点:

1、偏移量的计算容易出错

2、程序的修改会引起后面指令地址的变化,转移指令的偏移量也要重新计算。第十九页,共76页。二、机器汇编机器汇编是在计算机上使用交叉汇编程序进行源程序的汇编。汇编工作由机器自动完成,最后得到以机器码表示的目标程序。第二十页,共76页。三、反汇编将二进制机器语言程序翻译成汇编语言程序的过程称反汇编。汇编和反汇编的过程如图4-3所示。第二十一页,共76页。源程序(汇编语言)目标码(机器语言)汇编(汇编程序)反汇编(汇编程序)图4-3汇编和反汇编过程第二十二页,共76页。§4.2.3伪指令伪指令不是真正的指令,无对应的机器码,在汇编时不产生目标程序,只是用来对汇编过程进行某种控制。第二十三页,共76页。ORG汇编起始命令格式:ORG16位地址功能:规定该伪指令后面程序的汇编地址,即汇编后生成目标程序存放的起始地址。例如:

ORG2000HSTART:MOVA,#64H┇规定了START的地址是2000H,又规定了汇编后的第一条指令码从2000H开始存放。第二十四页,共76页。END汇编结束指令格式:END功能:通知汇编程序结束汇编。在END之后所有的汇编指令均不予以处理。第二十五页,共76页。EQU赋值命令格式:字符名称EQU项(数或汇编符号)功能:把“项”赋给“字符名称”。注意:字符名称不等于标号(其后没有冒号);其中的项,可以是数,也可以是汇编符号。EQU赋值过的符号名可以用作数据、代码地址、位地址或一个立即数。可以是8位的,也可以是16位的。例如:第二十六页,共76页。EQU赋值命令例1:AAEQUR1MOVA,AA;AA代表工作寄存器R1例2:

A10EQU10DELYEQU07EBHMOVA,A10;A10作为片内的一个直接地址

LCALLDELY;DELY作为一个16位子程序的入口地址第二十七页,共76页。DATA数据地址赋值命令格式:字符名称DATA表达式功能:与EQU类似,但有以下差别:1、EQU定义的字符名必须先定义后使用,而DATA定义的字符名可以后定义先使用。2、用EQU伪指令可以把一个汇编符号赋给一个名字,而DATA只能把数据赋给字符名。3、DATA语句可以把一个表达式的值赋给字符名称,其中的表达式应是可求值的。DATA伪指令在程序中常用来定义数据地址第二十八页,共76页。DB定义字节命令格式:DB(项或项表)功能:通知汇编程序从当前ROM地址开始,保留一个字或字节串的存储单元,并存入DB后的数据。注意:项或项表可以是一个字节,用逗号隔开的字节串或括在单引号中的ASCII字符串。例如:第二十九页,共76页。DB定义字节命令ORG2000HDB0A3HLIST:DB26H,03HSTR:DB‘ABC’┇经汇编后(2000H)=A3H,(2001H)=26H,(2002H)=03H,(2003H)=41H,(2004H)=42H,(2005H)=43H,(*41H,42H,43H分别为A,B,C的ASCII码)第三十页,共76页。DW定义字命令格式:DW16位数据项或项表功能:把DW后的16位数据项或项表从当前地址连续存放。每项数值为16位二进制数,高8位先放,低8位后存放。DW用于定义一个地址表。例如:第三十一页,共76页。DW定义字命令

ORG1500HTABLE:DW7234H,8AH,10H┇经汇编后(1500H)=72H,(1501H)=34H,(1502H)=00H,(1503H)=8AH,(1504H)=00H,(1505H)=10H,第三十二页,共76页。DS定义存储空间命令格式:DS表达式功能:在汇编时,从指定地址开始保留DS之后表达式的值所规定的存储单元以备后用。例如:ORG1000HDS08HDB30H,8AH汇编后,从1000H保留8个单元,然后从1008H按DB命令给内存赋值,即(1008H)=30H

(1009H)=8AH第三十三页,共76页。BIT位地址符号命令格式:字符名BIT位地址功能:把BIT后的位地址值赋给字符名。其中字符名不是标号,其后没有冒号,但字符名是必须的。例如:A1BITP1.0A2BIT02H汇编后,P1口第0位的位地址90H就赋给了A1,而A2的值则为02H。第三十四页,共76页。4.3程序设计基础与举例4.3.0MCS-51汇编语言程序代码框架4.3.1顺序程序设计4.3.2分支程序设计4.3.3循环程序设计4.3.4子程序设计及调用4.3.5逻辑运算程序设计第三十五页,共76页。

ORG1000HLENEQU10HSTART:MOVA,#LEN ADDA,#30HSJMP$

ORG2000HTAB1: DB32H,0A7HTAB2: DW324AH,3CHTAB3: DS5

END7410243080FEFFFFFFFF1000H32A7324A003CFFFFFFFF2000H2001H2002H2003H2004H2005H2006H2007H2008H2009H200AH200BH……TAB1TAB2TAB34.3.0MCS-51汇编语言程序代码框架第三十六页,共76页。4.3.1顺序程序顺序程序是一种最简单,最基本的程序。特点:程序按编写的顺序依次往下执行每一条指令,直到最后一条。例有一变量存放在片内RAM20H单元,其取值范围为:00H~05H,编程实现:求变量的平方值,并存入片内RAM21H单元。分析:XX220H21H内部RAMTABLE+002122232425200H01H04H09H10H19H+1+2+3+4+5XX2第三十七页,共76页。步骤:1.送表头首地址2.取X到A3.求X2

存于A4.将X2存于内部RAM21HORG1000HSTART:MOVDPTR,#TABLEMOVA,20HMOVCA,@A+DPTRMOV21H,ASJMP$TABLE:DB00H,01H,04HDB09H,10H,19HORG2000H5.建立平方表第三十八页,共76页。例三字节无符号数加法。

一个加数存放在内部RAM50H,51H,52H单元,另一个加数存放在内部RAM60H,61H,62H单元,将相加结果存入50H,51H,52H单元。进位存放在位寻址区的00H位。按低字节对应低地址存放。分析:+15109AC51626160789ABF12345652515052515000R0R1R0第三十九页,共76页。 ORG0000HSTART:LJMPSTART1 ORG1000HSTART1:MOVA,50HADDA,60HMOV50H,AMOVA,51HADDCA,61HMOV51H,AMOVA,52HADDCA,62HMOV62H,AMOV00H,CSJMP$思考题:若求两个十字节数的和,程序应该怎么写?第四十页,共76页。1.分支程序的基本形式分支程序有三种基本形式。分支程序的设计要点如下:(1)先建立可供条件转移指令测试的条件。

(2)选用合适的条件转移指令。(3)在转移的目的地址处设定标号。4.3.2分支程序第四十一页,共76页。N(a)(b)(c)

分支程序结构流程图分支0K=0K=1…K=nK=?……分支1分支nY

条件满足?下条指令程序段A条件满足?程序段A程序段BNY第四十二页,共76页。例X存于20H单元,求出Y值,将Y值存入30H单元。

XX>0Y= 20HX=0X+5X<0分析:根据数据的符号位判别该数的正负,若最高位为0,再判别该数是否为0。请看程序流程。2.双向分支程序设计举例第四十三页,共76页。A为0?Y取数,A←(20H)开始结束A<0?YNNA←#20HA←X+5A←X(30H)←A程序流程图第四十四页,共76页。3.多向分支程序设计举例例根据R0的值转向7个分支程序。R0=0,转向SUB0;R0=1,转向SUB1;

…….R0=N,转向SUBN。分析:利用JMP@A+DPTR指令直接给PC赋值,使程序实现转移。程序流程如下。第四十五页,共76页。多向分支程序流程图结束K=?转SUB0转SUB1转SUBNK=0K=1……K=N开始……第四十六页,共76页。

参考程序如下:

ORG2000HSTART:MOVDPTR,#TAB;转移指令表首地址

MOVA,R0;取数

RLA ;A←2(A)

JNCA1INCDPHA1:JMP@A+DPTR ;PC←A+DPTRTAB:AJMP SUB0 ;转移指令表

AJMPSUB1AJMP SUB2AJMP SUB3AJMP SUB4

……AJMP SUBN第四十七页,共76页。5.3.3循环程序在程序运行时,有时需要连续重复执行某段程序,可以使用循环程序。其结构包括四部分:

1、置循环初值

2、循环体(循环工作部分)

3、修改控制变量

4、循环控制部分其组织方式如图4-2所示。第四十八页,共76页。1、置循环初值对于循环程序中所使用的工作单元,在循环开始时应置初值。例如,工作寄存器设置计数初值,累加器A清0,以及设置地址指针、长度等。第四十九页,共76页。2、循环体(循环工作部分)重复执行的程序段部分,分为循环工作部分和循环控制部分。循环控制部分每循环一次,检查结束条件,当满足条件时,就停止循环,往下继续执行其他程序第五十页,共76页。3、修改控制变量在循环程序中,不许给出循环结束条件。常见的是计数循环,当循环了一定的次数后,就停止循环。在单片机中,一般用一个工作寄存器Rn作为计数器,对该计数器赋初值作为循环次数。每循环一次,计数器的值减1,即修改循环控制变量,当计数器的置件为0时,就停止循环。第五十一页,共76页。4、循环控制部分根据循环结束条件,判断是否结束循环。89C51可采用DJNZ指令来自动修改控制变量并能结束循环。第五十二页,共76页。置初值循环体循环修改循环控制退出循环未完完(a)置初值循环体循环修改循环控制退出循环未完完(b)图4-2循环组织方式流程图第五十三页,共76页。5.循环程序设计举例1.数据传送2.算术运算4.软件定时3.排序第五十四页,共76页。例编程实现将内部RAM20H开始的连续的10个单元清零。(加)ORG0100HCLEAR:MOVR2,#10MOVR0,#20HCLRA;初始化部分LOOP:MOV@R0,AINCR0DJNZR2,LOOPSJMP$;执行清零操作;修改地址指针;判断循环是否结束?第五十五页,共76页。例编程实现将内部RAM起始地址为data的数据串传送到外部RAM中起始地址为BUF的存储区内,直到发现“$”字符,则停止传送。分析:此例中,我们不知道循环次数,但知道循环结束条件,即遇到“$”字符时,循环停止。则,如何判断字符“$”?CJNEA,#24H(或‘$’),

LOOP1(A)=#24H?不相等,转LOOP1

相等,执行下条指令取数判断是否结束结束传送修改指针第五十六页,共76页。

MOVR0,#dataMOVDPTR,#BUFLOOP0:MOVA,@R0CJNEA,#24H,LOOP1SJMPDONELOOP1:MOVX@DPTR,AINCR0INCDPTRSJMPLOOP0DONE:END;初始化部分;取数;判断是否为‘$’;是‘$’,结束;不是‘$’,继续找;修改指针;取下一数;结束第五十七页,共76页。例单字节求和。设在内部RAM20H单元开始存有10个单字节无符号数,求其和,存于内部RAM30H(低位),31H单元(高位)。MOVR0,#20HMOVR2,#10CLRAMOV31H,A;初始化部分LOOP:ADDA,@R0JNCNEXTINC31HNEXT:INCR0DJNZR2,LOOPMOV30H,ASJMP$;求和;没有进位,准备下一数;有进位,31H加1;修改指针;10个数加完否,未完,回LOOP;加完,存低位和到30H第五十八页,共76页。例无符号数排序。在片内RAM中,起始地址为30H的8个单元中存放有8个无符号数。试进行升序排序。数据排序最常用的方法是冒泡排序法。执行时从前向后进行相邻数的比较,如数据的大小次序与要求的顺序不符,就将这两个数互换,否则不换。进行第一次冒泡,就会把最大数(或最小数)放到最前(降序)或最后(升序)。再进行第一次冒泡,就会把次大数(或最小数)放到第二位(降序)或倒数第二位(升序)……第五十九页,共76页。START:CLRC;互换标志清0MOVR7,#07H;各次冒泡比较次数MOVR0,#30H;送数据区首地址LOOP:MOVA,@R0;取前数MOV2BH,A;暂存MOV2AH,@R0;取后数INCR0;CLRCSUBBA,@R0;前数减后数JCNEXT;前数小于后数,进行下一次比较MOV@R0,2BH;前数大于后数,将大数放在后面DECR0MOV@R0,2AH;将小数放在前面第六十页,共76页。SETB00H;置互换标志INCR0;准备下一次比较NEXT:DJNZR7,LOOP;进行下一次比较JB00H,START;进行下一轮冒泡SJMP$第六十一页,共76页。50ms延时程序如下:DELAY:MOVR7,#200DEL2:MOVR6,#123DEL1:NOPDJNZR6,DEL1DJNZR7,DEL2RET例50ms延时程序。

延时程序与MCS-51执行指令的时间有关,如果使用6MHz晶振,一个机器周期为2μs,计算出一条指令以至一个循环所需要的执行时间,给出相应的循环次数,便能达到延时的目的。;1μs;1μs;1μs;2μs;2μs;2μs123次200次T=[1+{[(3ⅹ123)+3]ⅹ200}+2]*2=XXXXms

第六十二页,共76页。4.3.4子程序的设计及其调用

1.子程序概念通常把这些基本操作功能编制为程序段作为独立的子程序,以供不同程序或同一程序反复调用。在程序中需要执行这种操作的地方放置一条调用指令,当程序执行到调用指令,就转到子程序中完成规定的操作,并返回到原来的程序继续执行下去。2.

子程序的调用所谓调用子程序,暂时中断主程序的执行,而转到子程序的入口地址去执行子程序。第六十三页,共76页。调用子程序应注意:(1)子程序占用的存储单元和寄存器。(2)参数的传递。(3)保护现场和恢复现场。(4)嵌套调用与递归调用。如图4-9所示。调用子程序的指令有“ACALL”和“LCALL”,执行调用指令时,先将程序地址指针PC改变(“ACALL”加2,“LCALL”加3),然后PC值压入堆栈,用新的地址值代替。执行返回指令时,再将PC值弹出。下一页第六十四页,共76页。子程序的调用与返回返回RETLCALLSUBSUB第六十五页,共76页。子程序的嵌套调用与返回LCALLARETRETLCALLB子程序A子程序B返回第六十六页,共76页。

子程序调用中,主程序应先把有关的参数存入约定的位置,子程序在执行时,可以从约定的位置取得参数;当子程序执行完,将得到的结果再存入约定的位置,返回主程序后,主程序可以从这些约定的位置上取得需要的结果,这就是参数的传递。参数的传递的方法:1.利用累加器或寄存器2.利用存储器3.利用堆栈保护现场和恢复现场:子程序执行过程中,常常要用到一些通用单元,如R0~R7,A,DPTR,PSW等。保护现场:子程序要用到这些单元,因此把主程序中这些单元内容保存起来,通常用压栈操作。恢复现场:执行完子程序返回主程序后,要恢复这些单元内容,通常用出栈操作。返回第六十七页,共76页。2.子程序设计举例例4.3.12编程实现F=X2+Y2,设F,X,Y分别存于内部RAM的DTA,DTB,DTC单元中。例DTAEQU30HDTBEQU31HDTCEQU32H程序清单:ORG0100HSTART:MOVA,DTAACALLSQRMOVR1,A;AX;求X平方;暂存于R1第六十八页,共76页。MOVDTC,AMOVA,DTBACALLSQRADDA,R1SJMP$SQR:MOVDPTR,#TABMOVCA,@A+DPTRRETTAB:DB0,1,4,9,16,25,36,49,64,81ENDORG1000H;A

温馨提示

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

评论

0/150

提交评论