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

下载本文档

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

文档简介

1、3.4 3.4 汇编语言程序设计汇编语言程序设计 80c5180c51汇编语言语句结构的基本格式汇编语言语句结构的基本格式 伪指令的功能和应用伪指令的功能和应用 汇编的概念汇编的概念 程序设计的步骤和基本方法程序设计的步骤和基本方法 顺序程序顺序程序 分支程序分支程序 循环程序循环程序 查表程序查表程序 散转程序散转程序3.4.1 3.4.1 汇编程序汇编程序伪指令伪指令 在汇编时起控制作用,自身并不产生机器在汇编时起控制作用,自身并不产生机器码,而仅是为汇编服务的一些指令,称为伪指码,而仅是为汇编服务的一些指令,称为伪指令。伪指令不属于令。伪指令不属于80c5180c51指令系统。指令系统。

2、 常用的伪指令有以下几种:常用的伪指令有以下几种: 起始伪指令起始伪指令 org(origin)org(origin) 功能:规定功能:规定orgorg下面目标程序的起始地址。下面目标程序的起始地址。格式:格式:org 16org 16位位地址地址功能:将一个数据或特定的汇编符号赋予规定功能:将一个数据或特定的汇编符号赋予规定 的字符名称。的字符名称。 结束伪指令结束伪指令 endend功能:汇编语言源程序的结束标志。功能:汇编语言源程序的结束标志。 在在endend后面的指令,汇编程序不再处理后面的指令,汇编程序不再处理。格式:格式:endend 等值伪指令等值伪指令 equequ(equa

3、teequate)格式:格式:字符名称字符名称 equequ 数据或汇编符号数据或汇编符号 数据地址赋值伪指令数据地址赋值伪指令 datadata格式:格式:字符名称字符名称 datadata 表达式表达式功能:将数据地址或代码地址赋予规定的功能:将数据地址或代码地址赋予规定的 字符名称。字符名称。 定义字节伪指令定义字节伪指令dbdb(define bytedefine byte)格式:格式:db 8db 8位二进制数表位二进制数表功能:从指定的地址单元开始,定义若干功能:从指定的地址单元开始,定义若干 个个8 8位内存单元的数据。位内存单元的数据。 数据与数据之间用数据与数据之间用“,”分

4、割。分割。格式:格式:字符名称字符名称 bitbit 位地址位地址 定义字伪指令定义字伪指令dwdw(define worddefine word)格式:格式:dw 16dw 16位二进制数表位二进制数表功能:从指定的地址单元开始,定义功能:从指定的地址单元开始,定义 若干个若干个1616位数据。位数据。 定义位地址伪指令定义位地址伪指令bitbit功能:将位地址赋予所规定的字符名称。功能:将位地址赋予所规定的字符名称。汇编语言基本概念汇编语言基本概念 将汇编语言源程序转换为计算机所能识将汇编语言源程序转换为计算机所能识别的机器语言代码程序的过程称为汇编。别的机器语言代码程序的过程称为汇编。

5、汇编可分为:汇编可分为: 手工汇编手工汇编 计算机汇编计算机汇编 汇编和调试汇编和调试程序设计的基本方法程序设计的基本方法编写程序要求:编写程序要求: 不仅要完成规定的功能任务,而且还要求:不仅要完成规定的功能任务,而且还要求: 执行速度快执行速度快、占用内存少占用内存少、条理清晰条理清晰、 阅读方便阅读方便、便于移植便于移植、巧妙而实用巧妙而实用。 一般应按以下几个步骤进行:一般应按以下几个步骤进行: 分析问题,确定算法或解题思路分析问题,确定算法或解题思路 画流程图画流程图 编写源程序编写源程序 顺序程序是指按顺序依次执行的程序,顺序程序是指按顺序依次执行的程序,也称为简单程序或直线程序。

6、也称为简单程序或直线程序。 顺序程序结构虽然比较简单,但也能完成顺序程序结构虽然比较简单,但也能完成一定的功能任务,是构成复杂程序的基础。一定的功能任务,是构成复杂程序的基础。 3.4.2 3.4.2 顺序程序顺序程序cont: movcont: mov a,r0 a,r0; ;读低读低8 8位位cplcpl a a; ;取反取反addadd a,#1 a,#1; ;加加1 1movmov r2,a r2,a; ;存低存低8 8位位movmov a,r1 a,r1; ;读高读高8 8位位cplcpl a a; ;取反取反addcaddc a,#80h a,#80h; ;加进位及符号位加进位及符

7、号位mov r3,amov r3,a; ;存高存高8 8位位retret; ;【例】【例】 已知已知1616位二进制负数存放在位二进制负数存放在r1r0r1r0中,中, 试求其补码,并将结果存在试求其补码,并将结果存在r3r2r3r2中。中。解:二进制负数的求补方法可归结为解:二进制负数的求补方法可归结为“求反加求反加1”1”,符号,符号位不变。利用位不变。利用cplcpl指令实现求反;加指令实现求反;加1 1时,则应低时,则应低8 8位先加位先加1 1,高高8 8位再加上低位的进位。注意这里不能用位再加上低位的进位。注意这里不能用incinc指令,因为指令,因为incinc指令不影响标志指令

8、不影响标志位。位。程序如下:程序如下: 根据不同条件转向不同的处理程序,这根据不同条件转向不同的处理程序,这种结构的程序称为分支程序。种结构的程序称为分支程序。 80c5180c51指令系统中的指令系统中的条件转移指令条件转移指令、比比较转移指令较转移指令和和位转移指令位转移指令,可以实现分支程,可以实现分支程序。序。3.4.3 3.4.3 分支程序分支程序 s0s0单独按下,单独按下, 红灯亮红灯亮, ,其余灯其余灯灭;灭; s1 s1单独按下,单独按下, 绿灯亮绿灯亮, ,其余其余灯灯灭;灭; 其余情况,其余情况, 黄灯亮。黄灯亮。【例】已知电路如图【例】已知电路如图4-54-5所示,要求

9、实现:所示,要求实现:解:程序如下解:程序如下sgnl:anl p1,#11100011bsgnl:anl p1,#11100011b; ;红绿黄灯灭红绿黄灯灭 orl p1,#00000011borl p1,#00000011b; ;置置p1.0p1.0、p1.1p1.1输入态输入态, , p1.5p1.5p1.7p1.7状态不变状态不变sl0: jnb p1.0,sl1sl0: jnb p1.0,sl1 ;p1.0=0,s0;p1.0=0,s0未按下未按下, ,转判转判s1s1 jnb p1.1,red jnb p1.1,red ;p1.0=1,s0;p1.0=1,s0按下按下; ;且且p

10、1.1=0,s1p1.1=0,s1未按下未按下, ,转红灯亮转红灯亮yelw:setb p1.4yelw:setb p1.4 ; ;黄灯亮黄灯亮 clr p1.2clr p1.2 ; ;红灯灭红灯灭 clr p1.3clr p1.3 ; ;绿灯灭绿灯灭 sjmp sl0sjmp sl0 ; ;转循环转循环sl1: jnb p1.1,yelwsl1: jnb p1.1,yelw ;p1.0=0,s0;p1.0=0,s0未按下未按下;p1.1=0,s1;p1.1=0,s1未按下未按下, ,转黄灯亮转黄灯亮gren:setb p1.3gren:setb p1.3 ; ;绿灯亮绿灯亮 clr p1.2

11、clr p1.2 ; ;红灯灭红灯灭 clr p1.4clr p1.4 ; ;黄灯灭黄灯灭 sjmp sl0sjmp sl0 ; ;转循环转循环red: setb p1.2red: setb p1.2 ; ;红灯亮红灯亮 clr p1.3clr p1.3 ; ;绿灯灭绿灯灭 clr p1.4clr p1.4 ; ;黄灯灭黄灯灭 sjmp sl0sjmp sl0 ; ;转循环转循环 课堂练习题:课堂练习题: 电路及灯亮灭要求同上述【例】题,其中第电路及灯亮灭要求同上述【例】题,其中第3 3、4 4两条指令两条指令jnb p1.0jnb p1.0和和jnb p1.1jnb p1.1按下列要求修改,

12、按下列要求修改,试重新编程。试重新编程。 jbjbp1.0p1.0,jbjbp1.1p1.1, jbjbp1.0p1.0, jnb p1.1jnb p1.1, jnb p1.0jnb p1.0, jbjbp1.1p1.1, 循环程序一般包括以下几个部分:循环程序一般包括以下几个部分: 循环初值;循环初值; 循环体;循环体; 循环修改;循环修改; 循环控制;循环控制;以上四部分可以有两种组织形式,其以上四部分可以有两种组织形式,其结构如下结构如下图所图所示。示。 3.4.4 3.4.4 循环程序循环程序 【例】【例】设设xixi均为单字节数,并按顺序存放在以均为单字节数,并按顺序存放在以50h5

13、0h为首为首地址的内地址的内ramram存储单元中,数据长度(个数)存储单元中,数据长度(个数)n n存在存在r2r2中,试编程求和中,试编程求和s=xs=x1 1+x+x2 2+x+xn n,并将,并将s s(双字节)(双字节)存放在存放在r3r4r3r4中,(设中,(设s s6553665536)。)。解:程序如下:解:程序如下: sxn: mov r2,#nsxn: mov r2,#n ;置数据长度置数据长度( (循环次数循环次数) ) mov r3,#00h mov r3,#00h ;和单元和单元( (高高8 8位位) )清清0 0 mov r4,#00h mov r4,#00h ;和

14、单元和单元( (低低8 8位位) )清清0 0 mov r0,#50h mov r0,#50h ;求和数据区首址求和数据区首址loop:mov a,r4loop:mov a,r4 ;读前次低读前次低8 8位和位和 add a,r0add a,r0 ;低低8 8位累加位累加 mov r4,amov r4,a ;存低存低8 8位和位和 clr a clr a ; addc a,r3 addc a,r3 ;高高8 8位加进位位加进位 mov r3,a mov r3,a ;存高存高8 8位和位和 inc r0 inc r0 ;指向下一数据指向下一数据 循环修改循环修改 djnz r2,loop djn

15、z r2,loop ;判判n n个数据累加完否?个数据累加完否? 循环控制循环控制 ret ret ;退出循环退出循环 退出循环退出循环 置置循循环环初初值值循循环环体体【例】编写延时【例】编写延时10ms10ms子程序子程序,fosc=12mhz,fosc=12mhz。 解解:fosc=12mhz:fosc=12mhz,一个机器周期为,一个机器周期为1 1 s s。dy10ms:mov r6,#20 dy10ms:mov r6,#20 ; ; 置外循环次数置外循环次数dlp1: mov r7,#250 dlp1: mov r7,#250 ; ; 置内循环次数置内循环次数dlp2: djnz

16、r7,dlp2 dlp2: djnz r7,dlp2 ; 2; 2机周机周250 =500250 =500机周机周 djnz r6,dlp1 djnz r6,dlp1 ; 500; 500机周机周20= 1000020= 10000机周机周 ret ret ; ;说明:说明:mov rnmov rn指令为指令为1 1个机器周期个机器周期; ; djnz djnz指令为指令为2 2个机器周期个机器周期; ; ret ret指令为指令为2 2个机器周期个机器周期; ; (2 2机周机周250)+1+2250)+1+220+1+220+1+21 1 s s/ /机周机周=10063=10063 s1

17、0mss10ms【课堂练习题】【课堂练习题】 按下列要求编写延时子程序:按下列要求编写延时子程序: 延时延时2ms2ms,fosc=6mhzfosc=6mhz; 延时延时5ms5ms,fosc=12mhzfosc=12mhz; 延时延时10s10s,fosc=12mhzfosc=12mhz; 设设80c5180c51单片机的单片机的p1p1口作为输出口,经驱动电路口作为输出口,经驱动电路74ls240(874ls240(8反相三态缓冲反相三态缓冲/ /驱动器驱动器) )接接8 8只发光二极管,如下只发光二极管,如下图所示。当输出位为图所示。当输出位为“1”1”时,发光二极管点亮,输出位为时,发

18、光二极管点亮,输出位为“0”0”时为暗。试编程实现:每个灯闪烁点亮时为暗。试编程实现:每个灯闪烁点亮1010次,再转移次,再转移到下一个灯闪烁点亮到下一个灯闪烁点亮1010次,循环不止。次,循环不止。 【例】【例】 编制一个循环闪烁灯的程序。编制一个循环闪烁灯的程序。flash:mov a,#01hflash:mov a,#01h ; ;置灯亮初值置灯亮初值fsh0: mov r2,#0ahfsh0: mov r2,#0ah; ;置闪烁次数置闪烁次数flop: mov p1,aflop: mov p1,a; ;点亮点亮 lcall dy1slcall dy1s; ;延时延时1s1s mov p

19、1,#00h mov p1,#00h; ;熄灭熄灭 lcall dy1slcall dy1s; ;延时延时1s1s djnz r2,flop djnz r2,flop; ;闪烁闪烁1010次次 rlrl a a; ;左移一位左移一位 sjmp fsh0sjmp fsh0; ;循环循环 retret; ;解:程序如下:解:程序如下:延时子程序可根据延时长短,自行编写。延时子程序可根据延时长短,自行编写。 【课堂练习题】【课堂练习题】 根据上图电路,设计灯亮移位程序,根据上图电路,设计灯亮移位程序,要求要求8 8只发光二极管每次点亮一个,点亮时只发光二极管每次点亮一个,点亮时间为间为250ms25

20、0ms,顺序是从下到上一个一个地循,顺序是从下到上一个一个地循环点亮。设环点亮。设fosc=6fosc=6mhzmhz。【例】【例】已知已知p1p1口数据每隔口数据每隔10ms10ms刷新一次,试求其刷新一次,试求其1s1s内的平均值内的平均值, , 平均值存平均值存30h30h。 解:本题需求解:本题需求100100个数据的平均值,个数据的平均值, 一般有两种方法:一般有两种方法: 一种是全部累加后再平均;一种是全部累加后再平均; 另一种是边平均边累加,另一种是边平均边累加, 现给出两种方法的程序。现给出两种方法的程序。avrg1: mov r2,#0avrg1: mov r2,#0 ; ;

21、低低8 8位累加寄存器清位累加寄存器清0 0 mov r3,#0 mov r3,#0 ; ;高高8 8位累加寄存器清位累加寄存器清0 0 mov r4,#100 mov r4,#100 ; ;置平均次数置平均次数alop: mov a,p1alop: mov a,p1; ;读读p1p1口数据口数据 add a,r2add a,r2; ;低低8 8位累加位累加 mov r2,amov r2,a; ;回存回存 clr aclr a; ;高高8 8位与进位累加位与进位累加 addc a,r3addc a,r3; ; mov r3,a mov r3,a; ;回存回存 lcall dy10mslcall

22、 dy10ms ; ;延时延时10ms10ms djnz r4,alop djnz r4,alop; ;判判100100次累加完否?未完继续次累加完否?未完继续 mov a,r3mov a,r3;100;100次累加完次累加完, ,求平均值求平均值, ,被除数被除数aa、b b mov b,r2 mov b,r2; ; mov r0,30h mov r0,30h ; ;置商间址置商间址 mov r6,#0mov r6,#0; ;置除数置除数100,100,除数除数r6r5r6r5 mov r5,#100 mov r5,#100; ; lcall sum lcall sum;(a;(a、b)b)

23、(r6(r6、r5)= r5)= 商商 r0, r0, 余数余数a a cjne a,#50,next cjne a,#50,next; ;四舍五入四舍五入next: jcnext: jc gret gret;c=1,;c=1,50, 50, 舍舍 incinc 30h 30h;c=0,50, ;c=0,50, 入入gret: retgret: ret; ; 全全部部累累加加后后再再平平均均注:sum子程序可参阅例4-9avrg2:avrg2: mov mov 30h,#030h,#0; ;商累加寄存器清商累加寄存器清0 0movmov31h,#031h,#0; ;余数累加寄存器清余数累加寄存

24、器清0 0 movmovr4,#100r4,#100; ;置平均次数置平均次数alop:alop:movmova,p1a,p1; ;读读p1p1口数据口数据 movmovb,#100b,#100; ;置除数置除数( (平均次数平均次数) )divdivabab;p1;p1口数据除以口数据除以100100addadda,30ha,30h; ;商累加商累加mov mov 30h,a30h,a; ;回存回存mov mov a,ba,b; ;addadda,31ha,31h; ;余数累加余数累加movmov31h,a31h,a; ;回存回存clrclrc c; ;subbsubba,#100a,#10

25、0; ;jcjcgongon; ;余数累加余数累加100,100,余数累加寄存器不变余数累加寄存器不变incinc30h30h; ;余数累加余数累加100, 100, 商累加寄存器商累加寄存器+1+1movmov31h,a31h,a; ;减去减去100100后差后差余数累加寄存器余数累加寄存器gon: gon: lcalllcalldy10msdy10ms; ;延时延时10ms10msdjnzdjnzr4,alopr4,alop ; ;判判100100次累加完否?未完继续次累加完否?未完继续movmova,31ha,31h;100;100次累加完毕次累加完毕, ,余数累加四舍五入余数累加四舍五

26、入cjnecjnea,#50,nexta,#50,next; ;next:next:jcjcgretgret;c=1,;c=1,50, 50, 舍舍incinc30h30h;c=0,50, ;c=0,50, 入入gret:gret:ret ret ; ; 边边平平均均边边累累加加【课堂练习题】【课堂练习题】 已知某单片机系统每隔已知某单片机系统每隔20ms20ms测一次温测一次温度,度,8 8位温度位温度a/da/d值存在特殊功能寄存器值存在特殊功能寄存器sbufsbuf中,试分别求其中,试分别求其1s1s和和1 1分内的平均值分内的平均值, , 分别存分别存30h30h和和31h31h。 当

27、用当用pcpc作基址寄存器时,其表格首地址与作基址寄存器时,其表格首地址与pcpc值间距值间距不能超过不能超过256256字节,且编程要事先计算好偏移量,比较字节,且编程要事先计算好偏移量,比较麻烦。因此,一般情况下用麻烦。因此,一般情况下用dptrdptr作基址寄存器。作基址寄存器。3.4.5 3.4.5 查表程序查表程序用于查表的指令有两条:用于查表的指令有两条: movc a,a+movc a,a+dptrdptr movc a,a+ movc a,a+pcpc 当用当用dptrdptr作基址寄存器时,查表的步骤分三步:作基址寄存器时,查表的步骤分三步: 基址值(表格首地址)基址值(表格

28、首地址)dptrdptr; 变址值(表中要查的项与表格首地址之间的变址值(表中要查的项与表格首地址之间的 间隔字间隔字节数)节数)aa; 执行执行movc amovc a,a+dptra+dptr。解:编程如下:解:编程如下: chag:mov dptr,#tabdchag:mov dptr,#tabd; ;置共阴字段码表首址置共阴字段码表首址mov a,30h mov a,30h ; ;读显示数字读显示数字 movc a,a+dptr movc a,a+dptr ; ;查表查表, ,转换为显示字段码转换为显示字段码 mov 30h,a mov 30h,a ; ;存显示字段码存显示字段码 re

29、t ret ; ;tabd:db 3fh,06h,5bh,4fh,66htabd:db 3fh,06h,5bh,4fh,66h;0;04 4共阴字段码表共阴字段码表 db 6dh,7dh,07h,7fh,6fhdb 6dh,7dh,07h,7fh,6fh;5;59 9共阴字段码表共阴字段码表【例】【例】 在单片机应用系统中,常用在单片机应用系统中,常用ledled数码管显示数数码管显示数码,但显示数字码,但显示数字(9)(9)与显示数字编码并不相同,需与显示数字编码并不相同,需要将显示数字转换为显示字段码,通常是用查表的方要将显示数字转换为显示字段码,通常是用查表的方法。现要求将法。现要求将3

30、0h30h中的显示数字转换为显示字段码并中的显示数字转换为显示字段码并存入存入30h30h。已知共阴字段码表首址为。已知共阴字段码表首址为tabdtabd。【课堂练习题】【课堂练习题】 已知已知8 8位显示数字已存入首址为位显示数字已存入首址为30h30h的内的内ramram中,试将其转换为共阴显示字段中,试将其转换为共阴显示字段码,存入首址为码,存入首址为40h40h的内的内ramram中。中。解:编程如下:解:编程如下:cube:cube: mov dptr,#tab mov dptr,#tab ; ;置立方表首址置立方表首址mov a,30hmov a,30h ; ;读数据读数据add

31、a,30hadd a,30h ; ;数据数据2a2amov 30h,amov 30h,a ; ;暂存立方表数据序号暂存立方表数据序号 movc a, a+dptrmovc a, a+dptr; ;读立方数据高读立方数据高8 8位位xch a,30h xch a,30h ; ;存立方数据高存立方数据高8 8位位, ,立方表数据序号立方表数据序号aainc ainc a ; ;指向立方数据低指向立方数据低8 8位位movc a,a+dptr movc a,a+dptr ; ;读立方数据低读立方数据低8 8位位 mov 31h,amov 31h,a ; ;存立方数据低存立方数据低8 8位位ret r

32、et ; ;tab: dw 0,0,0,1,0,8,0,27,0,64 tab: dw 0,0,0,1,0,8,0,27,0,64 ;0;04040立方表立方表 dw 0,125,0,216,0fah,00hdw 0,125,0,216,0fah,00h; ;说明:数据说明:数据2a2a原因是立方表数据为双字节原因是立方表数据为双字节【例】【例】 用查表程序求用查表程序求0 04040之间整数的立方。已知该整数存在之间整数的立方。已知该整数存在内内ram 30hram 30h中,查得立方数存内中,查得立方数存内ram 30hram 30h(高(高8 8位)位)31h31h。已知立。已知立方表方

33、表( (双字节双字节) )首地址为首地址为tabtab。 在单片机系统中设置在单片机系统中设置+ +、 、 、 四个运算命四个运算命令键,它们的键号分别为令键,它们的键号分别为0 0、1 1、2 2、3 3。当其中一。当其中一个键按下时,进行相应的运算。操作数由个键按下时,进行相应的运算。操作数由p1p1口和口和p3p3口输入,运算结果仍由口输入,运算结果仍由p1p1口和口和p3p3口输出。具体口输出。具体如下:如下:p1p1口输入被加数、被减数、被乘数和被除口输入被加数、被减数、被乘数和被除数,输出运算结果的低数,输出运算结果的低8 8位或商;位或商;p3p3口输入加数、口输入加数、减数、乘数和除数,输出进位(借位)、运算结减数、乘数和除数,输出进位(借位)、运算结果的高果的高8 8位或余数。键盘号已存放在位或余数。键盘号已存放在30h30h中。中。3.4.6 3.4.6 散转程序散转程序散转程序是一种并行多分支程序。散转程序是一种并行多分支程序。【例】【例】 单片机四则运算系统。单片机四则运算系统。解:程序如下:解:程序如下:prgm: mov p1,#0ffh prgm: mov p1,#0ffh ;p1;p1口置输入态口置输入态 mov p3,#0ffh mov p3,#0ffh ;p3;p3口置输入态口置输入态 mov dptr,#tbj mov dpt

温馨提示

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

评论

0/150

提交评论