您好,欢迎访问一九零五行业门户网

单片机汇编语言程序设计

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
其它类似信息

推荐信息