当前位置:
文档之家› 单片机教程之第5章 汇编语言程序设计
单片机教程之第5章 汇编语言程序设计
第5章 MCS-51汇编语言程序 设计
本章介绍程序设计的基本知识及如何使用汇编 语言来进行基本的程序设计。 语言来进行基本的程序设计。 5.1 概述 按照语言的结构及其功能可以分为三种: 按照语言的结构及其功能可以分为三种:
1.机器语言:用二进制代码表示指令和数据。 .机器语言:用二进制代码表示指令和数据。 2.汇编语言:用助记符表示指令含义,面向机器。 .汇编语言:用助记符表示指令含义,面向机器。 3.高级语言:面向过程且独立于计算机硬件结构之 .高级语言: 目前单片机开发中常用的高级语言是C语言 语言。 外,目前单片机开发中常用的高级语言是 语言。
伪指令
5.DW(Define Word)定义数据字命令 . ( )
从指定的地址开始, 从指定的地址开始,在程序存储器的连续单元中定 双字节)的数据字 义16位(双字节 的数据字。例如: 位 双字节 的数据字。例如: ORG 2000H DW 1246H,7BH,10 , ,
汇编后: 汇编后:
(2000H)=12H ) (2002H)=00H ) (2004H)=00H ) (2001H)=46H ;第1个字 ) 个字 (2003H)=7BH;第2个字 ) ; 个字 (2005H)=0AH; )
例5.10 已知80C51单片机使用的晶震频率是 已知 单片机使用的晶震频率是 6MHz,要求设一一个软件延时程序,延时 ,要求设一一个软件延时程序, 10ms。 。
机器周期是2us,DJNZ指 指 机器周期是 MOV R0,#0AH 令是双周期指令, 令是双周期指令,一个 DL2:MOV R1,#125 DJNZ指令用时 ,需 指令用时4us, 指令用时 DL1:NOP 内重循环 要执行2500次就延时 要执行 次就延时 10ms。80C51是8位机, 位机, 。 是 位机 NOP 一次8微妙 循环125次 循环控制变量最大值是 DJNZ R1,DL1 255,所以要采用双重循 , 环。如果增加一次循环执 DJNZ R0,DL2 行的时间, 行的时间,还可以减少循 环的次数。 环的次数。 只考虑内重循环体的延时,则延时时间为: × 只考虑内重循环体的延时,则延时时间为:8×125us×10=10ms × = 考虑所有指令的延时,延时为: + + × 考虑所有指令的延时,延时为:2+(2+8×125+4)×10= + × = 10062us
养成在程序的适当位置上加上注释的好习惯。 养成在程序的适当位置上加上注释的好习惯。
(6)上机调试,修改完善源程序。 )上机调试,修改完善源程序。
5.2 顺序与循环程序设计
5.2.1顺序程序设计 顺序程序设计
单元的2个 例5.8 将20H单元的 个BCD码拆开并变成 单元的 码拆开并变成 ASCII码存入 码存入21H、22H单元。 单元。 码存入 、 单元 ASCII码0~9为30H~39H。 码 ~ 为 ~ 。 实现过程是,取出20H的低 位(1个BCD 的低4位 实现过程是,取出 的低 个 ),将它放到一个字节中 将它放到一个字节中, 码),将它放到一个字节中,再将其转换为 相应的ASCII码,方法就是再该数值基础上加 相应的 码 上30H,然后将这个数存入 ,然后将这个数存入22H。然后取出 。 20H的高 位,放入一个字节(放到低4位), 的高4位 放入一个字节(放到低 位 的高 将其加上30H,然后将结果放到 将其加上 ,然后将结果放到21H。 。
汇编语言的格式
(2)工作寄存器和特殊功能寄存器: 2 工作寄存器和特殊功能寄存器 工作寄存器和特殊功能寄存器: 可以用代号表示,也可以是位代号。 可以用代号表示,也可以是位代号。 特殊功能寄存器可以用寄存器的地址表示。 特殊功能寄存器可以用寄存器的地址表示。 (3)美元符号“$”: 美元符号“ : 3 美元符号 常在转移指令中使用,表示该指令所在的地址 该指令所在的地址。 常在转移指令中使用,表示该指令所在的地址。 如:SJMP $ 相当于 HERE:SJMP HERE
5.1.2 汇编语言的规范
汇编语言有两种基本类型: 汇编语言有两种基本类型:指令语句和伪 指令语句 (1)指令语句 )
每一条指令语句在汇编时都产生相应的指令 代码(机 是为汇编服务的。在汇编时没有机器代码与 之对应。 之对应。
1. 汇编语言源程序的格式
伪指令
6.BIT 定义位地址指令 .
位地址(Q4 BIT P2.2) 字符名称 BIT 位地址 第一前边字符和后边位地址等价。 第一前边字符和后边位地址等价。
7. DATA定义标号数值伪指令 定义标号数值伪指令
表达式(MN DATA 3000H) 字符名称 DATA 表达式 它于EQU的区别是可以先使用后定义,后边只能是数值。 的区别是可以先使用后定义, 它于 的区别是可以先使用后定义 后边只能是数值。
汇编语言的格式
2.操作码字段:是不能空缺的,是指令或伪指 操作码字段:是不能空缺的, 令的助记符,用来表示指令的操作性质。 令的助记符,用来表示指令的操作性质。 操作数字段: 3.操作数字段:
给出的是参加运算(或其他操作 的数据或数据的地址 给出的是参加运算 或其他操作)的数据或数据的地址。 或其他操作 的数据或数据的地址。 (1)操作数书写型式 1 操作数书写型式 操作数一般为十六进制, 结尾,如果是A~F 操作数一般为十六进制,用“H”结尾,如果是 开头,则为了与字符串区别开需要在操作数前加0。 开头,则为了与字符串区别开需要在操作数前加0 如果为二进制则以“ 结尾。 如果为二进制则以“B”结尾。 如果是十进制则以“ 结尾,也可以省略“ 如果是十进制则以“D”结尾,也可以省略“D”。
ORG 0000H;程序起始地址 ; LJMP MAIN;跳转到主程序 ; ORG 0100H;主程序起始地址 ; MAIN:MOV R0 , #22H;设置 指针指向 指针指向22H ;设置R0指针指向 MOV @R0,#0;将R0指向的地址 ; 指向的地址22H清零 清零 指向的地址 MOV A , 20H;读取要转换的 位ASCII码到 码到A ;读取要转换的2位 码到 XCHD A, @R0 ;将被转换数的低位送到 将被转换数的低位送到22H低位 低位 ORL 22H, #30H;将22H中数变成相应的 中数变成相应的ASCII码 ; 中数变成相应的 码 SWAP A;将A中数高位移到低位 ; 中数高位移到低位 ORL A,#30H;将A中数转换为相应的 ; 中数转换为相应的ASCII码 码 中数转换为相应的 MOV 21H,A;将高位数的 码送入21H ;将高位数的ASCII码送入 码送入 SJMP $;循环等待 ; END 中数据为56H,分析各指令执行后各地址和寄存 设20H中数据为 中数据为 , 器的值
MCS-51的汇编语言的(指令语句)四分段格式如下: 的汇编语言的(指令语句)四分段格式如下: 的汇编语言的
标号字段:操作码字段,操作数字段;注释 标号字段:操作码字段 操作数字段; 操作数字段 START: MOV A,30H;A←(30H) : , ; ( )
规则: 规则: 标号段: 1.标号段:标号字段和操作字码段之间要有冒号 “:”相隔,由1~8个ASCII字符组成,开头必须为 相隔, 字符组成, 相隔 字符组成 字母,标号不能重复, 字母,标号不能重复,不能用汇编语言已经定义的 字符串,可以没有标号。 字符串,可以没有标号。
5.2.2循环程序设计
循环的结构
(1)循环初态 )
设置循环过程中工作单元的初始值。 设置循环过程中工作单元的初始值。
(2)循环体 )
重复执行的程序段。 重复执行的程序段。
(3)循环控制部分 )
用于控制循环的执行和结束, 用于控制循环的执行和结束,判断循环执行的条 件。 常用循环控制指令有DJNZ,CJNE,SJMP等 常用循环控制指令有 等
开始 取出20H的低位 的低位BCD码,放到一个新地址中 取出 的低位 码 转化为相应的ASCII码 码 转化为相应的 将低位BCD码的 码的ASCII码存入 码存入22H 将低位 码的 码存入 取出20H的高位 的高位BCD码,放到一个新地址中 取出 的高位 码 转化为相应的ASCII码 码 转化为相应的 将高位BCD码的 码的ASCII码存入 码存入21H 将高位 码的 码存入 结束
4. 注释字段 注释字段:
以半角分割符“ 以半角分割符“;”开头,表示对前面语句的解释。 开头,表示对前面语句的解释。
2. 汇编语言的伪指令
汇编语言源程序中应有向汇编程序发出的 汇编语言源程序中应有向汇编程序发出的 指示信息,告诉它如何完成汇编工作, 指示信息,告诉它如何完成汇编工作,这 是通过使用伪指令来实现的。 伪指令来实现的 是通过使用伪指令来实现的。 也称为汇编程序控制命令。 也称为汇编程序控制命令。只有在汇编前 的源程序中才有伪指令。 的源程序中才有伪指令。经过汇编得到目 标程序(机器代码) 标程序(机器代码)后,伪指令已无存在 的必要,所以“ 体现在汇编时, 的必要,所以“伪”体现在汇编时,伪指 令没有相应的机器代码产生。 令没有相应的机器代码产生。
3. EQU(Equate)赋值指令 赋值指令
字符名称 EQU 数或汇编符号 定义前边字符与后边数据或符号等价。 定义前边字符与后边数据或符号等价。 OUTPORT EQU P1
4.DB(Define Byte)定义字节命令 . ( )
在程序存储器的连续单元中定义字节数据。 在程序存储器的连续单元中定义字节数据。
设由2个 位 码分别存放在23H、 例5.9 设由 个4位BCD码分别存放在 码分别存放在 、 22H单元和 单元和33H和32H单元中,求他们的和, 单元中, 单元和 和 单元中 求他们的和, 并送入43H、42H单元中(低位在低字节, 单元中( 并送入 、 单元中 低位在低字节, 高位在高字节) 高位在高字节)
CLR C MOV A,22H;取得低位被加数 ; ADD A,32H;低字节相加,不考虑进位位 低字节相加, 低字节相加 DA A;十进制调整 ; MOV 42H,A;保存 ; MOV A,23H;取得高位被加数 ; ADDC A,33H;高字节相加考虑字节的进位 高字节相加考虑字节的进位 DA A;十进制调整 ; MOV 43H,A;保存 ; 设 (23H)=12H, (22H)=34H,(33H)=56H,(32H)=78H, 分析各指令执行后相应寄存器、地址中数值。 分析各指令执行后相应寄存器、地址中数值。