《第5章80C51单片机汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《第5章80C51单片机汇编语言程序设计.ppt(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第5 5章章 汇编语言程序设计简介汇编语言程序设计简介 5.1 5.1 单片机程序设计语言概述单片机程序设计语言概述5.2 5.2 汇编语言基本结构汇编语言基本结构12/20/2022第5章 汇编语言程序设计简介 5.1 5.1 单片机程序设计语言概述单片机程序设计语言概述第第5 5章章 汇编语言程序设计简介汇编语言程序设计简介 12/20/2022第5章 汇编语言程序设计简介 5.1.1 5.1.1 单片机常用的三种程序设计语言单片机常用的三种程序设计语言机器语言机器语言 指直接用机器码编写程序、能够被计算机直接执指直接用机器码编写程序、能够被计算机直接执行的语言。行的语言。汇编语言汇编语
2、言 指用指令助记符代替机器码的编程语言指用指令助记符代替机器码的编程语言 高级语言高级语言 广泛应用的高级语言是广泛应用的高级语言是C语言,每当有新型单片语言,每当有新型单片机推出时,都有相配套的机推出时,都有相配套的C编译器加以支持。高编译器加以支持。高级语言编写程序的缺点是实时性不高,结构不紧级语言编写程序的缺点是实时性不高,结构不紧凑,编译后占用存储空间比较大,这一点在存储凑,编译后占用存储空间比较大,这一点在存储器有限的单片机应用系统中没有优势。器有限的单片机应用系统中没有优势。12/20/2022第5章 汇编语言程序设计简介 5.1.2 5.1.2 汇编语言语句的种类和格式汇编语言语
3、句的种类和格式1.指令种类指令种类(1)指令语句)指令语句 每一条指令语句在汇编时都产生一个指令代码每一条指令语句在汇编时都产生一个指令代码机器码。机器码。(2)伪指令语句)伪指令语句 伪指令语句是为汇编服务的。在汇编时没有机器伪指令语句是为汇编服务的。在汇编时没有机器代码与之对应。伪指令语句是控制汇编程序如何代码与之对应。伪指令语句是控制汇编程序如何完成汇编工作的指示,包括控制汇编程序的输入完成汇编工作的指示,包括控制汇编程序的输入/输出,定义数据和符号,条件汇编,分配存储空输出,定义数据和符号,条件汇编,分配存储空间等。这些指示信息就是伪指令。间等。这些指示信息就是伪指令。12/20/20
4、22第5章 汇编语言程序设计简介 伪指令伪指令 是是 对汇编过程对汇编过程 起控制作用,但本身并没有对起控制作用,但本身并没有对应的机器代码的指令。应的机器代码的指令。(1 1)汇编起始指令)汇编起始指令 ORGORG 指令格式为指令格式为:ORG nn 该该指指令令的的作作用用是是指指明明后后面面的的程程序序或或数数据据块块的的起起始始地地址址,它它总总是是出出现现在在每每段段源源程程序序或或数数据据块块的的开开始始。式式中中,nn为为 16 位位地地址址,汇汇编编时时nn确确定定了了此此语语句句后后面面第第一一条条指指令令或或第第一一个个数数据据的的地地址址,此此后后的的源源程程序序或或数
5、数据据块块就就依依次次连连续续存存放放在在以以后后的的地址内地址内,直到遇到另一个直到遇到另一个ORG指指令为止。令为止。2.伪指令伪指令 12/20/2022第5章 汇编语言程序设计简介 例例:ORG 2000H MOV SP,60H MOV R0,2FH MOV R2,0FFH ORG伪伪指指令令说说明明其其后后面面程程序序的的目目标标代代码码在在存存储储器器中存放的起始地址是中存放的起始地址是2000H,即即 存储器地址存储器地址 目标程序目标程序 2000H 75 81 60 2003H 78 2F 2005H 7A FF 12/20/2022第5章 汇编语言程序设计简介 (2 2)等
6、值指令)等值指令EQUEQU 指令格式指令格式:字符名称字符名称 EQU 数字或汇编符号数字或汇编符号 例例:PA8155 EQU 8001H;即给标号即给标号PA8155赋值为赋值为8001H 使指令中的字符名称等价于给定的数字或汇编符号。使指令中的字符名称等价于给定的数字或汇编符号。如如果果在在程程序序中中要要多多次次使使用用到到某某一一地地址址,由由EQU指指令令将将其其赋赋值值给给一一个个字字符符名名称称,一一旦旦需需要要对对其其进进行行变变动动,只只要要改改变变EQU命令后面的数字即可。命令后面的数字即可。注注意意:由由 EQU等等值值的的字字符符名名称称必必须须先先赋赋值值后后使使
7、用用,且且在在同一个源程序中同一个源程序中,同一个标号只能赋值一次。同一个标号只能赋值一次。12/20/2022第5章 汇编语言程序设计简介 (3 3)定义字节指令)定义字节指令DBDB 指令格式指令格式:标号标号:DB 8位二进制数表位二进制数表 功功能能:把把 8 位位二二进进制制数数表表依依次次存存入入从从标标号号开开始始的的连连续续的存储单元中。的存储单元中。标标号号区区段段可可有有可可无无,DB指指令令之之后后的的 8 位位二二进进制制数数表表是是字字节节常常数数或或用用逗逗号号隔隔开开的的字字节节串串,也也可可以以是是用用引引号号括括起起来来的的ASCII码码字字符符串串 (一一个
8、个 ASCII字字符符相相当当于于一个字节一个字节)。12/20/2022第5章 汇编语言程序设计简介 例:例:ORG 1000H BUF1:DB 38H,7FH,80H BUF2:DB 45H,66H ORG伪伪指指令令指指定定了了标标号号BUF1的的地地址址为为1000H,而而DB伪伪指指令令是是将将其其后后的的二二进进制制数数表表38H,7FH,80H依依次次存存放放在在1000H,1001H,1002H 3 个个连连续续单单元元之之中中,BUF2也也是是一一个个标标号号,其其地地址址与与前前一一条条伪伪指指令令连连续续,即即1003H,1004H地址单元中依次存放地址单元中依次存放 4
9、5H,66H。12/20/2022第5章 汇编语言程序设计简介 (4 4)定义字指令)定义字指令DWDW 指令格式指令格式:标号标号:DW 16 位数据表位数据表 该该指指令令的的功功能能与与DB相相似似,区区别别仅仅在在于于从从指指定定地地址址开开始始存存放放的的是是指指令令中中的的 16 位位数数据据,而而不不是是字字节节串串。每每个个 16 位位数数据据要要占占两两个个存存储储单单元元,高高8 位位先先存存,低低 8 位位后后存存,这和这和MCS-51指令中的指令中的16位数据存放顺序是一致的。位数据存放顺序是一致的。12/20/2022第5章 汇编语言程序设计简介 DW 定义字命令定义
10、字命令 ORG 1500HTABLE:DW 7234H,8AH,10H 经汇编后(经汇编后(1500H)=72H,(1501H)=34H,(1502H)=00H,(1503H)=8AH,(1504H)=00H,(1505H)=10H,12/20/2022第5章 汇编语言程序设计简介 DS 定义存储空间命令定义存储空间命令q格式:格式:DS 表达式表达式q功能:在汇编时,从指定地址开始保留功能:在汇编时,从指定地址开始保留DS之后表达式之后表达式的值所规定的存储单元以备后用。的值所规定的存储单元以备后用。q例如:例如:ORG 1000H DS 08H DB 30H,8AH汇编后,从汇编后,从10
11、00H保留保留8个单元,然后从个单元,然后从1008H按按DB命令命令给内存赋值,给内存赋值,即(即(1008H)=30H (1009H)=8AH12/20/2022第5章 汇编语言程序设计简介 BIT 位地址符号命令位地址符号命令格式:字符名格式:字符名 BIT 位地址位地址功能:把功能:把BIT后的位地址值赋给字符名。其中字符名不后的位地址值赋给字符名。其中字符名不是标号,其后没有冒号,但字符名是必须的。是标号,其后没有冒号,但字符名是必须的。例如:例如:A1 BIT P1.0 A2 BIT 02H汇编后,汇编后,P1口第口第0位的位地址位的位地址90H就赋给了就赋给了A1,而而A2的值则
12、为的值则为02H。12/20/2022第5章 汇编语言程序设计简介 例:分析下段程序,试求例:分析下段程序,试求2008H200FH单元的内容单元的内容ORG 2000HDS 08HDB 30H,8AH,10,BDW 54H,1F80H(2008H)=30H(2009H)=8AH(200AH)=0AH(200BH)=42H(200CH)=00H(200DH)=54H(200EH)=1FH(200FH)=80H12/20/2022第5章 汇编语言程序设计简介 (5 5)汇编结束指令)汇编结束指令ENDEND 指令格式指令格式:标号标号:END 地址或标号地址或标号 格格式式中中标标号号以以及及E
13、ND后后面面的的地地址址或或标标号号可可有有可可无无。功功能能:提提供供汇汇编编结结束束标标志志。汇汇编编程程序序遇遇到到 END后后就就停停止止汇汇编编,对对 END以以后后的的语语句句不不予予处处理理,故故 END应应放放在程序的结束处。在程序的结束处。12/20/2022第5章 汇编语言程序设计简介 5.2 5.2 汇编语言基本结构汇编语言基本结构第第5 5章章 汇编语言程序设计简介汇编语言程序设计简介 12/20/2022第5章 汇编语言程序设计简介 5.2.1 5.2.1 顺序程序设计顺序程序设计 例例 1 两个无符号双字节数相加。两个无符号双字节数相加。设设被被加加数数存存放放于于
14、内内部部RAM的的40H(高高位位字字节节),41H(低低位位字字节节),加加数数存存放放于于50H(高高位位字字节节),51H(低位字节)低位字节),和数存入和数存入 40H和和41H单元中。单元中。12/20/2022第5章 汇编语言程序设计简介 程序如下程序如下:START:CLR C ;将将Cy清零清零 MOV R0,41H ;将被加数地址送数据指针将被加数地址送数据指针R0 MOV R1,51H ;将加数地址送数据指针将加数地址送数据指针R1 AD1:MOV A,R0 ;被加数低字节的内容送入被加数低字节的内容送入AADD A,R1 ;两个低字节相加两个低字节相加MOV R0,A ;
15、低字节的和存入被加数低字节中低字节的和存入被加数低字节中 DEC R0 ;指向被加数高位字节指向被加数高位字节 DEC R1 ;指向加数高位字节指向加数高位字节 MOV A,R0 ;被加数高位字节送入被加数高位字节送入AADDC A,R1 ;两个高位字节带两个高位字节带Cy相加相加 MOV R0,A ;高位字节的和送被加数高位字节高位字节的和送被加数高位字节 RET 12/20/2022第5章 汇编语言程序设计简介 例例2 三字节无符号数相加,被加数在内部三字节无符号数相加,被加数在内部RAM的的50H,51H,52H单元中,加数在内部单元中,加数在内部RAM的的53H,54H,55H单元中,
16、和存放在单元中,和存放在50H,51H 和和52H单元中,进位存放在位寻址区的单元中,进位存放在位寻址区的00H位中。位中。MOV R0,#52HMOV R1,#55HMOV A,R0ADD A,R1MOV R0,ADEC R0DEC R1MOV A,R0ADDC A,R1MOV R0,ADEC R0DEC R1MOV A,R0ADDC A,R1MOV R0,ACLR AADDC A,#00HMOV R0,#00HMOV R0,A12/20/2022第5章 汇编语言程序设计简介 例例 3 将两个半字节数合并成一个一字节数。将两个半字节数合并成一个一字节数。设内部设内部RAM 40H#,41H单
17、元中分别存放着单元中分别存放着 8 位二进制数位二进制数,要求取出两个单元中的低半字节要求取出两个单元中的低半字节,并并成一个字节后成一个字节后,存入存入 50H单元中。单元中。程序如下程序如下:START:MOV R1,40H ;设置设置R1为数据指针为数据指针 MOV A,R1 ;取出第一个单元中的内容取出第一个单元中的内容 ANL A,0FH ;取第一个数的低半字节取第一个数的低半字节 SWAP A ;移至高半字节移至高半字节 INC R1 ;修改数据指针修改数据指针 XCH A,R1 ;取第二个单元中的内容取第二个单元中的内容 ANL A,0FH ;取第二个数的低半字节取第二个数的低半
18、字节 ORL A,R1 ;拼字拼字 MOV 50H,A ;存放结果存放结果 RET 12/20/2022第5章 汇编语言程序设计简介 5.2.2 5.2.2 分支程序设计分支程序设计 (a)单分支流程单分支流程;(b)多分支流程多分支流程 12/20/2022第5章 汇编语言程序设计简介 例例 3 x,y均为均为8位二进制数位二进制数,设设 x存入存入R0,y存入存入R1,求解求解:MOV A,R0 JZ loop1 ;(A)=0时转移时转移 JB ACC.7,loop2 ;ACC.7=1转移转移 MOV R1,#1 loop1 :MOV R1,#0 SJMP ENDFloop2:MOV R1
19、,#0FFHENDF:RET 12/20/2022第5章 汇编语言程序设计简介 例例 4 比比较较两两个个无无符符号号数数的的大大小小。设设外外部部 RAM 的的存存储储单单元元 ST1和和ST2中中存存放放两两个个不不带带符符号号的的二二进进制制数数,找找出出其其中中的的大大数数存存入入外外部部 RAM 中中的的 ST3单单元中。元中。12/20/2022第5章 汇编语言程序设计简介 程序如下:程序如下:ORG 1000H ST1 EQU 2000H ST2 EQU 2100H ST3 EQU 2200H START:CLR C ;清零清零Cy MOV DPTR,ST1 ;第一个数的指针第一
20、个数的指针 MOVX A,DPTR ;取第一个数取第一个数 MOV R2,A ;保存保存 MOV DPTR,ST2 ;第二个数的指针第二个数的指针 MOVX A,DPTR ;取第二个数取第二个数 CLR C 12/20/2022第5章 汇编语言程序设计简介 SUBB A,R2 ;两数比较两数比较JNC BIG2 ;若若Cy=0,转移,转移 ;即无借位,;即无借位,(A)(R2),第,第2个数大个数大XCH A,R2 ;第一个数大第一个数大BIG1:MOV DPTR,ST3 MOVX DPTR,A ;存大数存大数RETBIG2:MOVX A,DPTR ;第二个数大第二个数大SJMP BIG1RE
21、T 12/20/2022第5章 汇编语言程序设计简介 散转程序设计散转程序设计 散散转转程程序序是是分分支支程程序序的的一一种种,它它可可根根据据运运算算结结果果或或输输入入数数据据将将程程序序转转入入不不同同的的分分支支。MCS-51 指指令令系系统统中中有有一一条条跳跳转转指指令令JMPA+DPTR,用用它它可可以以很很容容易易地地实实现现散散转转功功能能。该该指指令令把把累累加加器器的的 8 位位无无符符号号数数与与 16 位位数数据据指指针针的的内内容容相相加加,并并把把相相加加的的结结果果装装入入程程序序计计数数器器PC,控控制制程程序序转转向向目目标标地地址址去去执执行行。此此指指
22、令令的的特特点点在在于于,转转移移的的目目标标地地址址不不是是在在编编程程或或汇汇编编时时预预先先确确定定的的,而而是是在在程程序序运运行行过过程程中中动动态态地地确确定定的的。目目标标地地址址是是以以数数据据指指针针 DPTR的的内内容容为为起起始始的的 256 字字节节范范围围内内的的指指定定地地址址,即即由由 DPTR的的内内容容决决定定分分支支转转移移程程序序的的首首地地址址,由由累累加加器器 A的的内内容容来来动动态态选选择其中的某一个分支转移程序。择其中的某一个分支转移程序。12/20/2022第5章 汇编语言程序设计简介 例例 5 根根据据工工作作寄寄存存器器R0 内内容容的的不
23、不同同,使使程程序序转转入入相相应应的分支。的分支。(R0)=0 对应的分支程序标号为对应的分支程序标号为PR0;(R0)=1 对应的分支程序标号为对应的分支程序标号为PR1;(R0)=N 对应的分支程序标号为对应的分支程序标号为PRN。12/20/2022第5章 汇编语言程序设计简介 程序如下程序如下:LP0:MOV DPTR,TAB ;取表头地址取表头地址 MOV A,R0 ADD A,R0 ;R0内容乘以内容乘以2 JNC LP1 ;无进位转移无进位转移 INC DPH ;加进位位加进位位LP1:JMP A+DPTR;跳至散转表中相应位置跳至散转表中相应位置 TAB:AJMP PR0 A
24、JMP PR1 AJMP PRN 12/20/2022第5章 汇编语言程序设计简介 练习练习 把内部把内部RAM起始地址为起始地址为data的数据串传送的数据串传送到外部到外部RAM以以LOOP为首地址的区域,直到发为首地址的区域,直到发现现“”字符的字符的ASC码为止,同时规定数据码为止,同时规定数据串的最大长度为串的最大长度为32个字节。个字节。12/20/2022第5章 汇编语言程序设计简介 5.2.3 5.2.3 循环程序设计循环程序设计 一、一、循环程序循环程序 12/20/2022第5章 汇编语言程序设计简介 循环程序一般由四个主要部分组成循环程序一般由四个主要部分组成:(1)初初
25、始始化化部部分分:为为循循环环程程序序做做准准备备,如如规规定定循循环环次次数数、给各变量和地址指针预置初值。给各变量和地址指针预置初值。(2)处处理理部部分分:为为反反复复执执行行的的程程序序段段,是是循循环环程程序序的的实实体体,也是循环程序的主体。也是循环程序的主体。(3)循循环环控控制制部部分分:这这部部分分的的作作用用是是修修改改循循环环变变量量和和控控制制变变量量,并并判判断断循循环环是是否否结结束束,直直到到符符合合结结束束条条件件时时,跳跳出出循循环环为止。为止。(4)结束部分结束部分:这部分主要是对循环程序的结果进行分析、这部分主要是对循环程序的结果进行分析、处理和存放。处理
26、和存放。12/20/2022第5章 汇编语言程序设计简介 例例 5 工作单元清零。工作单元清零。在在应应用用系系统统程程序序设设计计时时,有有时时经经常常需需要要将将存存储储器器中中各各部部分分地地址址单单元元作作为为工工作作单单元元,存存放放程程序序执执行行的的中中间间值值或或执执行行结结果果,工作单元清零工作常常放在程序的初始化部分中。工作单元清零工作常常放在程序的初始化部分中。设有设有50个工作单元个工作单元,其首址为外部存储器其首址为外部存储器8000H单元单元,则则其工作单元清零程序如下其工作单元清零程序如下:12/20/2022第5章 汇编语言程序设计简介 CLEAR:CLR A
27、MOV DPTR,8000H ;工工作作单单元元首首址址送送指指针针 MOV R2,50;置循环次数置循环次数CLEAR1:MOVX DPTR,A INC DPTR ;修改指针修改指针 DJNZ R2,CLEAR1;控制循环控制循环 RET 12/20/2022第5章 汇编语言程序设计简介 例例 6 设设在在内内部部 RAM的的 m 单单元元开开始始处处有有长长度度为为 n 个个的的无无符符号号数数据据块块,试试编编一一个个求求和和程程序序,并并将将和和存存入入内内部部 RAM的的 S 单元(设和不超过单元(设和不超过 8 位)。位)。m EQU 20H n EQU 30H S EQU 40H
28、START:CLR A ;清累加器清累加器A MOV R2,n;数据块长度送数据块长度送R2 MOV R1,m ;数据块首址送数据块首址送R1 LOOP:ADD A,R1;循环加法循环加法 INC R1;修改地址指针修改地址指针 DJNZ R2,LOOP ;修改计数器并判断修改计数器并判断 MOV S,A;存和存和 RET 12/20/2022第5章 汇编语言程序设计简介 多重循环多重循环 例例 7 10 秒延时程序。秒延时程序。延延时时程程序序与与 MCS-51 执执行行指指令令的的时时间间有有关关,如如果果使使用用 6 MHz晶晶振振,一一个个机机器器周周期期为为 2 s,计计算算出出一一
29、条条指指令令以以至至一一个个循循环环所所需需要要的的执执行行时时间间,给给出出相相应应的的循循环环次次数数,便便能能达达到到延延时时的的目的。目的。10 秒延时程序如下秒延时程序如下:MOV R5,100 D0:MOV R6,200 D1:MOV R7,248 D2:DJNZ R7,D2 DJNZ R6,D1 DJNZ R5,D0 RET 12/20/2022第5章 汇编语言程序设计简介 上上例例程程序序中中采采用用了了多多重重循循环环程程序序,即即在在一一个个循循环环体体中中又又包包含含了了其其它它的的循循环环程程序序,这这种种方方式式是是实实现现延延时时程程序序的的常常用用方方法法。使用多
30、重循环时使用多重循环时,必须注意必须注意:(1)循循环环嵌嵌套套,必必须须层层次次分分明明,不不允允许许产产生生内内外外层层循循环环交交叉。叉。(2)外外循循环环可可以以一一层层层层向向内内循循环环进进入入,结结束束时时由由里里往往外外一一层层退出。层层退出。(3)内内循循环环可可以以直直接接转转入入外外循循环环,实实现现一一个个循循环环由由多多个个条条件控制的循环结构件控制的循环结构方式。方式。12/20/2022第5章 汇编语言程序设计简介 例例8 在在内内部部 RAM中中从从 50H单单元元开开始始的的连连续续单单元元依依次次存存放放了了一一串串字字符符,该该字字符符串串以以回回车车符符
31、为为结结束束标标志志,要求测试该字符串的长度。要求测试该字符串的长度。程序如下程序如下:START:MOV R2,0FFH MOV R0,4FH ;数据指针数据指针R0置初值置初值 LOOP:INC R0 INC R2 CJNE R0,0DH,LOOP RET 12/20/2022第5章 汇编语言程序设计简介 5.2.4 5.2.4 子程序和参数传递子程序和参数传递 一、一、子程序的概念子程序的概念 通通常常把把这这些些基基本本操操作作功功能能编编制制为为程程序序段段作作为为独独立立的的子子程程序序,以以供供不不同同程程序序或或同同一一程程序序反反复复调调用用。在在程程序序中中需需要要执执行行
32、这这种种操操作作的的地地方方放放置置一一条条调调用用指指令令,当当程程序序执执行行到到调调用用指指令令,就就转转到到子子程程序序中中完完成成规规定定的的操作操作,并返回到原来的程序继并返回到原来的程序继 续执行下去。续执行下去。12/20/2022第5章 汇编语言程序设计简介 二、二、子程序的调用子程序的调用 调调用用子子程程序序的的指指令令有有“ACALL”和和“LCALL”,执执行行调调用用指指令令时时,先先将将程程序序地地址址指指针针PC改改变变(“ACALL”加加 2,“LCALL”加加 3),然然后后 PC值值压压入入堆堆栈栈,用用新新的的地地址址值值代代替替。执行返回指令时执行返回
33、指令时,再将再将 PC值弹出。值弹出。子子程程序序调调用用中中,主主程程序序应应先先把把有有关关的的参参数数存存入入约约定定的的位位置置,子子程程序序在在执执行行时时,可可以以从从约约定定的的位位置置取取得得参参数数,当当子子程程序序执执行行完完,将将得得到到的的结结果果再再存存入入约约定定的的位位置置,返返回回主主程程序序后后,主主程程序序可可以以从从这这些些约约定定的的位位置置上上取取得得需需要要的的结结果果,这这就就是是参参数数的传递。的传递。12/20/2022第5章 汇编语言程序设计简介 例例 9 在在外外部部 RAM中中,BLOCK开开始始的的单单元元中中有有一一无无符符号号数数据
34、据块块,其其个个数数为为 LEN个个字字节节。试试将将这这些无符号数按递减次序重新排列些无符号数按递减次序重新排列,并存入原存储区。并存入原存储区。ORG 1000H START:MOV DPTR,BLOCK;置地址指针置地址指针 MOV P2,DPH ;P2作地址指针高字节作地址指针高字节 MOV R7,LEN ;置外循环计数初值置外循环计数初值 DEC R7 ;比较与交换比较与交换 n-1次次 12/20/2022第5章 汇编语言程序设计简介 LOOP0:CLR F0 ;交换标志清交换标志清 0 MOV R0,DPL;MOV R1,DPL;置相邻两数地址指针低字节置相邻两数地址指针低字节
35、INC R1 MOV R6,R7 ;置内循环计数器初值置内循环计数器初值 LOOP1:MOVX A,R0;取数取数 MOV B,A ;暂存暂存 MOVX A,R1 ;取下一个数取下一个数 CJNE A,B,NEXT;相邻两数比较相邻两数比较,不等转不等转 SJMP NOCHA ;相等不交换相等不交换 12/20/2022第5章 汇编语言程序设计简介 NEXT:JC NOCHA;Cy=1,则前者大于后者则前者大于后者,不必交换不必交换 SETB F0;否则否则,置交换标志置交换标志 MOVX R0,A;XCH A,B;两数交换两数交换,大者在前大者在前,小者在后小者在后 MOVX R1,A ;N
36、OCHA:INC R0 INC R1;修改指针修改指针 DJNZ R6,LOOP1 ;内循环未完内循环未完,则继续则继续 JNB F0,EXIT ;若从未交换若从未交换,则结束则结束 DJNZ R7,LOOP0;外循环未完外循环未完,则继续则继续 EXIT:RET 12/20/2022第5章 汇编语言程序设计简介 图 4.512/20/2022第5章 汇编语言程序设计简介 例例12 把把内内部部RAM某某一一单单元元中中一一个个字字节节的的十十六六进进制制数数转转换换成成两位两位ASCII码码,结果存放在内部结果存放在内部RAM的连续两个单元中。的连续两个单元中。假假设设一一个个字字节节的的十
37、十六六进进制制数数在在内内部部 RAM 40H单单元元,而而结结果存入果存入 50H,51H单元单元,可以用堆栈进行参数传递可以用堆栈进行参数传递,程序如下程序如下:MAIN:MOV R1,50H ;R1 为存结果的指针为存结果的指针 MOV A,40H ;A为需转换的十六进制数为需转换的十六进制数 SWAP A ;先转换高位半字先转换高位半字 PUSH ACC ;压栈压栈 LCALL HEASC ;调用将低半字节的内容转换调用将低半字节的内容转换;成成ASCII码子程序码子程序HEASC POP ACC MOV R1,A ;存高半字节转换结果存高半字节转换结果 INC R1 PUSH 40H
38、 12/20/2022第5章 汇编语言程序设计简介 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,12/20/2022第5章 汇编语言程序设计简介 例例 9 设设某某系系统统的的模模数数转转换换器器是是ADC0809,它它的的转转换换结结束束信信号号 EOC连连接接到到8031 的的P1.7端端,当当 EOC的的状状态态由由低低变变高时高时,则结束循环等待则结束循环等待,并读取转换值并读取转换值,其程序如下其程序如下:START:MOV DPTR,addr ;0809端口地址送端口地址送DPTR MOV A,00H ;启动启动0809转换转换 MOVX DPTR,A LOOP:JNB P1.7,LOOP;检检测测P1.7状状态态,判判是是否否转转换换结结束束 MOVX A,DPTR;读取转换结果读取转换结果12/20/2022第5章 汇编语言程序设计简介