




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章汇编语言程序设计本章学习目标:了解汇编语言程序设计步骤。掌握简单的顺序程序设计。掌握简单的分支程序设计。掌握简单的循环程序设计。掌握简单的子程序设计。掌握一些常用程序设计。4.1汇编语言程序设计概述4.1.1程序设计语言1.机器语言机器语言是计算机唯一能识别和执行的语言,用其编写的程序执行效率最高,速度最快,但由于指令的二进制代码很难记忆和辨认,给程序的编写、阅读和修改带来很多困难,所以几乎没有人直接使用用机器语言来编写程序。2.汇编语言为了容易理解和记忆计算机的指令,人们用英文助记符表示指令,用助记符表示的指令就是符号语言或汇编语言。汇编语言特点:(1)面向机器的语言,程序设计员须对MCS-51的硬件有相当深入的了解。(2)助记符指令和机器指令一一对应,用汇编语言编写的程序效率高,占用存储空间小,运行速度快,用汇编语言能编写出最优化的程序。能直接管理和控制硬件设备(功能部件),它能处理中断,也能直接访问存储器及I/O接口电路。(3)汇编语言和机器语言都脱离不开具体机器的硬件,均是面向“机器”的语言,缺乏通用性。3.高级语言高级语言是一种面向算法、过程和对象的程序设计语言,它采用更接近人们自然语言和习惯的数学表达式及直接命令的方法来描述算法、过程和对象。高级语言的语句直观、易学、通用性强,便于推广、交流,但高级语言编写的程序经编译后所产生的目标程序大,占用内存多,运行速度较慢。4.1.2汇编语言程序设计步骤1.分析题意,明确要求。2.确定算法。根据实际问题的要求、给出的条件及特点,找出规律性,最后确定所采用的计算公式和计算方法,这就是一般所说的算法。算法是进行程序设计的依据,它决定了程序的正确性和程序的指令。处理框流程线判断框起止框3.画程序流程图,用图解来描述和说明解题步骤。4.分配内存工作单元,确定程序与数据区存放地址。5.编写源程序。6.程序优化。7.上机调试、修改和最后确定源程序。4.1.3汇编语言格式与伪指令1.汇编程序格式[标号:]操作码助记符[目的操作数][,源操作数][;注释]例如:CLEAR:MOVA,#00H;将0送入A中2.伪指令伪指令不能命令CPU执行某种操作,也没有对应的机器代码,它的作用仅用来给汇编程序提供某种信息。(1)ORG汇编起始地址命令在汇编语言源程序的开始,通常都用一条ORG伪指令来实现规定程序的起始地址。例如ORG2000HSTART: MOVA,#00H ┋规定标号START代表地址为2000H开始。(2)END汇编终止命令
汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条END命令,且位于程序的最后。(3)DB(DefineByte)定义字节命令在程序存储器的连续单元中定义字节数据。例如ORG2000HDB30H,40H,24,“C”,“B”汇编后: (2000H)=30H
(2001H)=40H
(2002H)=18H(10进制数24) (2003H)=43H(字符“C”的ASCII码) (2004H)=42H(字符“B”的ASCII码)(4)DW(DefineWord)定义数据字命令从指定的地址开始,在程序存储器的连续单元中定义16位的数据字。例如ORG2000HDW1246H,7BH,10汇编后:(2000H)=12H ;第1个字(2001H)=46H(2002H)=00H ;第2个字(2003H)=7BH(2004H)=00H ;第3个字(2005H)=0AH(2005H)=0AH(5)EQU(Equate)赋值命令用于给标号赋值。赋值以后,其标号值在整个程序有效。例如:
TESTEQU2000H
表示标号TEST=2000H,在汇编时,凡是遇到标号TEST时,均以2000H来代替。(6)BIT(位地址赋值)伪指令该语句的功能是把BIT右边的位地址赋给它左边的“字符名称”。因此,BIT语句定义过的“字符名称”是一个符号位地址。例如:ORG0030HA1BIT00HA2BITP0.04.2顺序程序设计
例4-1
有两个三字节无符号数,其中一个加数在内部RAM的50H、51H、52H单元中,另一个加数在内部RAM的53H、54H和55H单元中,要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区00H位中。解:ORG0010HMOVR0,#52H;一个加数的低字节地址
MOVR1,#55H;另一个加数的低字节地址
MOVA,@R0ADDA,@R1;低字节相加
MOV@R0,A;存放低字节相加结果
DECR0DECR1MOVA,@R0ADDCA,@R1;中间字节带进位相加
MOV@R0,A;存放中间字节相加结果
DECR0DECR1MOVA,@R0ADDCA,@R1;高字节带进位相加
MOV@R0,A;存放高字节相加结果
MOV00H,C;进位送00H位保存
SJMP$END4.3分支程序设计例4-2
累加器A中有一单字节有符号数,求其二进制补码。解:正数补码是其本身,负数补码是其反码加1。因此,程序应首先判断被转换数的符号,负数进行转换,正数即为补码。
ORG0020HJNBACC.7,RETURN;A>0,不需要转换
MOVC,ACC.7;符号位保存
CPLA;A求反,加1ADDA,#1MOVACC.7,C;符号位存A的最高位RETURN:RET例4-3设自变量为一无符号数,存放在内部RAM的VAX单元,函数Y存放在FUNC单元。请编写满足如下关系的程序:ORG0200HVARDATA20HFUNCDATA21HMOVA,VAR;A←(20H)
CJNEA,#50,NEXT1;建立CyNEXT1:JNCDONE;若X≥50,则DONECJNEA,#20H,NEXT2;建立CyNEXT2:JCNEXT3;若X<20,则NEXT3RLARLAADDA,20H;A←5XSJMPDONENEXT3:RLA;A←2XDONE:MOVFUNC,A;21H←ASJMP$END4.4循环程序设计
例4-4设单片机8031内部RAM起始地址30H的数据块中有64个无符号数。试编写程序使它们按从小到大的顺序排列。ORG1000HBUBBLE:MOVR0,#30H;置数据块指针R0MOVR2,#64;块长送R2CLR7FH;交换标志2FH.7清零
DECR2;块长—1为比较次数BULOOP:MOV20H,@R0;eN送20HMOVA,@R0;eN送AINCR0MOV21H,@R0;eN-1送21HDECACJNEA,21H,LOOP;(20H)和(21H)比较
LOOP:JCBUNEXT;若(20H)<(21H),则BUNEXTMOV@R0,20H;若(20H)≥(21H),则两者交换
DECR0MOV@R0,21HINCR0;恢复数据块指针
SETB7FH;置“1”交换标志位BUNEXT:DJNZR2,BULOOP;若一次冒泡未完,则BULOOPJB7FH,BUBBLE;若交换标志位为1,则BUBBLESJMP$;停机
END例4-5
外部RAM从2000H到2100H有一数据块,请编写将它们传送到从3000H到3100H区域的程序。ORG0500HMOVDPTR,#3000H;目标地址送3000HPUSHDPL;目标地址送栈PUSHDPHMOVDPTR,#2000H;源地址送DPTRMOVR2,#01H;块长送R3R2MOVR3,#01HLOOP:MOVXA,@DPTR;源数送AINCDPTRMOVR5,DPH;源针加1后送R5R4MOVR4,DPLPOPDPH;目标地址送DPTRPOPDPLMOVX@DPTR,A;送数INCDPTR;目标地址加1PUSHDPL;送栈PUSHDPHMOVDPH,R5;源针送DPTRMOVDPL,R4CLRC;Cy清零MOVA,R2;R2-1送R2SUBBA,#01HMOVR2,AMOVA,R3;R3-Cy送R3SUBBA,#00HMOVR3,AORLA,R2;R3∨R2送AJNZLOOP;R3∨R2<>0,则LOOPSJMP$;否则,停机END例4-6设晶振频率为6MHz,试编写能延时20ms的子程序。解:ORG0D00HDELAY:MOVR7,#49DELAY2:MOVR6,#64HDELAY1:DJNZR6,DELAY1NOPDJNZR7,DELAY2NOPRET4.5子程序的设计例4-7
设MDA和MDB内有两数a和b,请编写求c=并把c送入MDC的程序。设a和b皆为小于10的整数。ORG1000HMDADATA20HMDBDATA21HMDCDATA22HMOVA,MDA;入口参数a送AACALLSQR;求a2MOVR1,A;a2送R1MOVA,MDB;入口参数b送AACALLSQR;求a2ADDA,R1;a2+b2送AMOVMDC,A;存入MDCSJMP$;停机
SQR:ADDA,#01H;地址调整
MOVCA,@A+PC;查平方表
RET;返回SQRTAB:DB0,1,4,9,16DB25,36,49,64,81END例4-8求两个无符号数据块中的最大值。数据块的起始地址分别为内部RAM20H、30H,20H、30H中存放数据块的长度(长度不大于15),把两个数据块中的最大值分别存入51H、52H中。ORG2000HMOVSP,#2FH;设堆栈指针
MOVR1,#20H;取第一数据块起始地址送入R1ACALLQMAX;第一次调用求最大值子程序
MOV51H,A;第一数据块最大值存入51H中
MOVR1,#30H;取第二数据块起始地址送入R1ACALLQMAX;第二次调用求最大值子程序
MOV52H,A;第二数据块最大值存入52H中
ORG2200HQMAX:MOVA,@R1;取数据块长度
MOVR2,A;R2做计数器
CLRA;A清零,准备作比较LOOP1:INCR1;指向下一个数据地址
CLRC;Cy清零,准备做减法
SUBBA,@R1;用减法作比较
JNCLOOP2;若A大,则转入LOOP3MOVA,@R1;若A小,则将大数送入A中
SJMPLOOP3;无条件转LOOP3LOOP2:ADDA,@R1;恢复A中值LOOP3:DJNZR2,LOOP1;计数器减1,不为零,继续比较
RET;比较完,子程序返回4.6常用程序设计4.6.1查表程序设计查表就是根据自变量x,在表格中寻找y,使y=f(x)。对于MCS-51单片机,数据表格一般存放于程序存储器内。采用MCS-51汇编语言进行查表尤为方便,它有两条专门的查表指令:MOVCA,@A+DPTRMOVCA,@A+PC例4-9设在片外RAM的20H单元中有一数x,其值范围为0~9,要求利用查表方法求此数的平方值y并把结果存入片外RAM的21H,试编写相应程序。解:ORG0400HMOVR0,#20H;R0←20HMOVXA,@R0;A←xMOVDPTR,#TABMOVCA,@A+DPTR;A←yMOVR0,#21H;R0←21HMOVX@R0,A;y值送21H单元SJMP$;停机TAB:DB0,1,4,9,16DB25,36,49,64,81END例4-11设有一个巡回检测报警装置,需对16路输入进行检测,每路有一个最大允许值,为双字节。装置运行时,需根据测量的路数,找出每路的最大允许值。看输入值是否大于最大允许值,如大于就报警。根据上述要求,编制一个查表程序。解:TB3:MOVA,R2ADDA,R2;A←(R2)×2MOVR3,A;保存指针ADDA,#6;查第一字节MOVCA,@A+PCXCHA,R3ADDA,#3MOVCA,@A+PC;查第二字节MOVR4,ARETTAB3:DW1520,3456,2456,2567;最大值表
DW5560,23366,9756,3457DW2694,2567,4753,4673DW2577,8989,25475,365534.6.2运算程序设计例4-12已知以内部RAM中BLOCK1和BLOCK2为起始地址的存储区中分别有5字节无符号被减数和减数(低位在前,高位在后)。请编写减法子程序令他们相减,并把差放入BLOCK1为起始地址的存储单元。解:ORG0A00HSBY:MOVR0,#BLOCK1;被减数起始地址送R0MOVR1,#BLOCK2;减数起始地址送R1MOVR2,#05H;字长送R2CLRC;Cy清零LOOP:MOVA,@R0;被减数送ASUBBA,@R1;相减,形成CyMOV@R0,A;存差
INCR0;修改被减数地址指针
INCR1;修改减数地址指针
DJNZR2,LOOP;若未完,则LOOPRETEND例4-13已知两个8位无符号乘数分别放在30H和31H单元中,试编出令它们相乘并把积的低8位放入32H单元、积的高8位放入33H单元的程序。解:ORG0100HMOVR0,#30HMOVA,@R0INCR0MOVB,@R0MULABINCR0MOV@R0,AINCR0MOV@R0,BSJMP$END4.6.3码制转换程序设计
例4-14已知R0低4位有一个十六进制数(0~F中的一个),请编写能把它转换成相应ASCII码并送入R0的程序。解:由ASCII码字符表可知0~9的ASCII码为30H~39H,A~F的ASCII码为41H~46H。因此,计算求解的思路是:若R0<=9,则R0内容只需要加30H;若R0>9,则R0需加37H。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论