




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 单片机汇编语言程序设计,4.1 汇编语言程序设计的基础知识 4.2 汇编程序设计方法 4.3 综合编程举例,4.1 汇编语言程序设计的基础知识,4.1.1 汇编语言的语句格式 汇编语言具有程序结构简单、执行速度快、程序易优化、编译后占用空间小的特点。汇编语言编程比高级语言困难,必须对计算机硬件有相当深入的了解,才能使用汇编语言编写程序。 各种汇编语言的语法规则是基本相同的,且具有相同的语句格式。汇编语句除包括指令外还包括伪指令。 MCS-51单片机汇编语言的语句格式表示如下: 标号: 操作码 操作数 ;注释,4.1.1 汇编语言的语句格式,(1)标号 标号是语句地址的标志符号,标号后边必须跟以冒号。标号由18个ASCII字符组成,头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。 不能使用汇编语言已经定义了的符号作为标号。如指令助记符、伪指令助记符以及寄存器名等。 “1TAB:”(以数字开头),“START”(无冒号),“TAB+5:”(“+”号不能出现在标号中),“MOV:”(指令助记符)都是错误的标号。,4.1.1 汇编语言的语句格式,(2)操作码 操作码用于规定这条语句执行的操作,是一条指令助记符或伪指令助记符。操作码在一条汇编语句中是必不可少的。 (3)操作数 操作数用于给操作码提供操作的数据或地址。 在一条语句中,操作数可能是空白,也可能包括一项、二项或三项,各操作数之间用逗号分隔。 MCS-51单片机汇编语句操作数的获得有立即数寻址、寄存器寻址、寄存器间接寻址等6种之同的寻址方式。,4.1.1 汇编语言的语句格式,(4)注释 注释是对语句的解释说明,不是必须的,但它可使程序的编制显得更加清楚。 注释以“;”开头,长度不限,一行不够时可以换行接着书写,但换行时应还在开头使用“;”号。 (5)分隔符 汇编语句在上述各部分的开头或末尾使用分隔符把它们分开,以便于区分。冒号“:”用于标号之后;空格“ ”用于操作码和操作数之间;逗号“,”用于操作数之间;分号“;”用于注释之前。,4.1.2 伪指令,伪指令与指令的概念不同,伪指令并不被译成机器码,只是影响到汇编过程,用来对汇编过程进行某种控制或提供某些汇编信息。 1.设置起始地址伪指令 ORG 格式: 标号: ORG nn ORG 100H START: MOV A, #30H MOV B, #50H 一般来说,在一个汇编语言源程序的开始,都安置一条ORG伪指令来指出该程序在存储器中存放的起始位置。,4.1.2 伪指令,2.定义字节伪指令 DB 格式:标号: DB X1, X2,Xn 该伪指令把单字节数据X1,X2,Xn存入目标程序存储器,通常用于定义一个常数表。 ORG 1000H TAB:DB 00H, 01H, 02H, 03H, 04H 伪指令定义的数据00H, 01H, 02H, 03H, 04H从指定的1000H单元开始依次存放,一个数据占用一个字节存储单元。 指令中Xi也可以是由两个单引号括起来的一个字符串,这时Xi定义的字节长度等于字符串的长度,每一个字符为一个ASCII码。,4.1.2 伪指令,3.字定义伪指令 DW 格式;标号: DW Y1, Y2,Yn 该伪指令功能与DB伪指令类似,也是给数据表中的数据分配存储单元。所不同的是DW伪指令定义的数据为字。 存储时将高8位数据存入低地址单元,将低8位数据存入高地址单元。 ORG 2000H WTAB: DW 1000H, 2000H, 3000H 伪指令DW定义了数据1000H, 2000H, 3000H, 它们依次从指定的2000H单元开始存放。,4.1.2 伪指令,4.赋值伪指令 EQU 格式:符号名 EQU 表达式 伪指令表示将表达式的值或特定的某个汇编符号定义一个指定的符号名。 由EQU伪指令定义过的符号名可以在本程序段的任意位置上引用。 DBUF EQU 30H 使用上述伪指令后,则符号DBUF就等价于30H。在程序中对DBUF进行赋值,实际上就是对内部RAM的30H赋一个值。,4.1.2 伪指令,5.位定义伪指令 bit 格式:符号名 BIT 位地址表达式 该伪指令把位地址表达式的值赋给前面的符号名。 HIGH bit 20H 使用上述伪指令后,则HIGH等价于位地址20H,在其后的编程中可以用HIGH代替20H使用。 6.汇编结束伪指令 END 格式:标号: END END伪指令指出结束汇编,即使后面还有指令,汇编程序也不作处理。,4.1.3 汇编语言程序的基本框架,ORG 0000H AJMP MAIN ;跳转到主程序 ORG 0003H LJMP INT_X0;外部中断0入口 ORG 000BH LJMP INT_T0;定时器0中断入口 ORG 0013H LJMP INT_X0;外部中断1入口 ORG 001BH LJMP INT_T1;定时器1中断入口 ORG 0023H LJMP INT_S ;串口中断入口 ORG 0100H ,4.1.3 汇编语言程序的基本框架,MAIN: ;主程序开始 MOV SP,#70H ;设置堆栈段 ;以下是中断服务程序 INT_X0: ;外部中断0服务子程序 RETI INT_T0: ;定时器0服务子程序 RETI INT_X1: ;外部中断1服务子程序 RETI,4.1.3 汇编语言程序的基本框架,INT_T1: ;定时器1服务子程序 RETI INT_S: ;串口中断服务子程序 RETI ;可以在此处放置子程序 END ;汇编结束 程序框架中包含了5个中断服务,在实际使用中可能只用到其中的部分中断。在0003H处安排了中断服务程序的入口地址表,主程序放在其后,从0100H单元开始执行。,4.1.4 汇编过程,汇编又分手工汇编和计算机汇编。 手工汇编指由汇编者对照指令表,将源程序的每条指令的指令代码分别查出,然后把这些指令代码以字节为单位从源程序的起始地址依次排列形成目标程序。 计算机汇编采用系统软件汇编程序来完成,汇编过程采取两次扫描的方式。第一次扫描读取存放在磁盘上的源程序,生成复制程序和符号表;第二次扫描使用机器指令操作代码表、伪指令操作表和符号表读取存放在磁盘上的复制程序,生成目标程序。,4.2 汇编程序设计方法,4.2.1 程序设计步骤 用汇编语言编写一个程序的过程可分为以下五个步骤: (1)分析问题,确定算法 (2)根据算法制定程序流程图 (3)确定数据格式,分配系统资源 (4)根据流程图编写程序 (5)程序调试,4.2.2 顺序程序,例4-1 将地址为2002H 、2001H、2000H的数据存储单元的内容,分别传送到2005H、2004H、2003H存储单元中去。 START:MOV DPTR, #2002H MOVX A, DPTR ;取2002H单元内容 MOV DPTR, #2005H MOVX DPTR,A ;送到2005H单元 MOV DPTR, #2001H MOVX A, DPTR ;取2001H单元内容 MOV DPTR, #2004H MOVX DPTR,A ;送到2004H单元,4.2.2 顺序程序,MOV DPTR, #2000H MOVX A, DPTR ;取2000H单元内容 MOV DPTR, #2003H MOVX DPTR, A ;送到2003H单元 RET,4.2.2 顺序程序,例4-2 设内部RAM 的40H、41H单元中分别存放着一个字节的二进制数, 要求取出这两个单元中的低半字节, 合并成一个字节后, 存入50H单元中。 START: MOV R1, 40H ; 设置R1为数据指针 MOV A, R1 ; 取出第一个单元中的内容 ANL A, 0FH ; 取第一个数的低半字节 SWAP A ; 移至高半字节 INC R1 ; 修改数据指针 XCH A, R1 ; 取第二个单元中的内容 ANL A, 0FH ; 取第二个数的低半字节 ORL A, R1 ; 拼字 MOV 50H, A ; 存放结果 RET,4.2.3 分支程序,在MCS-51 单片机指令系统中, 有JZ(JNZ)、 CJNE、 JC(JNC)和JB(JNB)等丰富的控制转移指令, 它们是分支结构程序设计的基础, 可以完成各种各样的条件判断、分支。 分支结构一般分为单分支和多分支两种结构。,4.2.3 分支程序,例4-3 x, y均为8位二进制数, 设 x在R0中, 按照下面的函数 关系求出y后存入R1中。 START: CJNE R0, 00H, SUL1 ; R0中的数与00比较不等转移 MOV R1, 00H ; 相等, R1 0 SJMP SUL2 SUL1: JC NEG ; 两数不等, 若(R0)0, 则 R101H SJMP SUL2 NEG: MOV R1, 0FFH ; (R0)0, 则 R10FFH SUL2: RET,4.2.3 分支程序,例4-4 3个无符号单字节整数分别存于R1、R2和R3 中, 找出其中最大数放于R0 中。 先将R0清零, 然后(R1)与(R0)比较, (R1)(R0),则把(R1) 送(R0);否则(R0)保持不变。再将(R0)分别与(R2)和(R3)比较,比较处理的方法与上面相同,这样比较3次后, R0 中即为3个数中最大的数。 BR2: ORG 2500H MOV R0, 00H ; R0 清零 MOV A, R1 ; 第一个数(R1)送A ACALL COMP ; 比较(R1)与(R0)大小 MOV A, R2 ; 第二个数(R2)送A ACALL COMP ; 比较(R2)与(R0)大小,4.2.3 分支程序,MOV A, R3 ; 第三个数(R3)送A ACALL COMP ; 比较(R3)与(R0)大小 HERE: AJMP HERE COMP: MOV R4, A ; R4 暂存A的内容 CLR C ; 清进位位C SUBB A, R0 ; (A)(R0) JC M1 ; (A)(R0)时大数存R0 M1: RET,4.2.4 循环程序,1.循环程序的组成 (1)循环初始化部分:是为了保证程序能正常进行循环操作而做的准备工作。 (2)循环体部分:需要重复执行的程序段,是循环的主体。 (3)循环控制部分:用来保证循环程序按规定的次数或特定条件正常循环,按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。,4.2.4 循环程序,2.循环程序的结构 常见循环结构有两种:一种是先检查是否满足控制条件,符合则执行循环体,否则退出循环,也称为“当”型循环;另一种是先执行循环体,然后再判断循环是否继续进行,也称为“直到”型循环。,4.2.4 循环程序,3.循环控制的方法 (1)计数控制循环 将计数器的初值设置为循环次数,以后每执行一次循环体,使循环计数器减1,并测试计数器是否为0,若为0,则终止循环。这种方法称为计数法,一般用循环指令DJNZ进行编程。 (2)条件控制法 对于循环次数不能预先确定的程序,只能根据循环过程中某个特定条件是否满足来控制循环是继续还是退出。这类通过测试特定条件来实现循环控制的方法称为条件控制法。,4.2.4 循环程序,例4-5 设在内部RAM的BLOCK单元开始处有长度为LEN的无符号数据块, 试编一个求和程序, 并将和存入内部 RAM的SUM单元(设和不超过8 位)。 由于循环的次数确定,采用计数循环控制,循环计数初值设置为LEN即可。 START: CLR A ; 清累加器A MOV R2, LEN ; 数据块长度送R2 MOV R1, BLOCK ; 数据块首址送R1 LOOP: ADD A, R1 ; 循环加法 INC R1 ; 修改地址指针 DJNZ R2, LOOP ; 修改计数器并判断 MOV SUM, A ; 存和 RET,4.2.4 循环程序,例4-6 长度为10H的字符串存放在首地址为inbuf的内部RAM中,将这个字符串向片外RAM的outbuf地址开始的存储单元传送,一直进行到遇见回车符(ODH)或整个字符串传送完毕。 由于字符串长度是10H,采用计数循环控制。题目中要求遇见回车符(ODH)则停止传送,所以同时采用条件控制法控制循环。 MOV R7, #10H ;置转送次数 MOV R0, #inbuf ;送字符串首地址 MOV DPTR, #outbuf ;送传送单元起始地址 LOOP: CJNE R0, #0DH, NEXT ;取字符比较,是回车符则转移 SJMP END,4.2.4 循环程序,NEXT: MOV A, R0 ;取字符 MOVX DPTR,A ;送字符 INC R0 ;地址加1 INC DPTR DJNZ R7, LOOP ;未送完返回 END: SJMP $ RET,4.2.4 循环程序,例4-7 10 秒软件延时程序。 使用 6 MHz晶振, 一个机器周期为 2 s, 计算出一条指令以至一个循环所需要的执行时间, 给出相应的循环次数, 便能达到延时的目的。 DELAY: MOV R5, 100;第一层循环执行100次 DEL0: MOV R6, 200;第二层循环执行200次 DEL1: MOV R7, 248;第三层循环执行248次 DEL2: DJNZ R7, DEL2 DJNZ R6, DEL1 DJNZ R5, DEL0 RET,4.2.5 子程序设计,需要进行一些数值不同而算法相同的操作,这时常常将实现这个算法的操作设计为一个子程序。 子程序需要由主程序或子程序调用。子程序调用子程序,称为子程序嵌套。 子程序的结构包括子程序名、具体功能程序、子程序返回三部分。子程序返回由RET 指令完成。 1.子程序编写的原则 (1)子程序第一条指令前必须有标号,该标号应以子程序的功能命名,以便阅读时一目了然。 (2)在给子程序所加的注释中应该说明子程序的功能,并标明子程序的入口参数和出口参数。,4.2.5 子程序设计,(3)子程序执行完成后一定要返回主程序,而子程序是通过RET指令返回到主程序的。 (4)在子程序在调用和返回时,隐含两次堆栈操作(压栈和弹栈),而且有可能在子程序中再调用子程序(即子程序嵌套),编程时应注意堆栈区的大小要满足要求。 (5)保护现场和恢复现场 必须在子程序执行之前,将使用到一些寄存器或存储单元保护起来,通常是进行压栈操作或改变工作寄存器的物理地址,这种操作称为保护现场。 子程序执行完成返回主程序后,再将压栈的内容取出,即弹栈,或恢复原来工作寄存器的物理地址,称为恢复现场。,4.2.5 子程序设计,2.主程序和子程序之间的参数传递 在需要在主程序和子程序之间进行参数传递时,主程序应先把有关的参数存入约定的位置,子程序执行时,可以从约定的位置取得参数,当子程序执行完时,将得到的结果再存入约定的位置,返回主程序后,主程序可以从这些约定的位置取得需要的结果。 参数的传递方法主要有以下几种方式: (1)用工作寄存器或累加器传递参数 (2)利用堆栈传递参数 (3)利用操作数地址传递参数,4.2.5 子程序设计,例4-8 编写子程序实现多字节无符号数的加法。 下面子程序入口参数DATA1是被加数的低位地址,DATA2是加数的低位地址,N是相加字节的个数;出口参数DATA2是和数的低位地址。 MADD: MOV R0,#DATA1 ;置被加数 MOV R1, #DATA2 ;置加数 MOV R7,#N ;置字节数 CLR C ;清进位位 LOOP: MOV A,R0 ADDC A,R1 ;求和 MOV R1,A ;存结果 INC R0 ;修改指针 INC R1 DJNZ R7,LOOP ;循环判断 RET,4.2.5 子程序设计,例4-9 把内部RAM某一单元中一个字节的十六进制数转换成两位ASCII码,结果存放在内部RAM的连续两个单元中。 假设一个字节的十六进制数在内部RAM的40H单元,而结果存入50H,51H两个单元。一个字节的十六进制数是由两位数字组成,需要两次进行ASCII转换,可以编写子程序完成将1位十六进制数转换成ASCII,然后在主程序中两次调用它。调用过程中可以用堆栈进行参数传递。 MAIN: MOV SP, #30H MOV R1, #50H ; R1 为存结果的指针 MOV A, 40H ; A为需转换的十六进制数 SWAP A ; 先转换高位半字 PUSH ACC ; 压栈 LCALL HEASC ; 调用子程序HEASC转换低半字节内容;,4.2.5 子程序设计,POP ACC MOV R1, A ; 存高半字节转换结果 INC R1 PUSH 40H LCALL HEASC POP ACC MOV R1, A ; 存低半字节转换结果 END HEASC: MOV R0, SP DEC R0 DEC R0 ; R0 指向十六进制数参数地址 XCH A, R0 ; 取被转换参数 ANL A, 0FH ; 保留低半字节 ADD A, 2 ; 修改 A值 MOVC A, A+PC ; 查表 XCH A, R0 ; 结果送回堆栈 RET TAB: DB 30H, 31H, 32H, ,4.3 综合编程举例,4.3.1 算术运算程序 1带符号数的加减运算程序设计 例4-10 设在BLOCK和BLOCK+l单元中有以两个补码形式的带符号单字节数。请编写求两数之和,并把它放在SUM和SUM+l两个单元中(低8位在SUM单元,高8位在SUM+1单元)的子程序。 SBADD: PUSH ACC PUSH PSW MOV PSW, #08H ;保护现场(改变工作寄存器区) MOV R0, #BLOCK ;R0指向一个加数 MOV R1, #SUM ;Rl指向和单元 MOV R2, #00H ;高位先令其为零 MOV R3, #00H MOV A, R0,4.3.1 算术运算程序,JNB ACC.7, POS1 ;若为正数则转POS1 MOV R2, #0FFH ;若为负数,则全“1”送R2 POS1:INC R0 MOV B, R0 JNB B.7, POS2 ;若是正数,则转POS2 MOV R3, #0FFH ;若是负数,则全“1”送R3 POS2: ADD A, B ;低8位相加 MOV R1, A ;存低8位和 INC R1 MOV A, R2 ADDC A, R3 ;完成高8值求和 MOV R1, A ;存高8位和 POP PSW ;恢复现场 POP ACC RET END,4.3.1 算术运算程序,2多字节乘除运算程序设计 例4-11 将(R2R3)和(R6R7)中双字节无符号数相乘, 结果存入 R4R5R6R7。 NMUL: MOV R4, 0 ; 初始化 MOV R5, 0 CLR C MOV R0, 16 NMUL1: MOV A, R4 ;CyR4R5R6R7右移一位 RRC A MOV R4, A MOV A, R5 RRC A MOV R5, A MOV A, R6 RRC A,4.3.1 算术运算程序,MOV R6, A MOV A, R7 RRC MOV R7, A JNC NMUL2 ;C为移出乘数最低位 MOV A, R5 ;(R4R5)+ ;(R6F7)(R4R5) ADD A, R3 MOV R5, A MOV A, R4 ADDC A, R2 MOV R4, A NMUL2: DJNZR0, NMUL1 ;循环16位 MOV A, R4 ;最后结果再移一位 RRC A MOV R4, A,MOV A, R5 RRC A MOV R5, A MOV A, R6 RRC A MOV R6, A MOV A, R7 RRC A MOV R7, A RET,4.3.2 查表程序,MCS-5l指令系统中有两条专用的查表指令, MOVC A+PC指令可用于在“本地”范围内查表 , MOVC A,A+DPTR指令适用于在64KB 范围内查表 。 例 4-12 在一个温度检测系统中, 温度模拟信号由 10 位A/D输入。将A/D结果转换为对应温度值, 可采用查表方法实现。先由实验测试出整个温度量程范围内的A/D转换结果, 把A/D转换结果000H3FFH所对应的温度值编制为一个表存储在程序存储器中, 那么就可以根据检测到的模拟量的A/D转换值查找出相应的温度值。 设测得的A/D转换结果已存入20H,21H单元中(高位字节在20H中,低位字节在21H中),查表得到的温度值存放在22H#、23H单元(高位字节在 22H中,低位字节在23H中)。,4.3.2 查表程序,FTMP: MOV DPTR, TAB ; DPTR表首地址 MOV A, 21H ;(20H)(21H)2 CLRC RLCA MOV 21H, A MOV A, 20H RLC A MOV 20H, A MOV A, 21H ; 表首地址+偏移量 ADDC A, DPL MOV DPL, A MOV A, 20H ADDC A, DPH MOV DPH, A,CLR A MOVC A, A+DPTR ;查表得温度值高字节MOV 22H, A CLR A INC DPTR MOVC A, A+DPTR ;查表得温度值低字节MOV 23H, A RET TAB: DW ,4.3.3 数据排序程序,1. 算法说明 例如原始数据为顺序50、38、7、13、59、44、78、22 第次冒泡的过程是: 50、38、7、13、59、44、78、22 (逆序,互换) 38、50、7、13、 9、44、78、22 (逆序,互换) 38、7、50、13、59、44、78、22 (逆序,互换) 38、7、13、50、59、44、78、22 (正序,不互换) 38、7、l 3、50、59、44、78、22 (逆序,互换) 38、7、13、50、44、59、78、22 (正序,不互换) 38。7、13、50、44、59、78、22 (逆序,互换) 38、7、13、50、44、59、22、78 (第一次冒泡结束),4.3.3 数据排序程序,如此进行,各次冒泡的结果是: 第一次冒泡 38、7、13、50、44、59、22、78 第二次冒泡 7、13、38、44、50、22、59、78 第二次冒泡 7、13、38、44、22、50、59、78 第四次冒泡 7、13、38、22、44、50、59、78 第五次冒泡 7、13、22、38、44、50、59、78 第六次冒泡 7、13、22、38、44、50、59、78 第七次冒
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国自动厕纸机行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国聚合物基增溶辅料行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国美食广场行业市场发展现状及发展趋势与投资前景研究报告
- 2025年船用GPS电子海图导航仪项目可行性研究报告
- 圆明园施工方案
- 2025-2030中国纯素食冰淇淋行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国粮食物流行业市场发展现状及竞争格局与投资前景研究报告
- 2025年胶/毛针织布项目可行性研究报告
- 2025-2030中国穿山甲养殖行业市场发展分析及发展趋势与投资前景研究报告
- 2025-2030中国税控软件行业市场发展分析及发展潜力与投资研究报告
- 护士N1晋级N2述职报告
- 中国糖尿病防治指南(2024版)解读
- 食堂食材配送采购投标方案(技术标)
- 山东省汶上县市级名校2025届中考生物全真模拟试卷含解析
- 2025年度智能硬件产品全国区域独家代理合同3篇
- 办公室安全知识培训课件
- 2025年四川省成都市青白江区招聘50人历年高频重点提升(共500题)附带答案详解
- 2025年浙江嘉兴市众业供电服务限公司招聘38人高频重点提升(共500题)附带答案详解
- 【课件】第12课+理想与典范-古希腊与古罗马美术+课件高中美术人教版(2019)美术鉴赏
- 建筑行业安全隐患举报奖励机制
- 公司事故隐患内部报告奖励机制
评论
0/150
提交评论