




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 汇编语言程序设计,教学目标 4.1 单片机汇编语言与指令格式 4.2 源程序的设计步骤和汇编 4.3 汇编语言程序设计 本章小结 思考题与习题,教学目标,通过本章教学,要求达到以下目标: 1. 熟悉汇编语言的语句结构; 2. 了解手工汇编,计算偏移量及转移地址的 方法; 3. 了解程序设计的步骤,会画程序流程图; 4. 掌握顺序程序、分支程序、循环程序、子程 序等基本程序的编制方法。,4.1 MCS51单片机汇编语言与指令格式,4.1.1 程序设计语言,程序设计语言,机器语言 汇编语言 高级语言,机器语言,由于构成计算机的电子器件特性所决定, 计算机只能识别二进制代码。 这种以二进制代
2、码来描述指令功能的语言, 称之为机器语言, 用机器语言组成的程序, 称为目标程序。 计算机就是按照机器语言的指令来完成各种功能操作的, 它具有程序简捷、占用存储空间小、执行速度快、控制功能强等特点。,汇编语言,用来替代机器语言的进行程序设计的一种语言,由助记符、保留字和伪指令等组成。很容易让人们所识别、记忆和读写。 汇编语言编写出的程序是汇编语言源程序,可由“汇编程序”翻译成机器语言程序(即目标代码)。,汇编程序,容易让人们所识别、记忆和读写, 但不能为机器直接识别执行,001010010101010101010101机器语言程序(即目标代码,机器可以识别执行010101010101)0101
3、01010101,高级语言,是面向过程和问题并能独立于机器的通用程序设计语言,是一种接近人们自然语言和常用数学表达式的计算机语言。 高级语言编写的程序是不能被机器直接执行的,但可以被常驻在内存或磁盘上的解释程序或编译程序等编译成目标代码后才能被机器所执行。,独立于机器,可移植性强结构化设计,程序清晰,但是占用存储空间大,编译程序,001010010101010101010101机器语言程序(即目标代码,机器可以识别执行010101010101)010101010101,4.1.2 格汇编语言格式,MCS51单片机汇编语言指令的标准格式如下: 标号: 操作码 目的操作数 , 源操作数 ; 注释
4、例如: LOOP: ADD A, 10H ; (A)(A)+10H,(1) 方括号 表示该项是可选项, 可有可无。 (2) 标号是用户设定的符号, 它实际代表该指令所在的地址。标号必须以字母开头, 其后跟18个字母或数字, 并以“:”结尾。,(3) 操作码是用英文缩写的指令功能助记符。它确定了本条指令完成什么样的操作功能。 如: ADD表示加法操作。 任何一条指令都必须有该助记符项, 不得省略。 (4) 目的操作数提供操作的对象, 并表示操作结果存放单元的地址, 它与操作码之间必须以一个或几个空格分隔。 如上例中A表示操作对象是累加器A的内容, 并指出操作结果又回送A存放。,标号: 操作码 目
5、的操作数 , 源操作数 ; 注释 例如: LOOP: ADD A, 10H ; (A)(A)+10H,(5) 源操作数指出的是一个源地址(或立即数), 表示操作的对象或操作数来自何处。 它与目的操作数之间要用“,”号隔开。 (6) 注释部分是在编写程序时, 为了增加程序的可读性, 由用户拟写对该条指令或该段程序功能的说明。 它以分号“;”开头, 可以用中文、 英文或某些符号来表示, 显然它不存入计算机, 只出现在源程序中。,标号: 操作码 目的操作数 , 源操作数 ; 注释 例如: LOOP: ADD A, 10H ; (A)(A)+10H,操作数的5种合法形式,1、数字形式:二进制、十进制、
6、十六进制 01001100B,20D,0A0H 2、工作寄存器和特殊功能寄存器 R0R7,ACC,SFR 3、标号地址 MOV A , M;设M已定义过 4、带加减算符的表达式 MOV A , M+1 5、采用$符 JNB TF0 , $,标号: 操作码 目的操作数 , 源操作数 ; 注释 例如: LOOP: ADD A, 10H ; (A)(A)+10H,指令性语句使CPU执行一个具体的操作。 伪指令不要求计算机做任何操作,也没有对应的机器码,不产生目标程序,不影响程序的执行,仅仅是能够帮助进行汇编的一些指令。,4.1.3 汇编语言构成,指令性语句:111条指令的助记符语句。 指示性语句:伪
7、指令语句。,15,常用伪指令 单片机汇编语言程序设计中,除了使用指令系统规定的指令外,还要用到一些伪指令。伪指令又称指示性指令,具有和指令类似的形式,但汇编时伪指令并不产生可执行的目标代码,只是对汇编过程进行某种控制或提供某些汇编信息。下面对常用的伪指令作一简单介绍。,用来指定程序或数据的起始位置; 给出一些连续存放数据的地址; 为中间运算结果保留一部分存储空间; 为源程序中的符号和标号赋值; 表示源程序结束等等。 不同版本的汇编语言,伪指令的符号和含义可能有所不同,但基本用法是相似的。,伪指令可以,伪指令列表,1、 ORG设置目标程序起始地址伪指令 2、 END结束汇编伪指令 3、 DB定义
8、字节伪指令 4、 DW定义字伪指令 5、 DS预留存储空间伪指令 6、 EQU等值伪指令 7、 DATA数据地址赋值 8、 BIT位地址定义伪指令,18,一、 汇编起始指令 ORG 指令格式为: ORG nn 该伪指令的功能是规定其后面的目标程序或数据块的起始地址。它放在一段源程序(主程序、子程序)或数据块的前面,说明紧跟在其后的程序段或数据块的起始地址就是ORG后面给出的地址。例如: ORG 2000H START:MOV A,#7FH 。,例如: ORG 2000H START:MOV A,#7FH,格式:标号: ORG 地址(十六进制表示),2000H,1FFFH,2001H,机器码:7
9、4 7FH,20,例: ORG 2000H MOV SP, 60H MOV R0, 2FH MOV R2, 0FFH ORG伪指令说明其后面程序的目标代码在存储器中存放的起始地址是2000H, 即 存储器地址 程序代码 2000H 75 81 60 2003H 78 2F 2005H 7A FF,21,二、 汇编结束指令END 指令格式: 标号: END 地址或标号 格式中标号以及END后面的地址或标号可有可无。 功能: 提供汇编结束标志。汇编程序遇到END后就停止汇编, 对 END以后的语句不予处理, 故END应放在程序的结束处。,22,三、等值指令EQU ( Equal ) 指令格式: 字
10、符名称 EQU 数字或汇编符号 功能: 使指令中的字符名称等价于给定的数字或汇编符号。 特别注意: 必须先赋值后使用, 同一个标号只能赋值一次。 例: PA EQU 8001H 即给字符PA赋值为8001H。,书:131页。编程好习惯之一:上下对齐! ORG 0500H AA EQU R1 BB EQU 10H DELAY EQU 07E6H MOV R0, BB ;R0(10H) MOV A, AA ;A R1 LCALL DELAY ;调07E6H子程序,该伪指令的功能与EQU类似,可以将DATA右边表达式的 值赋给左边的字符名称。表达式可以是常数、地址标号或表达式,但不可以是一个汇编符号
11、(如R1等)。 DATA和EQU的主要区别是:EQU中的字符名称是先定义后使用,而DATA中的字符名称没有这种限制。 定义8位数据用DATA,定义16位数据用XDATA。,格式:字符名称 DATA 表达式,格式: 字符名称 EQU 数字或汇编符号,四、数据赋值指令DATA,25,五、 定义字节指令DB 指令格式: 标号: DB 8位二进制数表 功能: 把 8 位二进制数表依次存入从标号开始的连续的存储单元中。 标号区段可有可无, DB指令之后的 8 位二进制数表是一个字节常数或用逗号隔开的字节串, 也可以是用引号括起来的ASCII码字符串 (一个 ASCII字符相当于一个字节)。,ORG 20
12、00H TAB1: DB 30H,8AH, 73 DB 01011010B, 5, A,2000H,2001H,2002H,2003H,2004H,2005H,由于ORG 2000H,所以TAB1的地址为2000H,因此,以上伪指令经汇编后,将对2000H开始的连续存储单元赋值:,;十进制数73以十六进制数存放 ; 01011010B=5AH ;35H是数字5的ASCII码 ;41H是字母A的ASCII码,27,六、 定义字指令DW 指令格式: 标号: DW 16 位数据表 功能:与DB相似, 区别仅在于从指定地址开始存放的是指令中的 16 位数据。每个 16 位数据要占两个存储单元, 高8
13、位先存, 低 8 位后存, 这和MCS -51指令中的16位数据存放顺序是一致的。,ORG 1500H TAB2: DW 1234H,80H,10,1500H,汇编以后:,1501H,1502H,1503H,1504H,1505H,29,七. 定义空间伪指令DS 格式: 标号: DS 表达式 功能:从指定的地址开始,保留若干个存储单元作为备用的空间。,ORG 1000H SPC:DS 20H DB 30H,8FH,汇编后从1000H开始,预留32(20H)个字节的内存单元,然后从1020H开始,按照下一条DB指令赋值,即(1020H)=30H,(1021H)=8FH。,1000H,1020H,
14、0FFFH,1021H,101FH,31,八、BIT位地址赋值伪指令 格式: 字符名称 BIT 位地址 功能: 把右边的位地址赋给左边的“字符名”。 例如: ORG 0300H A1 BIT 00H A2 BIT P1.0 MOV C,A1 MOV A2,C,4.2 源程序的设计步骤和汇编,设计步骤 1、拟定设计任务书 2、建立数学模型 3、确立算法 4、绘制程序流程图 5、编制汇编语言源程序 6、上机调试,33,单片机汇编语言程序设计的基本步骤如下: (1) 题意分析。熟悉并了解汇编语言指令的基本格式和主要特点,明确被控对象对软件的要求,设计出算法等。 (2) 画出程序流程图。编写较复杂的程
15、序,画出程序流程图是十分必要的。程序流程图也称为程序框图,是根据控制流程设计的,它可以使程序清晰,结构合理,便于调试。,34,(3) 分配内存工作区及有关端口地址。分配内存工作区,要根据程序区、数据区、暂存区、堆栈区等预计所占空间大小,对片内外存储区进行合理分配并确定每个区域的首地址,便于编程使用。 (4) 编制汇编源程序。 (5) 仿真、调试程序。 (6) 固化程序。,4.2 源程序的设计步骤和汇编,汇编(汇编程序) 源程序 目标码 (汇编语言) (机器语言) 反汇编(汇编程序),汇编和反汇编示意图,4.2 源程序的设计步骤和汇编,汇编 1、人工汇编 2、机器汇编,P136 表4.2 P13
16、7 表4.3,第一次汇编:翻译机器码 第二次汇编:计算偏移量,人工汇编,P136 例4.1,ORG 0100H SUM DATA 1FH BLOCK DATA 20H START: MOV R0,#BLOCK MOV A,R0 CJNE A,#00H,LOOP HERE: SJMP $ LOOP: CLR A NEXT: INC R0 ADD A,R0 DJNZ BLOCK,NEXT MOV SUM, A SJMP HERE END,RAM,20H,1FH,SUM,BLOCK,LEN 个单元内容求和,编程好习惯之一:上下对齐,清晰易读!,第一次汇编:翻译机器码,SUM DATA 1FH BLO
17、CK DATA 20H,第二次汇编:计算偏移量,地址偏移量目标地址转移指令起始地址转移指令字节数,LOOP100810030302H,$10061006202H ,补码为 FEH,NEXT1009100B0305H,补码为FBH,4.2 源程序的设计步骤和汇编,汇编 1、人工汇编 2、机器汇编,第一次汇编:翻译机器码 第二次汇编:计算偏移量,机器汇编,汇编 软件,汇编源程序,目标代码(机器语言),4.3.1 简单程序设计 4.3.2 分支程序设计 4.3.3 散转程序设计 4.3.4 循环程序设计 4.3.5 查表程序设计 4.3.6 子程序设计和参数传递,4.3 汇编语言程序设计,例 1 两
18、个无符号双字节数相加。 设被加数存放于内部RAM的40H(高位字节), 41H(低位字节), 加数存放于50H(高位字节), 51H(低位字节), 和数存入 40H和41H单元中。,4.3.1 简单程序设计,没有分支、顺序执行的程序,+,CY,程序如下: START:CLR C ; 将Cy清零 MOV R0, 41H ; 将被加数地址送数据指针R0 MOV R1, 51H ; 将加数地址送数据指针R1 AD1: MOV A, R0 ; 被加数低字节的内容送入A ADD A, R1 ; 两个低字节相加 MOV R0, A ; 低字节的和存入被加数低字节中 DEC R0 ; 指向被加数高位字节 D
19、EC R1 ; 指向加数高位字节 MOV A, R0 ; 被加数高位字节送入A ADDC A, R1 ; 两个高位字节带Cy相加 MOV R0, A ; 高位字节的和送被加数高位字节 RET,R0,R1,例 2 将两个半字节数合并成一个一字节数。 设内部RAM 40H, 41H单元中分别存放着 8 位二进制数, 要求取出两个单元中的低半字节, 并成一个字节后, 存入 50H单元中(从40H单元取的数放在高4位,从41H单元取的数放在低4位)。,40H,41H,50H,START: MOV R1, 40H ; 设置R1为数据指针 MOV A, R1 ; 取出第一个单元中的内容 ANL A, 0F
20、H ; 取第一个数的低半字节 SWAP A ; 移至高半字节 INC R1 ; 修改数据指针 XCH A, R1 ; 取第二个单元中的内容 ANL A, 0FH ; 取第二个数的低半字节 ORL A, R1 ; 拼字 MOV 50H, A ; 存放结果 RET,40H,41H,50H,ORG 0500H MOV R0,#22H MOV R0,#00H ;22H清零 MOV A,20H;20H中的BCD码送A XCHD A,R0;低位BCD送22H ORL 22H,#30H;完成低位BCD的转换 SWAP A;高位BCD码送低4位 ORL A,#30H;完成高位BCD的转换 MOV 21H,A;
21、存入21H SJMP $ END,P138 例4.2 由BCD码求ASCII码,030H 131H 939H,BCD码ASCII码,20H,21H,22H,P139 例4.3:已知16位补码(负数),求原码的绝对值。,ORG 0000H LJMP MIAN ORG 0300H NUMDATA 20H MAIN: MOV R0,#NUM MOV A,R0;低8位A CPL A ADD A,#01H MOV R0,A INC R0 MOV A,R0;高8位A CPL A ADDC A,#00H ANL A,#7FH ;去掉符号位 MOV R0,A SJMP $;结束 END,为什么不用 INC A
22、 (P100),NUM,NUM1,分支结构框图 (a) 单分支流程 (b) 多分支流程,4.3.2 分支程序设计,P140 例4.5,例 设x存放在内部RAM 的30H单元中,结果y存 入31H单元.,ORG 2000H START: MOV A, 30H ;AX JZ LP2 ;X=0转移 JNB ACC.7, LP1 ;X0转移 MOV A, #0FFH ;X0则Y=1 LP2: MOV 31H, A ;31HY END,比较两个无符号数的大小。 设外部RAM的存储单元ST1和ST2中存放两个不带符号的二进制数, 找出其中的大数存入外部 RAM 中的 ST3单元中。,例P142 例4.7,
23、ST1,ST2,ST3,A,R2,程序如下: ORG 1000H ST1 EQU 0000H ST2 EQU 0001H ST3 EQU 0002H START: CLR C ; 清零Cy MOV DPTR, ST1 ; 第一个数的指针 MOVX A, DPTR ; 取第一个数 MOV R2, A ; 保存 MOV DPTR, ST2 ; 第二个数的指针 MOVX A, DPTR ; 取第二个数 CLR C,0000H,0001H,0002H,A,R2,CLR C SUBB A, R2 ; 两数比较,相减后A中的值已变化 JNC BIG1 ; 若A比R2大,即第二个数大, 则转 XCH A,
24、R2 ; A比R2小,第一个数大, 交换后A中为大数 BIG0: MOV DPTR, ST3 MOVX DPTR, A ; 存大数 SJMP OUT BIG1: MOVX A, DPTR ; 第二个数大,重新取出第二个数 SJMP BIG0 OUT: RET,0000H,0001H,0002H,A,R2,P143 例4.8,1、200名学生的外语成绩存放外部RAM的ENGLISH开始的单元 2、10095分为A级,统计结果存内部RAM的GRADA单元 3、9490分为B级,统计结果存内部RAM的GRADB单元,ORG 0600H ENGLISH XDATA 1000H GRADA DATA 2
25、0H GRADB DATA 21H MOV GRADA , #00H MOV GRADB , #00H MOV R2 , #200 ;参赛总人数200人 MOV DPTR , #ENGLISH ;取存成绩的首址 LOOP:MOVX A , DPTR CJNE A , #95 , LOOP1;与95比较,形成Cy,LOOP: MOVX A,DPTR CJNE A,#95,LOOP1;与95比较,形成Cy LOOP1:JNC NEXT1;=95 跳 CJNE A , #90 , LOOP2;与90比较,形成Cy LOOP2:JC NEXT;90 跳 INC GRADB ;B级人数加1 SJMP N
26、EXT NEXT1:INC GRADA ;A级人数加1 NEXT: INC DPTR ;修改学生成绩指针 DJNZ R2,LOOP ;是否统计完,未完跳 SJMP $ END,散转程序是分支程序的一种, 它可根据运算结果或输入数据将程序转入不同的分支。,4.3.3 散转程序设计,4.3.3 散转程序设计,指令:JMP A+DPTR,功能:该指令把累加器的8位无符号数与16位数据指针的内容相加, 并把相加的结果装入程序计数器PC, 控制程序转向目标地址去执行。,特点: 由 DPTR的内容决定分支转移程序的首地址, 由累加器 A的内容来动态选择其中的某一个分支转移程序。,P141 例4.6,N=1
27、28的分支程序。已知R3的值为00H7FH中的一个,请编出根据R3中的值转移到相应分支程序的程序。,指令0,指令1,指令127,TAB+00H,+01H,+02H,+03H,+FEH,+FFH,设散转指令表首地址为: TAB,赋给DPTR 各子程序入口地址为: ROUT00ROUT127,ROM,JMP A+DPTR,R3=0,跳转到TAB处执行分支0,R3=1,跳转到TAB+2处执行分支1,R3=127,跳转到TAB+254处执行分支127,P141 例4.6,ORG 0100H MOV A,R3 ;R3A RL A ; AA2 MOV DPTR, #TAB ;表首地址送DPTR JMP A
28、+DPTR ;根据A值转移 TAB:AJMP ROUT00 ;当(A)=0时转ROUT00执行 AJMP ROUT01 ;当(A)=1时转ROUT01执行 AJMP ROUT127 ;当(A)=127时转ROUT127执行 ROUT00: ROUT01: ROUT127: END,4.3.4 循环程序设计,循环程序一般由四个主要部分组成: (1) 初始化部分: 为循环程序做准备, 如规定循环次数、 给各变量和地址指针预置初值。 (2) 处理部分: 为反复执行的程序段, 是循环程序的实体, 也是循环程序的主体。 (3) 循环控制部分: 这部分的作用是修改循环变量和控制变量, 并判断循环是否结束,
29、 直到符合结束条件时, 跳出循环为止。 (4) 结束部分: 这部分主要是对循环程序的结果进行分析、 处理和存放。,4.3.3 循环程序设计,先处理后判断,先判断后处理,一、 单重循环,例 工作单元清零。 在应用系统程序设计时, 有时经常需要将存储器中部分地址单元作为工作单元, 存放程序执行的中间值或执行结果, 工作单元清零工作常常放在程序的初始化部分中。 设有50个工作单元, 其首址为外部存储器8000H单元, 则其工作单元清零程序如下:,CLEAR: CLR A MOV DPTR, 8000H ; 工作单元首址送指针 MOV R2, #50 ; 置循环次数 CLEAR1: MOVX DPTR
30、, A INC DPTR ; 修改指针 DJNZ R2, CLEAR1 ; 控制循环 RET,先处理后控制,例 设在内部RAM的BLOCK单元开始处有长度为LEN个的无符号数据块, 试编一求和程序, 并将和存入内部RAM的SUM单元(设和不超过8 位)。,BLOCK EQU 20H SUM EQU 19H LEN EQU 05H START: CLR A ; 清累加器A MOV R2, LEN ; 数据块长度送R2 MOV R1, BLOCK ; 数据块首址送R1 LOOP: ADD A, R1 ; 循环加法 INC R1 ; 修改地址指针 DJNZ R2, LOOP ; 修改计数器并判断 M
31、OV SUM, A ; 存和 RET,先处理后控制,1、上述程序属先处理后控制。 2、当LEN0时,将出错。 改正办法:先控制后处理。 见书中例题P146 例4.9(1),自学。,说明:,课后思考,本题若采用先处理后判断的控制,如何修改可以避免LEN=0的错误?,66,例 查找程序。设在以M为 起始地址的内部RAM中连续存 放有100个单字节数,试编一 程序查找一个为a的数,找到 后把其地址送N单元,若这个 数不存在,则把FFH送N单元。 解:使用比较指令查找,编 写成循环程序,其流程图如图 所示,程序设计如下:,67,ORG1800H START:MOV R0, #M MOV R1, #64
32、H LP1: CJNE R0, #a, LP2 ;比较,不相等转移 MOV N, R0 ;找到,N(R0) SJMP DONE LP2: INC R0 DJNZ R1, LP1;(R1)-1=/0则转移 MOV N, #0FFH;未找到,N0FFH DONE:SJMP $ END,课后思考:修改程序,实现记录100数据中含有a的个数。,68,采用多重循环程序, 即在一个循环体中又包含了其它的循环程序, 这种方式是实现延时程序的常用方法。 使用多重循环时, 必须注意: (1) 循环嵌套, 必须层次分明, 不允许产生内外层循环交叉。 (2)外循环可以一层层向内循环进入, 结束时由里往外一层层退出。
33、,二、 多重循环,69,双重循环程序设计延时程序设计 延时程序在单片机汇编语言程序设计中使用非常广泛,所谓延时,就是让CPU做一些与主程序功能无关的操作(例如将一个数字逐次减1直到为0)来消耗掉CPU的时间。 由于我们知道CPU执行每条指令的准确时间,因此执行整个延时程序的时间也可以精确计算出来。也就是说,我们可以写出延时长度任意而且精度相当高的延时程序。,70,例:单片机外接晶振频率12MHZ时的各种时序单位: 振荡周期=1/fosc=1/12MHZ=0.0833us 机器周期=12/fosc=12/12MHZ=1us 指令周期=(14)机器周期=14us,例 10 秒延时程序。 延时程序与
34、 MCS - 51 执行指令的时间有关, 如果使用 6 MHz晶振, 一个机器周期为 2 s, 计算出一条指令以至一个循环所需要的执行时间, 给出相应的循环次数, 便能达到延时的目的。10 秒延时程序如下:,DELAY: MOV R5, 50 DEL0: MOV R6, 200 DEL1: MOV R7, 248 DEL2: DJNZ R7, DEL2 DJNZ R6, DEL1 DJNZ R5, DEL0 RET,例 10 秒延时程序。 延时程序与 MCS - 51 执行指令的时间有关, 如果使用 6 MHz晶振, 一个机器周期为 2 s, 计算出一条指令以至一个循环所需要的执行时间, 给出
35、相应的循环次数, 便能达到延时的目的。10 秒延时程序如下:,DELAY: MOV R5, 50 DEL0: MOV R6, 200 DEL1: MOV R7, 248 DEL2: DJNZ R7, DEL2 DJNZ R6, DEL1 DJNZ R5, DEL0 RET,1 1 1 2 2 2 2,延时时间4,990,1502 9,980,300 s,10S10,000,000 uS 误差19700 uS19.7mS,周期数(2482)12)20012)5012 4990150,指令执行周期数,冒泡排序程序设计,也叫气泡排序、两两比较排序,排 序:将一组数据按从大到小、或从小到大进行排列,基
36、本原理:进行多轮的两两数据比较 第一轮:选出最大(最小)数,需比较N1 次。 第二轮:选出次最大(次最小)数,需比较N2次。 第N1轮:选出最小(最大)数,需比较1 次。,设有D0D5共6个数,随机放在RAM中,且: D5D4D3D2D1D0,进行从大到小的排序,第一轮比较,共比较5次,每次比较选出一个大数,与下一个数进行比较,最后选出最大数D5。,设有D0D5共6个数,随机放在RAM中,且: D5D4D3D2D1D0,进行从大到小的排序,第二轮比较,共比较4次,每次比较选出一个大数,与下一个数进行比较,最后选出次最大数D4。,实际编程时,往往还是比较n-1次(5次),只是最后一次比较数据不改
37、变数据顺序。,第三轮比较,共比较3次,每次比较选出一个大数,与下一个数进行比较,最后选出第三大数D3。,实际编程时,往往还是比较n-1次(5次),只是最后一次比较数据不改变数据顺序。,第四轮比较,共比较2次,选出第四大数D2。,实际编程时,往往还是比较n-1次(5次),只是最后一次比较数据不改变数据顺序。,第五轮比较,共比较1次,选出第五大数D1。,经过五轮比较,完成排序工作。,实际编程时,往往还是比较n-1次(5次),只是最后一次比较数据不改变数据顺序。,结论:,1、N个数据排序需进行N1轮比较。 2、第一轮进行N1次比较,以后每轮比较次数减1。 3、在某轮比较中,如不发生数据交换,排序即告
38、完成。可设置“数据交换标志”来判定排序是否结束。 4、大多数情况下,并不需要进行完N1比较就可完成排序。,为了简化程序结构,实际排序的做法是: 1、确定每轮比较次数:N1次。若有数据交换则使标志置位。 2、若某轮比较后标志0,则排序结束。,说明:,在此不确定比较轮数,以交换数据标志做比较结束判断。,例 在内部 RAM中, ARRAY开始的单元中有一无符号数据块, 其个数为SIZE个字节。试将这些无符号数按从小到大重新排列, 并存入原存储区。,排序后,ARRAY,排序前,SIZE,ARRAY,SIZE,程序框图,例 在内部 RAM中, ARRAY开始的单元中有一无符号数据块, 其个数为SIZE个
39、字节。试将这些无符号数按从小到大重新排列, 并存入原存储区。,SIZE EQU 10 ; 数据个数 ARRAY EQU 50H ; 数据起始地址 CHANGE BIT 00H ; 交换标志 ORG 0100H SORT: MOV R0, #ARRAY MOV R7, #SIZE-1;R7N1 CLR CHANGE,ARRAY,排序前,GO_ON: MOV A, R0; 取第一个数 INC R0 MOV B, R0 ; 取第二个数 CJNE A, B, NOTEQUAL ;不等跳 SJMP NEXT NOTEQUAL: JC NEXT ;前小后大, 不交换 SETB CHANGE ;前大后小,
40、置交换标志 XCH A, R0 DEC R0 XCH A, R0 INC R0 NEXT: DJNZ R7, GO_ON JB CHANGE, SORT SJMP $ END,RAM,(R0),ACC,交换前,RAM,(R0),ACC,交换后,ARRAY,排序后,查表程序是一种常用程序, 它广泛使用于LED显示控制、 打印机打印控制、数据补偿、数值计算、转换等功能程序中, 这类程序具有简单、执行速度快等特点。 所谓查表法, 就是预先将输入变量X与函数值Y之间关系的一张表求出, 然后把这张表存于单片机的程序存储器ROM中,根据变量X在表格中查找对应的函数值Y, 使Y=f(X)。,4.3.5 查表
41、程序设计,两条查表指令:,MOVC A, A+DPTR,MOVC A, A+PC,1、确定数据表格首地址DPTR 2、确定偏移量ACC 3、用 MOVC A, A+DPTR 查表取数,1、确定偏移量ACC 2、完成偏移量修正:ADD A,data 3、用 MOVC A, A+PC 查表取数,使得:PCdata数据表首地址 PC值为执行完MOVC A,A+PC后的PC值,两条查表指令:,MOVC A, A+DPTR,MOVC A, A+PC,1、确定数据表格首地址DPTR 2、确定偏移量ACC 3、用 MOVC A, A+DPTR 查表取数,1、确定偏移量ACC 2、完成偏移量修正:ADD A,
42、data 3、用 MOVC A, A+PC 查表取数,使得: PCdata数据表首地址 PC值为执行完MOVC A,A+PC后的PC值,TAB:,ROM,87,例 在程序中定义一个09的平方表,利用查表指令找出20H 单元内容的平方值,保存到21H。,查表程序的关键是表格的定义和如何实现查表。 SHU EQU 20H ORG 0000H MOVDPTR,#TABLE ;表首地址DPTR(数据指针) MOVA,SHU ;SHUA MOVCA,A+DPTR ;查表指令 MOV SHU+1,A ; ASHU+1 SJMP$ ;程序暂停 TABLE:DB0,1,4,9,16,25,36,49,64,8
43、1;定义09平方表 END,一个十六进制数存放在内部 RAM 的HEX单元的低 4 位中, 将其转换成ASCII码并送回 HEX+1单元。,十六进制 09的ASCII码为:30H39H AF的ASCII码为:41H46H, 设ASCII码表格的首地址为:ASCTAB,要求用 MOVC A, A+PC 指令实现,查表程序的关键是表格的定义和如何实现查表。,程序中, 查表指令MOVC A, A+PC到表头之间相隔2条指令, 占用 3 个字节, 故修改指针数据data= 3。,ORG 1000H HEXASC: MOV A, HEX ANL A, 0FH ADD A, data; 修改指针 MOVC
44、 A, A+PC ;指令码 83H MOV HEX+1, A ;指令码 F5,HEX+1 RET ;指令码 22H ASCTAB: DB 30H, 31H, 32H, 33H, 34H DB 35H, 36H, 37H, 38H, 39H DB 41H, 42H, 43H, 44H, 45H DB 46H,表头,待具体指令确定后再求data,ROM,通常把一些基本操作功能编制为程序段作为独立的子程序, 以供不同程序或同一程序反复调用。,4.3.6 子程序和参数传递,一、 子程序的概念,注意:,子程序的第一条指令地址称为子程序的起始地址或入口地址,该指令前必须有标号,标号一般以子程序任务命名。,
45、二、 子程序的调用和返回,(PC)(PC)3 (SP)(SP)1 (SP)(PC70) (SP)(SP)1 (SP)(PC815) (PC)addr16,LCALL arrd16,(PC)(PC)2 (SP)(SP)1 (SP)(PC70) (SP)(SP)1 (SP)(PC815) (PC)addr11,ACALL arrd11,(PC815)(SP) (SP)(SP)-1 (PC70)(SP) (SP)(SP)-1,RET,SP,SP1,SP2,RAM,ROM,PC,PC+3,(PC+3)_H,(PC+3)_L,SP1,SP1,SP,RAM,(PC)_H,(PC)_L,参数传递,利用寄存器
46、或片内RAM传递参数 利用寄存器传递参数的地址 利用堆栈传递参数 利用位地址传递参数,子程序调用中, 主程序应先把有关的参数存入约定的位置, 子程序在执行时, 可以从约定的位置取得参数, 当子程序执行完, 将得到的结果再存入约定的位置, 返回主程序后, 主程序可以从这些约定的位置上取得需要的结果, 这就是参数的传递。,例4.16 P156,求:ca2b2 ,设a10,b10,MDA,MDB,MDC,ORG 1000H MDADATA 20H MDBDATA 21H MDCDATA 22H MOV A, MDA ACALL SQR MOV R1,A MOV A, MDB ACALL SQR AD
47、D A,R1 MOV MDC,A SJMP $ SQR:ADD A,#01H MOVC A,A+PC RET ;字节数1 SQRTAB:DB 0,1,4,9,16,25,36,48,64,81 END,本例利用ACC传递参数,在HEX单元中存有两个十六进制数,将其转换成ASCII码,存放在内部RAM的ASC,ASC1两个单元中。 本题利用堆栈进行参数传递。,HEX,ASC,ASC+1,例4.17 P156,相关指令功能: PUSH: SPSP+1,(direct)(SP) POP: direct(SP) , SPSP-1 ACALL: PCPC+2 SPSP+1, PCL(SP) SPSP+1
48、, PCH(SP) RET: PCH(SP), SPSP-1 PCL(SP), SPSP-1,ORG 1200H MAIN:PUSH HEX ACALL HASC POP ASC MOV A,HEX SWAP A PUSH ACC ACALL HASC POP ASC+1 SJMP $,SP,SP+1,SP+2,1200H 1202H 1204H 1206H 1208H 1209H 120BH 120DH 120FH,例4.17 P156,SP+1,SP+2,SP+3,SP,HEX,ASC,ASC+1,SP+3,第一次调用,HASC: DEC SP DEC SP POP ACC ANL A,
49、0FH ; 保留低半字节 ADD A, 07H ; 修改 A值 MOVC A, A+PC ; 查表 PUSH ACC INC SP INC SP RET TAB: DB 0,1,2,3,4,5,6,7 DB 8,9,A, B, C, D,E,F END,SP+1,SP+2,SP+3,SP,SP+1,SP+2,SP+3,SP,SP+1,SP+2,SP+3,SP,PC=1204H,2 2 2 1,ORG 1200H MAIN:PUSH HEX ACALL HASC POP ASC MOV A,HEX SWAP A PUSH ACC ACALL HASC POP ASC+1 SJMP $,SP,SP+1,SP+2,1200H 1202H 1204H 1206H 1208H 1209H 120BH 120DH 120FH,例4.17 P156,SP+1,SP+2,SP+3,SP,HEX,ASC,ASC+1,SP+3,第一次调用,作业,4.1 4.24.3 4.44.13 4.174.23 4.25,本章小结,1. 汇编语言的语句结构由4个部分组成:标号:操作码 (目的操作数),(源操作数);注释。其中标号是指令的符号地址;操作码表示指令的操作功能,它是汇编语言指令中唯一不可缺省的部分;操作数是参加操作的数据或数据地址;注释是指令功能的说明。在汇编语言指令中,除操作码之
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版彩钢厂房施工现场临时设施建设合同示例
- 2025年度汽车租赁服务协议(个人租给品牌合作)
- 2025版材料合同项目验收标准补充协议范本
- 2025版7生态住宅区物业服务合同模板
- 二零二五年度文化场馆玻璃门窗采购合同模板
- 二零二五年度电子产品采购合同范本(含知识产权)
- 2025版财务主管在职期间保密义务及违约赔偿合同
- 二零二五版高端别墅装修工程合作协议标准范本
- 二零二五版国家秘密保护与安全审查合同
- 二零二五年度创新插班生教育支持合同范本
- DB53-T+1176.15-2023云南省行政村、社区编码+第15部分:德宏傣族景颇族自治州
- 2022年永州市中小学教师招聘笔试真题
- 环境科学与工程专业英语翻译第三版钟理
- JJF 1015-2014计量器具型式评价通用规范
- GB/T 8332-2008泡沫塑料燃烧性能试验方法水平燃烧法
- GB/T 20330-2006攻丝前钻孔用麻花钻直径
- GB/T 18033-2017无缝铜水管和铜气管
- 输血反应的发生及防治
- 湖北省仙桃市各县区乡镇行政村村庄村名居民村民委员会明细
- 中粮集团朝阳大悦城招商手册
- 钢板仓施工方案
评论
0/150
提交评论