水电电工知识
电工文库|单片机汇编语言程序设计
2017-03-06  浏览:31
水电之家讯:1、汇编语言源程序的格式

1.内部数据传送指令

汇编语言是面向机器的,因此,语言格式因机器不同而异。对MCS-51系统来说,汇编语言中每条语句的格式包括下列4项内容:

标号: 操作码 操作数; 注释

汇编语句中,标号和操作码要用冒号“:”隔开;操作码和操作数之间的分隔符是空格,多个操作数之间用“,”分隔;操作数与注释之间用“;”分隔;操作码是必选项,其余都是可选项,即任何语句都必须包含操作码,其他部分因语句不同而异。

1.ORG伪指令

ORG伪指令称为起始汇编伪指令,一般用于汇编语言源程序或某数据块的开头,格式为:

[标号]:ORG 16位的地址或标号

2.END伪指令

END伪指令称为汇编结束伪指令,经常用在汇编语言源程序的末尾,用来指示源程序结束汇编的位置。即表明程序的结束。一般格式为:

[标号]:END

3.EQU伪指令

EQU伪指令称为赋值伪指令,用于给左边的“字符名”赋值。此伪指令的格式为:

字符名 EQU 数据或汇编符号

4.DATA伪指令

DATA伪指令称为数据地址赋值伪指令,它用来给左边的“字符名”赋值。其一般格式为:

字符名 DATA 数据或表达式

5.BIT伪指令

BIT伪指令称为位地址符号伪指令,用来给符号形式的位地址赋值,此伪指令的格式为:

字符名 BIT 位地址

6.DB伪指令

DB伪指令称为定义字节伪指令,它的功能是从指定单元开始定义(存储)若干个字节的数据或字符,字符若用引号括起来则表示ASCII码。其一般格式为:

标号:DB 字节常数或字符

7.DW伪指令

DW伪指令称为定义字伪指令,其功能为在程序存储器中从指定单元开始,定义若干个字,一个字相当于两个字节。此伪指令的一般格式为:

标号: DW 字常数或字表

8.DS伪指令

DS伪指令称为定义存储空间伪指令,格式为:

标号: DS 表达式

2、MCS—51单片机汇编语言程序设计举例

1. 简单程序设计

例:将一个字节内的两位压缩BCD码拆开并转换成相应的ASCH码,存入两个RAM单元。

解:设两位压缩BCD码已放在内部RAM的20H单元,转换后的ASCII码放在21H和22H单元。根据ASCII码表,字符0~9对应的ASCII码为30H~39H,之间仅相差30H。因此,转换时,只需把20H单元中两位压缩BCD码拆开后,将BCD的高四位置成“0011”即可。相应程序如下:

ORG 1000H

MOV R0,#20H

MOV A, @R0 ;两位BCD码送A

PUSH ACC

ANL A,#0FH ;取低位BCD码

ORL A,#30H ;完成低位转换

INC R0

MOV @R0,A ;低位BCD码的转换结果存入21H中

POP ACC

ANL A,#0F0H ;取高位BCD码

SWAP A

ORL A,#30H ;完成高位转换

INC R0

MOV @R0,A ;存数

SJMP $ ;结束

END

2. 分支程序设计

例:设变量X存放于R2,函数值Y存放在R3。试按照下式的要求给Y赋值:



解:这是一个三分支的条件转移程序,可采用CJNE和JC或JNC指令进行判断。

ORG 0500H

MOV A, R2 ;自变量→(A)

CJNE A,#10,L1 ;(A)与10比较

L1:JC L2 ;若X<10,则转L2

ADD A, #01H

MOV R3, A ; 设X>20,Y=1

CJNE A,#21,L3

L3:JNC L4 ;X>20,则转L4

MOV R3,#0 ;20≥X≥10,Y=0

SJMP L4

L2:MOV R3,#0FFH

L4:SJMP $

END

3. 循环程序设计

循环程序一般由以下几部分组成:

1)循环初始化部分

2)循环体部分

3)循环结束部分

例:在内部RAM的20H~2FH连续16个单元中存放单字节无符号数。求16个无符号数之和。

解 这是重复相加问题。16个单字节数的和最大不会超过两个字节,设和存放在31H,30H中。用R0作加数指针,R7作循环次数计数器。程序流程如图3-11所示。

ORG 1000H

MOV R7,#0FH

MOV R0,#21H

MOV 31H,#00H

MOV A,20H

LOOP1: ADD A,@R0

MOV 30H, A

JNC LOOP2

INC 31H

LOOP2: INC R0

DJNZ R7, LOOP1

SJMP $

END

4.查表程序设计

查表程序是根据查表算法设计的。它有两条专门的查表指令:

例:设计一个将16进制数转换成ASCII码的子程序。设16进制数存放在R0中的低4位,要求将转换后的ASCII码送回R0中。

解:给出二种方案。

①计算求解。由ASCII码字符表可知0~9的ASCII码为30H~39H,A~F的ASCII码为41H~46H。因此,计算求解的思路是:若(R0)≤9,则R0内容只需加30H;若(R0)>9,则R0需加37H。相应程序为:

ORG 1000H

MOV A,R0 ;取转换值到A

ANL A,#0FH ;屏蔽高4位

CJNE A,#10,NEXTl

NEXTl:JNC NEXT2 ;若A>9,则转NEXT2

ADD A,#30H ;若A<10,则A (A)+30H

SJMP DONE

NEXT2:ADD A,#37H ;A (A)+37H

DONE: MOV R0,A ;存结果

SJMP $

END

②查表求解。求解时,两条查表指令任选其一。现以“MOVC A,@A+PC”指令为例,给出相应程序:

地址 机器码 ORG 1000H

1000 E8 MOV A,R0 ;取转换值

1001 54 0F ANL A,#0FH ;屏蔽高4位

1003 24 03 ADD A,#03H ;计算偏移量

1005 83 MOVC A,@A+PC ;查表

1006 F8 MOV R0,A ;存结果

1007 80 FE SIMP $

1008 30 31 32 33 ASCTAB: DB 30H,31H,32H,33H

100C 34 35 36 37 DB 34H,35H,36H,37H

1010 38 39 41 42 DB 38H,39H,41H,42H

1014 43 44 45 46 DB 43H,44H,45H,46H

END

5. 子程序设计

子程序在结构上应具有通用性和独立性,在编写子程序时应注意:

①程序第一条指令的地址称为入口地址,该指令前必须有标号,最好以子程序任务名作为标号,例如显示程序常以DIR作为标号;

②调用子程序指令设在主程序中,在子程序的末尾一定要有返回指令。一般说来,子程序调用指令和子程序返回指令要成对使用,子程序应只有一个出口;

③子程序调用和返回指令能自动保护和恢复断点地址,但对需要保护的寄存器和内存单元的内容,必须在子程序开始和末尾(RET指令前)安排保护和恢复它们的指令;

④调用子程序时,要了解子程序的“入口信息”和“出口信息”,即进入子程序前应给哪些变量赋值,子程序返回时结果存在何处,以便主程序应用这些结果。这就是所谓的参数传递。一般称传入子程序的参数为入口参数,由子程序返回的参数为出口参数。

例:用程序实现C=a2+b2。设a、b均小于10。a存在21H单元,b存在22H单元,结果C存在20H单元。

解:因本题中两次用到求平方的运算,故此把求平方运算编成子程序。依题意编写主程序和子程序如下:

ORG 1000H

MAIN: MOV SP,#60H ;设堆栈指针

MOV A,21H ;取a值

LCALL SQR ;求a2

MOV 20H,A ;a2值送入20H单元

MOV A,22H ;取b值

LCALL SQR ;求b2

ADD A,20H ;求a2+b2

MOV 20H,A ;结果存入20H单元

SJMP $

ORG 2000H

SQR: MOV B,A ;求平方子程序

MUL AB

RET水电之家为您提供最全面的管材,管件,水电,电线,电工,管材水电品牌的装修知识点和各种管材水电的导购与在线购买服务,拥有最便宜的管材水电价格和最优质的售后服务,每天都有秒杀的抢购活动哦!敬请登陆水电之家:http://shuidian.jc68.com/
更多»您可能感兴趣的文章:
更多»有关 水电之家 的产品:
  • 水电电工资讯
  • 发表评论 | 0评
  • 评论登陆
  • 移动社区 天花之家 木门之家 灯具之家 铁艺之家 幕墙之家 五金头条 楼梯头条 墙纸头条 壁纸头条 玻璃头条 老姚之家 灯饰之家 电气之家 全景头条 照明之家 防水之家 防盗之家 区快洞察 建材 枣庄建材 临沂建材 南昌建材 上饶建材 抚州建材 宜春建材 吉安建材 赣州建材 鹰潭建材 新余建材 九江建材 萍乡建材 景德镇陶瓷 石家庄建材 衡水建材 廊坊建材 沧州建材 承德建材 建材之家 企业之家 720全景
    (c)2015-2017 Bybc.cn SYSTEM All Rights Reserved