单片机实用教程-5-89C51单片机汇编语言程序设计_第1页
单片机实用教程-5-89C51单片机汇编语言程序设计_第2页
单片机实用教程-5-89C51单片机汇编语言程序设计_第3页
单片机实用教程-5-89C51单片机汇编语言程序设计_第4页
单片机实用教程-5-89C51单片机汇编语言程序设计_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

第5章

89C51单片机汇编语言程序设计

汇编语言进行程序设计是面向过程设计的典型方法,也是程序设计最基本的能力体现。本章介绍89C51汇编语言程序设计的方法和一些实用程序。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第1页。5.1汇编语言语句的类型和组成

5.1.1汇编语言

汇编语言:用指令的助记符、符号地址、标号等符号书写程序的编程语言。

源程序:用汇编语言编写的程序为汇编语言源程序.

汇编程序:把汇编语言源程序翻译成机器语言的目标程序的工具软件。这个翻译过程称为汇编。

指令语句:源程序由指令语句组成。有两种类型:

指令性语句指示性语句单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第2页。5.1.2指令语句的组成

指令语句:由CPU指令组成,运行时由CPU执行。

每条指令对应CPU的一种特定操作。

汇编中,都要翻译成机器指令,生成对应的目标代码.

指令语句的格式如下:[标号:]

操作码[目的操作数,

源操作数]

[;注释]

其中:

方括号[]的部分为可选项,可有可无,随指令而异.

字段之间要用分隔符(空格,冒号,逗号,分号)分开.单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第3页。⑴.标号

标号位于语句的开始,代表该语句的地址(符号地址)

标号由1-8个字母和数字组成,由字母打头,以冒号结尾。不能使用指令助记符、寄存器名、伪指令等。每个语句标号可用可不用。转移指令可以标号作为指令的目标地址,汇编中自动计算出转移的偏移量。标号可以用赋值伪指令来赋值。⑵.操作码操作码是语句的核心,不可缺少。用指令的助记符表示,说明该语句所执行的操作。

单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第4页。⑶.操作数

表示该语句的操作中的数据或数据所在的地址。双操作数指令有目的和源操作数,目的在前,逗号分开.

操作数字段表示的方法有多种:

寄存器名:寄存器A、B、R0-R7、SFR等。存储器地址:片内为00H-7FH,片外为0000H-FFFFH。标号名:指令地址标号,其值为该指令第1字节地址。常数:常数可以用不同进制数或字符串表示。表达式:汇编时会自动计算出表达式的值。符号“$”:用于转移指令,表示该指令地址,即PC的值.⑷.注释:

是语句说明,可有可无。“;”后部分不产生目标代码。

单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第5页。5.1.3.指示性语句的组成

又叫伪操作语句,是对源程序进行说明的语句。汇编过程中,伪操作并不生成与之相应的目标代码.

由伪指令组成。是给汇编程序的命令,在汇编中进行某种控制和完成相应的处理,不是真正执行的指令。

指示性语句的格式如下:

[字符名称]伪指令[参数,参数][;注释]

其中:带[]的部分为可选项,随伪指令不同,参数也不同。字段间用分隔符(空格,逗号,分号等)分开,不可缺少。注意:字符名称和伪指令字段之间是用空格隔开。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第6页。指示性语句的格式:⑴.字符名称通常是变量名、过程名、符号等。变量名代表存储器中的一个数据区名。字符名称后面不跟着冒号。⑵.伪指令提供汇编过程的控制信息,不产生机器代码。⑶.参数可以是常数、寄存器、变量或表达式。有多个参数时,用逗号隔开。⑷.注释为阅读所加的说明部分,在前面必须加上分号。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第7页。5.2伪指令伪指令不是真正的指令,无对应的机器码,在汇编时不产生目标程序。只是用来对汇编过程进行某种控制。1.ORG

定位伪指令

格式:ORGn

说明:规定其后的程序或数据块的起始地址。例如:ORG0000HLJMPSTART

ORG2000HSTART:MOVA,#00H

单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第8页。2.DB

定义字节伪指令

格式:DB数据项或项表说明:从当前ROM地址开始,将项或项表的内容依次存放到连续的存储单元中.可以是一个字节或用逗号隔开的字节串,或是用单引号‘’括起来的字符或字符串(ASCII码)。DB常用于建立常数表。例如:

ORG1000HDB20HDB0C5H,01HDB‘A’,‘BC’

汇编后:(1000H)=20H,(1001H)=C5H

(1002H)=01H

(1003H)=41H

(1004H)=42H

(1005H)=43H单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第9页。3.DW

定义字(双字节)伪指令

格式:DW16位数据项或项表

说明:从当前ROM地址开始,将16位数据项或项表的内容依次存放到连续的存储单元中。存放时,高字节先到低地址,低字节到其后的高地址中.DW常用于定义一个地址表。例如:

ORG1500HDW1234H,5FH,20H

汇编后:(1500H)=12H

(1501H)=34H

(1502H)=00H

(1503H)=5FH

(1504H)=00H

(1505H)=20H单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第10页。4.BIT

定义位地址符号伪指令

格式:字符名称BIT位地址说明:将BIT之后的位地址赋予字符名称。字符名称不是标号,它的后面没有冒号。例如:A1BITP1.0A2BIT03H

汇编后,将P1口的第0位的位地址90H赋予A1,而A2的值就为位地址03H。其后可以直接使用A1、A2,方便修改、调试程序。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第11页。5.DS

定义存储空间伪指令

格式:DSn

说明:从指定的地址开始,连续预留n个存储单元,

作为工作单元使用。n为常数,例如:ORG2000HDS06HDB31H,32H

汇编后,从2000H开始连续预留6个存储单元,然后从2006H开始按DB命令给存储单元赋值,即:(2006H)=31H,(2007H)=32H。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第12页。6.EQU

赋值伪指令

格式:字符名称EQU项(数据或汇编符号)说明:将“项”赋给字符名称,使其等值。“项”可以是8位或16位常数,可以是工作寄存器,可以是一个直接地址。使用时,必须先赋值,然后才能使用该字符名称。例如:AAEQU10H;AA和10H等值

DELEQU1200H;DEL和1200H等值,

MOVA,AA;A(10H)

LJMPDEL

;程序无条件转移到1200H地址执行单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第13页。7.END

汇编结束伪指令

格式:

END

说明:表示汇编语言源程序到此结束,该伪指令要放在源程序的最后。在END以后的语句、指令都不予汇编。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第14页。5.3汇编语言程序设计过程

汇编语言程序设计是面向过程设计的典型方法。汇编语言程序设计分为以下几个步骤:1.分析任务2.确定方案和算法3.画出程序流程图4.编写程序5.调试程序单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第15页。1.分析任务

根据任务要求,进行全面分析,以求对任务有整体的概念和正确的理解。根据总体的需求,综合考虑可靠性、进度安排、成本等.合理分配软件和硬件担负的工作,提出设计方案.2.确定方案和算法在对任务的分析基础上,找出规律性,归纳出数学模型。将实际问题转化成程序模块来处理,找出最适宜的算法,建立符合任务要求的软件方案和算法。开始软件的设计。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第16页。3.画出程序流程图

程序流程图是使用图形、符号和带方向的线段等,

把程序设计的过程直观地描述出来的一种方法。⑴.起始框和终止框表示程序的开始和结束⑵.执行框表示要进行的工作⑶.判断框表示要判断的事件⑷.指向线表示程序的流向椭圆框桶形框矩形框菱形框指向线:表示连接点⑸.圆圈圆圈单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第17页。4.编写程序

根据流程图描述的各部分功能,编写具体的程序。

合理确定存储器中空间的分配,工作单元的安排。

如果有语法错误,反复地进行修改和重新汇编。5.调试程序

经过汇编没有语法错误后,进行调试,检查出程序是否有逻辑上的错误,是否满足系统功能的要求。

应用系统调试的过程,一般需要借助开发器、仿真器等硬件和软件来进行。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第18页。5.4汇编语言程序的基本结构

1、顺序程序

程序按顺序一条一条地执行指令。2、分支程序

程序分支是通过条件转移指令实现3、循环程序

连续重复执行某段程序,使用循环程序4、子程序

公用的程序段,主程序调用。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第19页。5.4.1顺序结构程序设计按照程序中指令编写的顺序一条一条地依次执行.[例5.1]

二进制数转换为BCD码说明:将累加器A的值转换为十进制数.分别将百、十、个位数拆为三个非压缩的BCD码,存入30H开始的三个单元。累加器A值#123,即7BH。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第20页。源程序:

ORG0000HLJMPSTARTORG1000HSTART:MOVA,#123MOVB,#100DIVABMOV30H,A

;除以100得百位数

MOVA,BMOVB,#10DIVABMOV31H,A

;余数除以10得十位数

MOV32H,B

;余数为个位数

SJMP$END单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第21页。5.4.2分支结构程序设计程序分支是通过条件转移指令实现的,满足条件则进行程序转移,不满足条件就顺序执行程序。分支程序又分为单分支和多分支结构。通过条件判断实现单分支程序转移的指令有:

JZ、JNZ、CJNE、DJNZ等。以位状态作为条件进行程序分支的指令有:

JC、JNC、JB、JNB、JBC等。完成0,1,正,负以及相等,不等作为条件判断。多分支程序根据条件判断,分别转移去执行不同的程序,有散转指令“JMP@A+DPTR”

。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第22页。[例5.2]

求单字节有符号二进制数的补码说明:单分支结构程序。由给出的原码求其补码时:

正数的补码和原码相同;负数的补码:数值为按位取反,末位加1.符号位不变,根据正负分支.

本例中:原码表示的有符号数在片内RAM的30H单元中,转换后补码存放于31H单元中。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第23页。源程序:ORG0000HLJMPCMPTORG1000HCMPT:MOVA,30HJNBACC.7,NCHMOVC,ACC.7CPLAADDA,#1MOVACC.7,CNCH:MOV31H,ASJMP$END单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第24页。[例5.3]

程序跳转表说明:多分支结构程序,程序分支根据R2中序号进行:结果:R2为0,置30H单元为0;R2为1,置31H单元为1;

R2为2,置32H单元为2;R2为3,置33H单元为3.单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第25页。ORG0000HLJMPSTARTORG1000HSTART:

MOVA,R2RLA;AJMP为二字节指令,调用号×2MOVDPTR,#FUNCTABJMP@A+DPTRSJMP$FUNCTAB:

AJMPFUNC0AJMPFUNC1AJMPFUNC2AJMPFUNC3FUNC0:MOV30H,#0RETFUNC1:MOV31H,#1RETFUNC2:MOV32H,#2RETFUNC3:MOV33H,#3RETEND单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第26页。例:128种分支转移程序。(散转)功能:根据入口条件转移到128个目的地址。入口:(R3)=转移目的地址的序号00H~7FH。出口:转移到相应子程序入口。JMP_128:MOVA,R3RLAMOVDPTR,#JMPTABJMP@A+DPTRJMPTAB:AJMPROUT00AJMPROUT01┇┇AJMPROUT7F;RL对变址部分乘以2,因为AJMP指令占两个字节单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第27页。5.4.3循环结构程序设计1、置循环初值对循环中使用的工作单元设置初始值,并设置循环的次数。如设置初值、地址指针、地址长度等。2、循环体(循环工作部分)重复执行的程序段部分,分为工作部分和控制部分。

3、修改控制变量计数循环,当循环了一定的次数后,就停止循环。4、循环控制部分根据循环结束条件,判断是否结束循环。可用DJNZ指令自动修改控制变量并结束循环。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第28页。根据循环控制组织方式的不同,有两种控制结构。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第29页。[例5.4]

将存储器块清零说明:指定片外某块存储器的起始地址和长度,要求将其内容清零。本例程序中是要求将片外RAM从8000H开始的256个单元的内容清零。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第30页。源程序:ORG0000H

LJMPSTART

ORG2000HSTART:MOVDPTR,

#8000H;片外RAM地址

MOVR0,#0

;设置256字节计数值

CLRALOOP:

MOVX@DPTR,AINCDPTR

;指向下一个地址

DJNZR0,LOOP

;计数值减一

SJMP$END单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第31页。[例5.5]

内存数据块移动

说明:本例中的程序是将片内数据存储器RAM的40H—4FH单元的内容传送到片外数据存储器3000H开始的单元中,移动16个字节。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第32页。源程序:ORG0000HLJMPSTARTORG1000HSTART:

MOVR0,#40HMOVR2,#10HMOVDPTR,#3000HLOOP:

MOVA,@R0MOVX@DPTR,AINCR0INCDPTRDJNZR2,LOOPSJMP$END单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第33页。5.4.4子程序结构程序设计

把公用程序段作成子程序。主程序运行中,需要时进行调用,子程序执行后,再返回原来调用的地方。1.子程序调用指令

“ACALLaddr11”(短调用)和“LCALLaddr16”(长调用)2.子程序的调用自动保存断点,找到子程序起始地址装入PC中,转子程序。3.保护现场和恢复现场保存现场使用PUSH,恢复现场使用出栈指令POP。4.参数的传递约定入口参数、出口参数。5.子程序返回子程序最后是返回主程序的指令RET。

单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第34页。[例5.6]

编程计算

P=a2+b2+c2说明:十进制数a,b,c存于30H,31H和32H单元,计算平方和,存放到50H单元。子程序SQR,采用查表方式得出平方值。入口参数:

A中为要求平方的数。出口参数:该数平方值存放在A中。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第35页。ORG0000HLJMPSTARTORG1000HSTART:MOVA,30HACALLSQRMOVR1,AMOVA,31HACALLSQRADDR1,AMOVA,32HACALLSQRADDR1,AMOV50H,R1SJMP$SQR:INCAMOVCA,@A+PCRETTABLE:DB0,1,4,9,16DB25,36,49,64,81END源程序:

单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第36页。5.5汇编语言实用程序设计

5.5.1数码转换程序

[例5.7]

将4位压缩的BCD码转换二进制数

片内RAM的31H,30H单元中存放4位压缩的BCD码:

转换程序可以由主程序和一个两次调用的子程序(A×10+B)组成。4位压缩BCD码用如下公式转换成二进制数:

a×1000+b×100+c×10+a×1=(a×10+b)×100+(c×10+d)单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第37页。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第38页。ORG0000HAJMPSTARTORG100HSTART:MOVA,31HMOVR2,A;为子程序BCDBIN设置入口参数

ACALLBCDBIN;调用两位BCD转换子程序BCDBINMOVA,R2MOVB,#100MULABMOV41H,B;乘积的高字节

MOV40H,A;乘积的低字节

MOVA,30HMOVR2,A;为子程序BCDBIN设置入口参数

ACALLBCDBIN;调用两位BCD转换子程序BCDBIN

MOVA,R2ADDA,40HMOV40H,AMOVA,41HADDCA,#0MOV41H,ASJMP$主程序:单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第39页。BCDBIN:MOVA,R2ANLA,#0F0HSWAPA;取出高位BCD数

MOVB,#10MULABMOVR3,AMOVA,R2ANLA,#0FH;取出低位BCD数

ADDA,R3MOVR2,ARETEND子程序:单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第40页。[例5.8]

二进制编码和ASCII码的转换片内RAM的50H单元中存放着8位二进制数,要求转换成用十六进制数表示的两个ASCII码,分别存入51H和52H单元里。51H单元存放高位。本题将十六进制数字0-F转换成ASCII编码,以用作字符显示。程序中采用查表的方法。ASCII码:美国标准信息交换代码,用7位二进制数表示一个字符。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第41页。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第42页。ORG0000HLJMPSTARTORG1000HSTART:

MOVDPTR,#ASCIITABMOVA,50HSWAPAANLA,#0FH;取高四位

MOVCA,@A+DPTR;查ASCII表

MOV51H,A;保存高4位的ASCII码

MOVA,50HANLA,#0FH;取低四位

MOVCA,@A+DPTR;查ASCII表

MOV52H,A;保存低4位的ASCII码

SJMP$ASCIITAB:

DB‘0123456789ABCDEF’;ASCII表

END源程序:单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第43页。5.5.2运算类程序

[例5.9]多字节无符号数的加法程序

片内RAM中两个多字节无符号数相加。加数最低字节地址存在R0中,加数最低字节地址存在R1中,字节数存在R2中。相加的和存放在原被加数存储单元里,被加数被覆盖。数据在存储器中存储顺序,从低位字节依次向高地址安排。多字节加法运算要考虑进位,所以要用ADDC指令。低字节相加前,要把进位标志CY清零。最高字节相加可能产生进位,和要比被加数多一字节.单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第44页。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第45页。ORG0000HLJMPSTARTORG1000HSTART:PUSHR0;保存R0,作为和的低字节地址

PUSHR2;保存R2,作为和的字节数

CLRCLOOP:MOVA,@R0ADDCA,@R1MOV@R0,A;部分和存入被加数单元中

INCR0INCR1DJNZR2,LOOPJNCADNCMOV@R0,#01H;最高位进位存入

SJMPADEADNC:MOV@R0,#00H;最高位无进位,将“0”存入ADE:POPR2;恢复相加的字节数R2POPR0;恢复R0,和数的低字节地址

INCR2;由于进位,和数字节数多一个

SJMP$END单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第46页。[例5.10]

多字节压缩BCD数的减法程序

片内RAM中两个多字节的压缩的BCD数相减。被减数最低字节地址存在R0,减数最低字节地址存在

R1,字节数存在R2。差存放在原被减数存储单元里,被减数被覆盖。数据在存储器中存储顺序,从低位字节依次向高地址安排。多字节加法运算要考虑借位,用SUBB指令。低字节相减前,要把借位标志CY清零。

BCD数相减后,要进行十进制数调整。最高字节相减可能产生借位,差要比被减数多一字节单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第47页。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第48页。ORG0000HLJMPSTARTORG1000HSTART:PUSHR0

;保存R0内容差的低字节地址

PUSHR2

;保存R2内容,作为差的字节数

CLRCLOOP:MOVA,@R0SUBBA,@R1DAAMOV@R0,A;部分差存入存储单元中

INCR0INCR1DJNZR2,LOOPJNCSBNCMOV@R0,#01H;最高位的借位“1”存入

SJMPADESBNC:MOV@R0,#00H;最高位无借位,将“0”存入ADE:POPR2;恢复R2,即相减的字节数

POPR0;恢复R0,差数的低字节地址

INCR2;最高借位,差的字节数要多一个

SJMP$END单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第49页。[例5.11]

双字节无符号数的乘法程序

片内RAM中两个双字节无符号数相乘。

双字节无符号数乘法没有专门的指令,采用法则如下:⑴.部分积的初始值为0,运算次数n为数的位数。⑵.乘数的最低位为判断位,该位为“1”,则部分积加上被乘数;该位为“0”,则不加被乘数(加0)。⑶.累加后的部分积和乘数一起向右移一位。⑷.重复⑵、⑶的操作n次,得到最终的乘积结果。

安排:被乘数在R2、R3中(R2为高8位);部分积在R4,R5(R4为高8位),初始值为0;乘数存放于R6、R7中(R6为高8位;乘积结果(32位)存放于R4、R5、R6、R7中(R4为高位)单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第50页。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第51页。ORG0000HLJMPSTARTORG2000HSTART:MOVR2,30HMOVR3,31H;存放被乘数

MOVR4,#0MOVR5,#0;存放部分积,初始值为0MOVR6,40HMOVR7,41H;存放乘数

MOVR0,#16;存放移位次数

CLRC;清进位标志CYDMUL:ACALLRSHIFT;部分积和乘数一起右移一位

JNCADD0;判断乘数的最低一位YMOVA,R5ADDA,R3MOVR5,AMOVA,R4ADDCA,R2MOVR4,A;乘数最低位为1,部分积加被乘数源程序1单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第52页。ADD0:DJNZR0,DMUL;乘数最低位为0,部分积不加

ACALLRSHIT;部分积和乘数最后右移一次

MOV50H,R4MOV51H,R5MOV52H,R6MOV53H,R7;将乘积存放于片内RAM中

SJMP$RSHIFT:MOVA,R4RRCAMOVR4,A;R4带进位右移一位

MOVA,R5RRCAMOVR5,A;R5带进位右移一位

MOVA,R6RRCAMOVR6,A;R6带进位右移一位

MOVA,R7RRCAMOVR7,A;R7带进位右移一位

RETEND源程序(续)单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第53页。[例5.12]

双字节无符号数的除法(16位÷8位)程序

片内RAM中有一个16bit(双字节)的无符号数,和一个

8位的无符号数进行除法运算。求出商和余数。

没有专门指令,要采用原码恢复余数法编写程序实现:

将被除数(或部分余数)的最高8位和除数比较(作减法).若被除数(或部分余数)最高8位大于或等于除数(减得开),则将该位商上“1”。否则不够减,则将该位商上“0”,但要保证被除数(或部分余数)不变,需要再加回除数,恢复原值。然后,将被除数(或部分余数)移位,再与除数继续比较(作减法),直到完成.结果得到8位的商和8位的余数。

安排:被除数(16位)存放于R2(高)、R3中;

除数(8位)存放于R4,移位次数存放于R7中。结果:商(8位)存放于R3,余数存放于R2中单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第54页。单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第55页。ORG0000HLJMPSTARTORG2000HSTART:MOVR2,30HMOVR3,31H;存放被除数

MOVR4,40H;存放除数

MOVR7,#08H;存放移位次数,初始值为8LOOP:CLRC;清进位标志CYMOVA,R3RLCA;R3带进位循环左移一位

MOVR3,AMOVA,R2RLCA;R2带进位循环左移一位

MOV07H,CCLRC源程序1单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第56页。SUBBA,R4;余数高位减去除数

JB07H,LOOP1JNCLOOP1ADDA,R4;恢复余数

SJMPLOOP2LOOP1:INCR3LOOP2:MOVR2,ADJNZR7,LOOPMOV50H,R3;保存商

MOV51H,R2;保存余数

SJMP$END源程序(续)单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第57页。5.5.3数据处理程序[例5.13

]

寻找最大值说明:片内RAM的50H开始的40个存储单元中存放一批数据,从中找出最大值,并存放于50H单元中。对前后两单元的数据进行比较(相减),找出大数,循环39次,完成找出最大数的操作.单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第58页。源程序:

ORG0000HLJMPSTARTORG1000HSTART:MOVR2,#40;要比较40个存储单元的数据

MOVR0,#50H;首地址存放于R0MOVA,R0MOVR1,A;R1←(R0)

DECR2MOVA,@R1LOOP:MOVR3,AINCR1CLRCSUBBA,@R1;前后两数比较

JNCLOOP1;C=0,前者数大,转LOOP1MOVA,@R1;C=1,后者数大,大数送ASJMPLOOP2LOOP1:MOVA,R3;取回前者,大数送ALOOP2:DJNZR2,LOOP;检查比较是否结束

MOV@R0,A;结果(最大数)送回50H单元

SJMP$END单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第59页。[例5.14]

数据排序说明:将片内数据存储器中50H开始连续存放的10个8位的无符号数由小到大进行排序。采用“冒泡排序”法单片机实用教程-5-89C51单片机汇编语言程序设计全文共64页,当前为第60页。源程序:

ORG0000HLJMPSORTORG1000HSIZEEQU10;数据个数

ARRAYEQU50H;数据起始地址

FLAGBIT0;交换标志SORT:MOVR0,#ARRAY;首地址输入到R0MOVR7,#SIZE-1;数据个数减一输入到R7CLRFLAG;交换标志置零GOON:MOVA,@R0;将首地址中的内容读到AMOVR2,A;将数据写入到R2中

INCR0

温馨提示

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

评论

0/150

提交评论