1、第4章 汇编语言程序设计,4.1 概述 4.2 MCS-51汇编语言程序设计 顺序、循环、分支、子程序,4.1 概 述,4.1.1 计算机常用的编程语言 程序设计语言:低级语言和高级语言。 低级语言:机器语言 汇编语言: 采用特定的助记符号来描述机器指令 高级语言: 高级语言程序要经过解释程序或编译程序的编 译,形成目标程序后,才能执行。 常用的高级语言:BASIC,FORTRAN,PASCAL,C等。,4.1.2 MCS-51汇编语言伪指令 1ORG(Origin) 汇编起始地址命令 功能:用于规定目标程序的起始地址。 格式: 标号: ORG 地址 地址项:16位绝对地址,也可以用标号或表达式表示。 如果不用ORG规定,则汇编得到的目标程序将从0000H开始。,一个源程序中,可多次使用ORG指令以规定不同程序段的起始位置。地址应从小到大顺序排列,不允许重叠。 例如:ORG 4000H LJMP MAIN ORG 4200H MAIN: MOV A, 30H,2END(END of assembly)汇编终止命令 功能:用于终止源程序的汇编工作。 END之后的指令,汇编程序不予处理。
2、格式: 标号: END 表达式 只有主程序模块才有“表达式” 项,且“表达式”的值等于该程序模块的入口地址。而其他程序模块就没有“表达式”项。“标号:”也是选择项。 一个源程序只能有一个END命令。,3EQU(Equate) 赋值命令 功能:用于给字符名称赋予一个特定值。赋值以后,其值在整个过程中有效。 格式: 字符名称 EQU 赋值项 “赋值项”:可以是常数、地址、标号或表达式。 8位或16位二进制数。赋值以后的字符名称即可作地址使用,也可作立即数使用。 PA8155 EQU 8001H 给标号PA8155赋值8001H。,4DB(Define Byte) 定义数据字节命令 功能:用于从指定的地址单元开始,在程序存储器中存放字节数据。 格式: 标号: DB 8位数表 例如: DB “how are you?” ;1个字节存放1个字符ASCII 常使用本命令存放数据表格,例如存放数码管显示的十六进制数的字形码,可使用多条DB命令定义: DB C0H,F9H,A4H,B0H DB 99H,92H, 82H, F8H DB 80H,90H, 88H, 83H DB C6H,A1H,86H,
3、 84H,查表时,为确定数据区的起始位置,可采用两种方法: (1)根据DB命令前一条指令的地址确定。 例: 8100H MOV A, #49H (1字节) TAB: DB C0H, F9H, A4H, B0H (2)使用ORG 指令专门规定 例: ORG 8100H TAB: DB C0H, F9H, A4H, B0H 定义的数码管字形码从8100地址开始存放。,5DW(Define Word) 定义数据字命令 功能:用于从指定地址开始,在程序存储器单元中定义16位的数据字(两个字节)。 格式: 标号: DW 16位数表 存放规则:高8位在前(低地址),低8位在后(高地址)。 例: DW 100H,1ACH ;按顺序存01H, 00H, 01H, ACH DW “AA” ;存入41H,41H(ASCII码) DW “A” ;存入00H,41H DW “ABC” ;不合法,大于两个字节,注意: DB和DW定义的数表,数的个数不得超过80个。 如果数据的数目较多时,可使用多个定义命令。 在 MCS-51程序设计应用中,常以DB定义数据,以DW定义地址。,6DS(Define Storage
4、) 定义存储区命令 功能:用于从指定地址开始,保留指定数目的字节单元为存储区,供程序运行使用。汇编时对这些单元不赋值。 格式: 标号: DS 16位数表 例: ADDRTABL: DS 20 例: ORG 8100H DS 08H 注意:对MSC-51单片机来说,DB、DW、DS命令只能对程序存储器使用,不能对数据存储器使用。,7BIT 位定义命令 功能: 用于给字符名称赋以位地址。 格式: 字符名称 BIT 位地址 例如: AAA BIT 40H BBB BIT 50H,4.2 MCS-51汇编语言程序设计 汇编和高级语言程序设计的过程: 首先对问题进行分析,然后确定算法,再根据算法流程编写程序,最后是调试程序。 汇编语言程序设计的独特点在于: (1) 用汇编语言进行程序设计时,对数据的存放、寄存器和工作单元的使用等要由设计者安排。而高级语言程序设计时,这些工作都由计算机软件安排,程序设计者不必考虑。,(2) 汇编语言程序设计要求设计人员必须对所使用的计算机的硬件结构有较为详细的了解。特别是对各类寄存器、端口、定时器/计数器、中断等内容要熟悉,以便在程序设计时能熟练使用。 汇编语言程
5、序共有四种结构形式: 顺序结构、循环结构、分支结构(选择结构)和子程序结构。,4.2.1 顺序程序 例4.1 设三字节无符号数相加, 被加数:在内部RAM 20H22H单元(低位在前), 加数: 在内部RAM 30H32H单元(低位在前), 结果: 存于内部RAM2022H单元,进位位存于23H单元。 利用ADDC指令进行多字节加法运算。,ORG 5000H MOV R0,#20H ;被加数的低字节地址 MOV R1,#30H ;加数的低字节地址 MOV A, R0 ADD A, R1 ;低字节相加 MOV R0,A ;存放字节相加结果 INC R0 INC R1 MOV A, R0 ADDC A, R1 ;中间字节带进位相加 MOV R0, A ;存中间字节相加结果,INC R0 INC R1 MOV A, R0 ADDC A, R1 ;高字节带进位相加 MOV R0,A ;存高字节相加结果 INC R0 MOV A, #00H ADDC A, #00H MOV R0, A ;进位位送23H END,例4.2 将片内RAM 20H单元的内容拆成两段,每段4位。并将它们分别存入21H与
6、22H单元中。 (20H) =0101, 1010=5AH (21H) =0AH ;存放低4位 (22H) =05H ;存放高4位,ORG 5000H START: MOV R0,#21H ;R021H MOV A,20H ;A(20H) ANL A,#0FH ;A #0FH(A) MOV R0,A ;(R0)(A),保存低4位 INC R0 ;R0 (R0)1 MOV A,20H ;A(20H) SWAP A ;高低半字节交换 ANL A,0FH ;A 0FH MOV R0,A ;(R0)(A) END,4.2.2 循环程序,循环程序一般由四个主要部分组成: (1) 初始化部分: 为循环程序做准备, 如规定循环次数、 给各变量和地址指针预置初值。 (2) 处理部分: 为反复执行的程序段, 是循环程序的实体, 也是循环程序的主体。 (3) 循环控制部分: 这部分的作用是修改循环变量和控制变量, 并判断循环是否结束, 直到符合结束条件时, 跳出循环为止。 (4) 结束部分: 这部分主要是对循环程序的结果进行分析、 处理和存放。,循环:单重循环 多重循环(二重以上)循环嵌套。 在多重循环程
7、序中,只允许外重循环嵌套内重循环程序,而不允许循环体互相交叉,另外,也不允许从循环程序的外部跳入循环程序的内部。,例4.3 把外部RAM 500050FFH单元的内容清零。 ORG 4200H START1: MOV R0, #00H ;设置循环初始值 MOV DPTR, #5000H LOOP1: MOV A, #00H MOVX DPTR, A ;外部RAM单元清零 INC DPTR ;外部RAM单元加1 INC R0 ;循环次数加1 CJNE R0, #00H, LOOP1 ;循环控制,不等转移 END,例4.4 设三字节无符号数相加, 被加数:内部RAM 20H22H单元(低位在前), 加数: 内部RAM 30H32H单元(低位在前), 结果:存于内部RAM 2022H单元,进位位存于23H单元。 利用ADDC指令进行多字节加法运算。,ORG 4200H MOV R0,#20H ;被加数的低字节地址 MOV R1,#30H ;加数的低字节地址 MOV R2,#03H ;循环次数 CLR C LOOP: MOV A, R0 ADDC A, R1 ;低字节相加 MOV R0,A ;
8、存放字节相加结果 INC R0 INC R1 DJNZ R2, LOOP ;循环控制,R2递减 不为零转移 MOV A, #00H ADDC A,#00H MOV R0, A ;进位位送23H END,例4.5 把内部RAM中起始地址为40H的数据串传送到外部RAM以5000H为首地址的区域,直到发现“$”字符的ASCII码为止。同时规定数据串的最大长度为32个字节。,ORG 4200H MOV R0,#40H ;内部RAM起始地址 MOV DPTR,#5000H ;外部RAM起始地址 MOV R1,#20H ;最大串长 LOOP: MOV A,R0 ;取数据 CLR C ;清进位位 MOV R2,A ;暂存 SUBB A, #24H ;判断是否为“$” JZ QUIT ;是,转“QUIT” MOV A,R2 ;不是,送入外部RAM MOVX DPTR,A INC DPTR ;数据指针加1 INC R0 ;R0加1 DJNZ R1,LOOP ;循环次数控制,R1 递减,不为零转移 QUIT: END,例4.6 设MCS-51单片机的时钟频率为fosc = 6 MHz,试设计延时0.1s
9、的延时程序。 延时程序所花费的时间是该程序指令的总机器周期数与机器周期的乘积。 通常,延时程序采用MOV和DJNZ指令来实现。 单循环延时程序,最大的循环次数位256,则程序段为: MOV R0,#00H ;机器周期数为1 DJNZ R0,$ ;机器周期数为2 若单片机晶振为6MHz,则一个机器周期为2us。 延时时间:(1+2562)2s1026s。 需采用多重循环。,多重循环: 在一个循环体中又包含了其它的循环程序。 这种方式是实现延时程序的常用方法。 使用多重循环时, 必须注意: (1) 循环嵌套, 必须层次分明, 不允许产生内外层循环交叉。 (2) 外循环可以一层层向内循环进入, 结束时由里往外一层层退出。 (3) 内循环可以直接转入外循环, 实现一个循环由多个条件控制的循环结构方式。,MOV R7,#200 DELAY1: MOV R6,#125 DELAY2: DJNZ R6,DELAY2 ;1254500s0.5ms DJNZ R7,DELAY1 ;0.52000.1s 该段程序的延时时间约为0.1006s 若需延时更长时间,可采用多重循环,如1s延时可采用3重循环,而用7重循环可延时几年。,4.2.3 分支程序(选择) 分支程序的基本结构:单分支和多分支。 其特点是:各处理模块是相互排斥的。,13条条件转移指令,分别为: JZ,JNZ: 累加器判零转移指令; CJNE: 比较条件转移指令,4条; DJNZ: 减1条件转移指令,2条; JC, JNC , JB,JNB,JBC: 位控制条件转移指令等四类。,例4.7 x, y均为8位二进制数, x存放在VAR单元中,函数值y存放在FUNC中, 按下式给y赋值.,ORG 4200H VAR EQU
《单片机幻灯片》由会员F****n分享,可在线阅读,更多相关《单片机幻灯片》请在金锄头文库上搜索。