汇编语言程序设计概述.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

14.1汇编语言程序设计概述汇编语言的特点及其语句格式汇编语言程序设计的特点汇编语言的特点及其语句格式以助记符表示的指令称为汇编语言1.汇编语言的特点*占用存储空间小,运行速度快。*汇编语言是面向计算机的,程序设计人员必须对计算机硬件有相当的了解。*能直接管理和控制硬件设备。*缺乏通用性,不易移植,编写较困难。2.汇编语言的语句格式[标号]:操作码[操作数];[注释]1)标号:语句地址的标志符号标号由1~8个ASCII字符组成,第一个字符必须是字母。不能使用本汇编语言已经定义了的符号作为标号,如指令助记符、伪指令以及寄存器的名称等。标号后面必须跟冒号。同一标号在一个程序中只能定义一次,不能重复定义。没有其它语句访问时,标号可以省略。2)操作码:规定语句执行的操作是汇编指令中唯一不能空缺的3)操作数:给指令的操作提供数据或数据所在的地址操作数的数量0~3个。多于一个时,操作数之间用逗号分隔。4)注释:不属于语句的功能部分,便于阅读程序。以分号开始,长度不限,另起一行时也必须以分号开始。5)分隔符*冒号(:)用于标号后*空格()用于操作码和操作数之间*逗号(,)用于操作数之间*分号(;)用于注释前数据的存放、寄存器和工作单元的使用等要由设计者安排。要求设计人员对所使用计算机的硬件结构有较详细的了解,特别是对各类寄存器、端口、定时器/计数器、中断等内容能熟练掌握,以便在程序设计中使用。程序设计的技巧性较高,需要软件与硬件的结合。汇编语言程序设计的特点顺序程序分支程序循环程序4.2单片机汇编语言程序的基本结构形式程序执行时一条一条按顺序执行指令例三字节无符号数字节加法被加数在内部RAM52H、51H、50H中(低字节在低地址中),加数在内部RAM55H、54H、53H中,要求把相加结果存放在52H、51H、50H中,进位存放在位地址区的00H中。ORG0000HMOVR0,#50H;被加数首址MOVR1,#53H;加数首址MOVA,@R0;取被加数低字节ADDA,@R1;被加数与加数相加MOV@R0,A;存低字节相加结果INCR0;调整地址指针,指向中间字节INCR1顺序程序MOVA,@R0;取被加数中间字节ADDCA,@R1;被加数与加数带进位(低字节的进位)加MOV@R0,A;存中间字节相加结果INCR0;调整地址指针,指向高字节INCR1MOVA,@R0;取被加数高字节ADDCA,@R1;被加数与加数带进位相加MOV@R0,A;存高字节相加结果MOV00H,C;高字节相加的进位位送00HSJMP$END1.单分支程序用条件转移指令实现JZ、JNZ、CJNE、DJNZ,或用位寻址指令实现:JC、JNC、JB、JNB、JBC例4.2假定在外部RAM中有ST1、ST2和ST3共3个连续单元,其中ST1和ST2单元分别存放着两个8位无符号二进制数,要求找出其中的大数并存入ST3单元中。分支程序ST1EQU0050HORG0000HSTART:MOVDPTR,#ST1;设置数据指针MOVXA,@DPTR;取第一个数MOVR2,A;第一个数存R2INCDPTR;指向第二个数MOVXA,@DPTR;取第二个数CLRC;清进位标志SUBBA,R2;第二个数-第一个数,A中是差JNCBIG1;第二个数大转移XCHA,R2;第一个数大,A中为第一个数BIG0:INCDPTR;指向ST3MOVX@DPTR,A;存大数HERE:SJMPHEREBIG1:MOVXA,@DPTR;第二个数大,取第二个数SJMPBIG0END2.多分支程序MCS-51没有多分支转移指令,不能用一条指令实现分支。1)使用CJNE指令逐次比较例4.3某温度控制系统,采集的温度值(Ta)放在累加器A中。在内部RAM54H单元存放控制温度下限值(T54),在55H单元存放控制温度上限值(T55)。若TaT55,程序转向JW(降温处理程序);若TaT54,程序转向SW(升温处理程序);若T55≥Ta≥T54,则程序转向FH(返回主程序)。;如果转升温程序,出口R0=2;如果转降温程序,出口R0=0;温度在设定范围内,出口R0=1。TAEQU43;采集的温度值T54EQU42;控制温度下限值T55EQU45;控制温度上限值ORG0000HMOVSP,#60H;设置堆栈指针MOVR0,#01H;温度控制程序出口标志初值MOVA,#TA;采集的温度值送AMOV54H,#T54;取控制温度下限值MOV55H,#T55;取控制温度上限值LCALLTEMPR;调用温度控制子程序HERE:SJMPHERE;温度控制子程序TEMPR:CJNEA,55H,LOOP1;与上限值比,不相等转移AJMPFH;采集的温度值与温度上限值相等,返回LOOP1:JNCJW;采集的温度值大于温度上限值,转降温程序JWCJNEA,54H,LOOP2;与温度下限值比,不等转移AJMPFH;采集的温度值与温度下限值相等,返回LOOP2:JCSW;采集的温度值小于温度下限值,转升温程序SWFH:RETJW:DECR0;温度控制程序出口标志值减1RETSW:INCR0;温度控制程序出口标志值加1RETEND2)使用查地址表方法实现多分支程序转移在程序中建立一个差值表,将各分支入口地址与该表首地址的差值按顺序排列其中。差值表的首地址送DPTR,分支序号值送A中。查表后用转移指令JMP@A+DPTR进行分支。例4.4有四个分支程序段BR0分支程序段:从内部RAM取数BR1分支程序段:从外部RAM低256字节范围取数BR2分支程序段:从外部RAM4K字节范围取数BR3分支程序段:从外部RAM64K字节范围取数R0中存放取数地址低8位,R1中存放高8位地址。R3中存放分支序号值,BRTAB为差值表首址。BR0-BRTAB~BR3-BRTAB为差值;用查地址表方法实现多分支程序转移ORG0000HMOVA,R3;取分支值MOVDPTR,#BRTAB;差值表的首址MOVCA,@A+DPTR;查表JMP@A+DPTR;转分支程序BRTAB:DB04H;BR0-BRTABDB07H;BR1-BRTABDB0AH;BR2-BRTABDB15H;BR3-BRTABBR0:MOVA,@R0;从内部RAM取数SJMPBREBR1:MOVXA,@R0;从外部RAM低256B取数SJMPBREBR2:MOVA,R1;取高8位地址ANLA,#0FH;屏蔽最高4位ANLP2,#0F0H;屏蔽P2的低4位ORLP2,A;更新P2的低4位MOVXA,@R0;从外部RAM4KB取数SJMPBREBR3:MOVDPL,R0;取低8位地址MOVDPH,R1;取高8位地址MOVXA,@DPTR;从外部RAM64KB取数BRE:SJMP$END3)使用查转移指令表的方法实现多分支程序转移用转移指令构成一个表ORG0000HMOVA,R3;分支序号值RLA;分支序号乘2MOVDPTR,#BRTAB;转移指令表首址JMP@A+DPTR;查表BRTAB:AJMPBR0;转移指令表,2字节AJMPBR1AJMPBR2AJMPBR3BR0:MOVA,@R0;从内部RAM取数SJMPBREBR1:MOVXA,@R0;从外部RAM低256B取数SJMPBREBR2:MOVA,R1;取高8位地址ANLA,#0FH;屏蔽最高4位ANLP2,#0F0H;屏蔽P2的低4位ORLP2,A;更新P2的低4位,即12位地址的高4位,;用P2口的P2.0~P2.3送出MOVXA,@R0;指令送出低8位地址,;从外部RAM4KB取数SJMPBREBR3:MOVDPL,R0;取低8位地址MOVDPH,R1;取高8位地址MOVXA,@DPTR;指令送出16位地址;从外部RAM64KB取数BRE:SJMP$END例4.5假定键盘上有三个操作键,功能说明如下表,键值在A中。键功能键值处理程序读数据01DS写数据02XS插入03CR有关此键盘的译码程序段:MOVDPTR,#3000H;3000H为基址CLRC;进位位CY清0RLCA;A带进位位循环左移JMP@A+DPTR;读操作键处理程序3000H3001H3002HAJMPDS;转读数据程序3003H3004HAJMPXS;转写数据程序3005H3006HAJMPCR;转插入程序4)通过堆栈操作实现多分支程序转移通过堆栈操作,把分支程序的入口地址压入堆栈中,然后利用返回指令把分支程序的入口地址装入PC,实现了分支程序的转移。例假定分支程序的入口地址表首址为BRTEAB,分支转移序号在R3中•通过堆栈操作实现多分支程序转移ORG0000HMOVSP,#60H;设置堆栈指针MOVDPTR,#BRTAB;分支程序入口地址表MOVA,R3;取分支值RLA;分支值乘2MOVR1,A;暂存A(分支值乘2)INCA;(分支值乘2)+1MOVCA,@A+DPTR;取低位地址(在表高地址)PUSHA;低8位地址入栈MOVA,R1;取暂存值(分支值乘2)MOVCA,@A+DPTR;取高位地址(在表低地址)PUSHA;高8位地址入栈RET;分支入口地址装入PCBR0:MOVA,@R0;从内部RAM取数SJMPBREBR1:;略,同前BR2:;略,同前BR3:;略,同前BRE:SJMP$BRTAB:DWBR0,BR1,BR2,BR3END*循环初始部分*循环体*循环控制部分*循环结束部分例4.6设有一字符串以回车符为结束标志,并存放在内部RAM从40H单元开始的连续存储单元中,编写测试字符串长度的程序。(回车符的ASCII码为0DH,字符串长度不超过255)循环程序;结果:字符串长度在R2中(回车符不计入),回车符地址在R0中。ORG0000HMOVSP,#60HLCALLTESTSJMP$TEST:MOVR2,#00H;长度计数器初值MOVR0,#40H;字符串指针初值LOOP:CJNE@R0,#0DH,GOON;与回车符比,不等转移RETGOON:INCR2;不是回车符,长度计数器加1INCR0;指向下一个字符LJMPLOOP;继续比较END例4.7把内部RAM中起始地址为data1的数据串传送到外部RAM以buffer为首地址的区域,直到发现“$”字符的ASCII码为止。数据串最大长度为32个字节。;“$”不传送BUFFEREQU4000H;外部RAM区首址(目标)DATA1EQU40H;内部RAM区首址(源)ORG0000HLJMPMAINORG0030HMAIN:MOVSP,#60H;设置堆栈区LCALLROUT1;调用子程序SJMP$ROUT1:MOVR0,#DATA1;子程序,源数据区起始地址MOVDPTR,#BUFFER;目标数据区起始地址MOVR1,#20H;数据串最大长度LOOP:MOVA,@R0;取源数据CJNEA,#24H,LOOP2;是“$”符号吗?SJMPLOOP1;是,则结束LOOP2:MOVX@DPTR,A;不是“$”则数据传送INCDPTR;指向下一个目标地址INCR0;指向下一个源地址DJNZR1,LOOP;数据串长度-1=0?不为0转移LOOP1:RET;为0则结束子程序END;“$”传送BUFFEREQU4000H;外部RAM区首址(目标)DATA1EQU40H;内部RAM区首址(源)ORG0000HLJMPMAINORG0030HMAIN:MOVSP,#60H;设置堆栈区LCALLROUT1;调用子程序SJMP$ROUT1:MOVR0,#DATA1;子程序,源数据区起始地址MOVDPTR,#BUFFER;目标数据区起始地址MOVR1,#20H;数据串最大长度LOOP:MOVA,@R0;取源数据MOVX@DPTR,A;数据传送CLRC;清借位SUBBA,#24H;A的内容是“$”符号吗?JZLOOP1;是则结束INCDPTR;不是“$”,指向下一个目标地址DJNZR1,LOOP;数据串长度-1=0?不为0转移LOOP1:RET;为0则结束子程序END算术运算程序数制转换程序定

1 / 50
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功