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

下载本文档

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

文档简介

一、汇编语言源程序的汇编

源程序(汇编指令程序)

汇编

目标程序(机器码指令程序)汇编指令与机器码指令有一一对应的关系。第四章汇编语言程序设计§4-1汇编语言源程序的汇编与伪指令汇编有两种方法:手工汇编、机器汇编。1、手工汇编:第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出;第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。

源程序

目标程序

地址

ORG1000HSTART:MOVR0,2FHMOVR2,#00HMOVA,@R0MOVR3,AINCR3SJMPNEXT

LOOP:INCR0CJNE@R0,#44H,NEXT

INCR2NEXT:DJNZR3,LOOP

MOV2AH,R2SJMP$END

第一次汇编第二次汇编1000A82F10027A001004E61005FB10060B100780NEXT100908100AB644NEXT100D0A100EDBLOOP10108A2A101280FEA82F7A00E6FB0B800508B644010ADBF98A2A80FE2、机器汇编两次扫描过程:第一次扫描:检查语法错误,确定符号名字;建立使用的全部符号名字表;对每条指令查一次表,将指令码存入。第二次扫描:是在第一次扫描基础上,将符号地址转换成地址(代真);完成翻译工作的软件称为“汇编程序”。注意与通常所说的“汇编语言源程序”或“汇编指令程序”的区别。伪指令是对源程序的汇编过程进行控制的指令,但其在汇编中不产生机器码。故称为伪指令。二、伪指令

1、起始地址伪指令ORGaddr16

用于规定目标程序段或数据块的起始地址,设置在程序开始处。2、汇编结束伪指令END

告诉汇编程序,对源程序的汇编到此结束。一个程序中只出现一次,在末尾。3、赋值伪指令EQU

告诉汇编程序,将汇编语句操作数的值赋予本语句的标号。

格式标号名称EQU

数值或汇编符号“标号名称”在源程序中可以作为数据地址、代码地址、位地址前面加上#可当作立即数。先定义后使用,放在程序开头。

4、定义字节伪指令DB(definebyte)

告诉汇编程序从指定的地址单元开始,定义若干字节存储单元并赋初值。

格式[标号:]

DB

字节数据或字节数据表例、ORG1000HPIOI:DW7654H,126、数据地址赋值伪指令DATA

将表达式指定的数据地址赋予规定的字符名称格式:字符名称DATA

表达式注:该指令与EQU 指令相似,只是,可先使用后定义,放于程序开头、结尾均可。5、定义字伪指令DW(defineword)从指定地址开始,定义若干个16个位数据,高八位存入低地址,低八位存入高地址。

(1000H)=76H,(1001H)=54H,(1002H)=00H,(1003H)=0CH7、定义空间伪指令DS(definestore)

从指定地址开始,保留由表达式指定的若干字节空间作为备用空间。格式:[标号:]DS表达式例2、ORG1000HDS0AHDB71H,11H,12H;从100AH开始存放;71H、11H、12H。

8、位地址赋值伪指令BIT将位地址赋予规定的字符名称。格式:字符名称BIT

位地址例3、X1BITP1.2

相当于X1EQUP1.2

基本要求:程序编写做到:占用存储空间少;运行时间短;程序的编制、调试及排错所需时间短;结构清晰,易读、易于移植。

常见基本结构:顺序结构分支结构循环结构

§4-2汇编语言源程序的

基本结构与应用举例语句3语句2顺序结构

入口语句1出口分支结构入口条件满足否?

分支1出口YN

分支2循环结构入口

处理

修改条件条件满足否?Y出口N一、顺序程序例1、设在外RAM的60H单元存有1个字节代码,要求将其分解成两个4位字段,高4位存入原单元的低4位,其低4位存入61H单元的低4位,且要求这两个单元的高4位均为0,试编制完整程序。

分析:####

¥¥¥¥0000

####0000

¥¥¥¥开始A←(60H)B←A考虑将A中内容用两个寄存器存放,然后便可对A的不同部分进行处理了。屏蔽A低四位(60H)←AA←B屏蔽A高四位(61H)←A结束解:ORL1000HMODE:MOVR0,#60HMOVXA,@R0MOVB,AANLA,#0F0HSWAPAMOVX@R0,AANLB,#0FHMOVA,BINCR0MOVX@R0,AEND

因为是外部数据传送,所以必须使用间接寻址方式,考虑工作寄存器更为快速方便。二、分支结构与分支程序设计分支结构分为三种基本形式:条件为真?过程S条件为真?S1YNYNS2条件k=?S2S1…Sn001n双向分支之一双向分支之二多向分支这个更常用解:本题关键是判a是正数,还是负数;根据ACC.7判断。

ORG1000HJBACC.7,ADDABSUBAB:CLRCSUBBA,BSJMPDONEADDAB:ADDA,BDONE:SJMP$END例2、设a存放在累加器A中,b存放在寄存器B中,要求按下式计算Y值,并将结果Y存于累加器A中,试编写程序。

a-b(a≥0)a+b(a<0)

a<0?A←a+bYNA←a-bY=开始结束这种简单程序可以不用列流程,而直接编程条件k=?S2S1…Sn001n多向分支书例4.2.7某条件的多值情况可按多向分支A>0?(FUNC)←AYNA←1开始结束A←(VAR)A=0?A←-1NY也可按多次两向分支先判断后赋值A<0?(FUNC)←AYNA←R0

开始结束A←(VAR)A=0?R0←-1NYR0←1第二次分支前在此处先赋值,但不可把值赋给A,因为A此处存储输入值,暂不能丢掉.先赋值后判断例3、根据R3的值,控制转发同8个分支程序R3=0,转向SUBR0R3=1,转向SUBR1…………R3=7,转向SUBR7一个采用多向分支的例题拟以多向分支的形式实现解:拟运用JMP@A+DPTR指令

MOVDPTR,#JMPTABMOVA,R3ADDA,R3JMP@A+DPTRJMPTAB:AJMPSUBR0;转移指令表

AJMPSUBR1……AJMPSUBR7三、循环结构与循环程序设计循环结构使程序简练,大大节省存储空间。循环程序包含四部分:1、初始化部分(循环计数器、变量置初值)2、循环处理部分(主体,需要重复执行的部分)3、循环控制部分(修改地址指针、修改变量、检测循环结束条件)4、循环结束部分(对结果分析、处理,存放结果)先处理,后判断:

开始初始化部分处理部分修改变量循环结束?结束部分结束YN先判断,后处理:

开始初始化部分修改变量循环结束?Y结束部分结束N处理部分常用于通过初始值进行判断的场合常用于根据处理的结果进行判断的场合循环结构的基本形式:单重循环、多重循环循环次数已知,可用计数器控制循环次数;循环次数未知,按问题条件控制循环是否结束。

(RESULT)←AYN开始结束A←0,R0←BLOCKR1←100R1=0?A←A+(R0)R1-1求和常用方式1、单循环程序(1)循环次数是已知的程序例1、设有100个单字节数据,连续存放在内部数据存储器中,起始地址为BLOCK(11H)单元;数据求和结果取为单字节数,存在RESULT(10H)单元。试编写程序。解:ORG1020HBLOCKDATA11HRESULTDATA10HMOVA,#0MOVR0,#BLOCKMOVR1,#100初始化部分LOOP:ADDA,@R0INCR0DJNZR1,LOOPMOVRESULT,ALP:SJMPLP循环体结束部分循环处理部分循环控制部分是先处理后判断,还是先判断后处理?

循环次数已知的程序设计靠计数器是否到达控制值来退出循环书例4.2.10典型的大循环里有分支转移课后自行消化.ORG1000HSTADADATA20HSLANGDATA1FHMOVR0,#STADA-1MOVB,#0FFHCRLOP:INCR0INCBMOVXA,@R0CJNEA,#0DH,CRLOPMOVSLANG,BSJMP$END(2)循环次数未知的程序例2、设用户用键盘输入长度不超过100字节的字符串放在8031单片机外部RAM以20H为首地址的连续单元,该字符串用回车符CR(‘CR’=0DH)作为结束标志,要求统计此字符串的长度并存入内部RAM的1FH单元中。解:从首单元开始取数,每取一数判断其是否为‘CR’,是则结束。

2、多重循环设计一个例子(手写)YN开始结束R2←#199B-1≠0?内循环250×2TB←#250R2-1≠0?外循环:199×(2T+内循环+2T)+1T=100297TYN四、查表程序设计所谓查表法,就是把事先计算或测得的数据按一定的顺序编制成数据表,存放在计算机的程序存储器中。查表程序的任务,就是根据给定的条件或被测参数的值,从表中查出所需要的结果。书例4.2.15(书中题目表达有问题请更正)该题的思考:怎样运用查表方式将表中数据一一读出?读出的数据用什么指令与KEY单元中的关键字比较?涉及到的判断分支有哪些?-----不等与相等的区别处理;始终未找到怎样处理?4.程序中为什么要PUSHACC?先讲流程,讲完流程再让学生看5分钟,并思考问题由于程序较复杂,视情讲解。非考核区域………………..MOVCA,@A+PCCJNEA,CHECK,A13个字节指令MOVR2,DPH2MOVR3,DPL2DONE:SJMPDONE2A1:POPACC2INCA1INCDPTR1DJNZR4,LOOP2MOVR2,#02MOVR3,#02AJMPDONE2TABLE:DB…………这个决定了查表地址偏移量为21不等与相等的区别处理判断循环,始终未找到的处理恢复地址偏移量通过查表指令将表中数据读出………………..MOVCA,@A+DPTRCJNEA,CHECK,A1MOVR2,DPHMOVR3,DPLDONE:SJMPDONEA1:POPACCINCAINCDPTRDJNZR4,LOOPMOVR2,#0MOVR3,#0AJMPDONETABLE:DB…………用DPTR不用管地址偏移量五、子程序设计

经常重复使用的程序宜设计成子程序。子程序在结构上应具有通用性和独立性,编写子程序应注意以下几点:子程序应取名,常用标号作为其名称,也代表子程序的入口地址。主程序调用子程序必须有LCALL等指令实现,子程序返回必须在末尾处执行RET等指令。调用子程序应特别注意保护现场和恢复现场。LCALL等指令只自动对PC指针进行保护和恢复,其它重要内容,需要客户自行编写现场保护与恢复的软件。调用子程序,要能正确传送参数,即要满足入口条件和出口条件。该程序几个特点:求平方通过子程序实现。子程序的平方通过查表程序实现。入口参数和出口参数都通过累加器A来进行传送。书例4.2.17-----看5分钟调用子程序时参数传送的三种方式:利用寄存器或片内存储单元直接传送参数。利用寄存器传送参数的地址。利用堆栈传送参数。子程序例程在HEX单元中存有两位十六进制数,试编程分别把它们转换成ASCII码,并存入ASC和ASC+1单元。比如存放的是0010,0100,把它看成十六制进数24H,就是分别找2与4的ASCII码,然后存入目的地址单元。子程序例程(较复杂)解:核心动作:十六制数的ASCII码转换可考虑采用子程序实现。HEXDATA20HASCDATA21HORG0100HPUSHHEXACALLHASC

温馨提示

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

评论

0/150

提交评论