《第三章大学生复习资料ppt课件》由会员分享,可在线阅读,更多相关《第三章大学生复习资料ppt课件(47页珍藏版)》请在金锄头文库上搜索。
1、伪指令伪指令 汇编语言程序设计汇编语言程序设计MCS-51程序设计举例程序设计举例一 汇编程序的伪指令 (真真)指令指令:告诉告诉计算机计算机如何操作以及做何种操作如何操作以及做何种操作伪指令:伪指令:伪指令不进行具体的操作,伪指令不进行具体的操作,亦即它不像亦即它不像机器指令那样是在程序运行期间由计算机来执行机器指令那样是在程序运行期间由计算机来执行的,而是在汇编程序对源程序汇编期间由汇编程的,而是在汇编程序对源程序汇编期间由汇编程序处理的操作。序处理的操作。伪指令仅在汇编过程中起控制作用不产生伪指令仅在汇编过程中起控制作用不产生可执行可执行目标代码,又称为软指令目标代码,又称为软指令 1、
2、起点指令、起点指令 ORG格式:格式:ORG H功能:功能:给给程序程序起始地址起始地址或数据块的或数据块的起始地址起始地址赋值赋值例:例:用法:用法:一般出现在每段源程序或数据块的开始一般出现在每段源程序或数据块的开始一个源程序可多次出现一个源程序可多次出现ORG指令指令ORG 8000HSTART:MOV A,#74H ;源程序的起始地址源程序的起始地址为为8000H首地址首地址首地址首地址ASM51程序中一定要写!程序中一定要写!2、结束命令、结束命令 END格式:格式:END功能:汇编程序结束标志功能:汇编程序结束标志附在一个源程序的结尾附在一个源程序的结尾 一个源程序只能出现一次一个
3、源程序只能出现一次END指令指令3、定义字节命令、定义字节命令 DB格式:格式:功能:功能:标号:标号:DB 字节常数或字符串字节常数或字符串 (8 8位位)从指定的地址单元开始,定义若干个从指定的地址单元开始,定义若干个8位位内存单元的数据。汇编程序把内存单元的数据。汇编程序把DB定义的定义的字节数据依次存入字节数据依次存入标号开始标号开始的存储单元的存储单元用法:用法:有定义的内存单元有定义的内存单元地址地址项或项表项或项表ASM51程序中一定要写!程序中一定要写!例:例:ORG 8000HTAB: DB 45H,73,5,ATAB1:DB 101B伪指令伪指令ORG 定义了定义了TAB的
4、起始地址为的起始地址为8000H,伪指令伪指令DB定义了定义了8000H8003单元的内容依次为:单元的内容依次为:(8000H)= 45H(8001H)= 49H(8002H)= 35H(8003H)= 41H(8004H)= 05HTABTAB1(1) 由由 ORG定义定义(2) 跟在其他源程序之后跟在其他源程序之后4、定义字命令、定义字命令DW格式:格式:功能:功能:标号:标号:DW 字或字表字或字表从指定的地址单元开始,定义若干个从指定的地址单元开始,定义若干个16位位内存单元的数据。内存单元的数据。例:例:ORG 8000HTAB:DW 7234H,8AH,10(8000H)= 72
5、H(8001H)= 34H(8002H)= 00H(8003H)= 8AH(8005H)= 0AH汇编后:汇编后:(8004H)= 00H注意:因为注意:因为16位需占位需占用用2个字节,所以高个字节,所以高8位先存入,低位先存入,低8位后存位后存入,不足入,不足16位,以位,以0填填充。充。5、定义空间命令、定义空间命令 DS格式:格式:功能:功能:标号:标号:DS 数据或字符数据或字符及及表达式表达式例:例:(8008H)=30H(8009H)=8AH从指定单元地址开始,保留若干个内存从指定单元地址开始,保留若干个内存空间备用空间备用ORG 8000HDS 08HDB 30H,8AH即:即
6、:8000H8007H单元保留备用单元保留备用定义空定义空间间6、等值命令、等值命令 EQU格式:格式:字符名称字符名称 EQU 数据或汇编符号数据或汇编符号功能:功能:将将一个数据或汇编符号赋予一个指定的一个数据或汇编符号赋予一个指定的字符名称字符名称例:例:ORG 8000H AA EQU R6MOV A,AA;AA与与R6等值等值;A (R6)例例: : A10 EQU 10DELY EQU 07EBH MOV A,A10 LCALL DELY;A10 = 10;DELY = 07EBH;转向入口地址转向入口地址 07EBH使用使用EQU指令,须先赋值后使用,不能反之指令,须先赋值后使用
7、,不能反之7、数据地址赋值等值命令、数据地址赋值等值命令 DATA格式:格式:字符名称字符名称 DATA 数据或表达式数据或表达式功能:功能:此命令把数据此命令把数据/ /代码地址赋予规定的字符名称。代码地址赋予规定的字符名称。定义的字符名称可先使用后定义定义的字符名称可先使用后定义INDEXJ DATA 8389HORG 8000HINDEXJ DATA 8096H LJMP INDEXJENDORG 8000H LJMP 8096HEND;INDEXJ这个字符名称的地址为这个字符名称的地址为8389H例:例:等等价价于于 EQU与与 DATA的区别的区别(1) DATA与与EQU相似,但相
8、似,但DATA定义的字符名称定义的字符名称, 可先使用后定义可先使用后定义 ,EQU则不能则不能(2) EQU指令可把汇编符号赋给字符名称,指令可把汇编符号赋给字符名称, DATA则不能则不能 (3) DATA可把表达式的值赋给字符名称,可把表达式的值赋给字符名称, EQU则不能则不能 DATA常在程序中定义数据地址常在程序中定义数据地址EQU常在程序中定义字符数据常在程序中定义字符数据 8、位地址符号命令、位地址符号命令 BIT格式:格式:字符名称字符名称 BIT 位地址位地址功能:功能:把位地址赋予指定的字符名称把位地址赋予指定的字符名称 A1 BIT P1.0A2 BIT P2.0例:例
9、:;P1.0, P2.0赋予位地址字符名称赋予位地址字符名称 A1、A2,在编程时可以直接把在编程时可以直接把 A1、A2 当成位地址使用当成位地址使用9、#HIGH(常数或数据表达式)(常数或数据表达式) #LOW(常数或数据表达式)(常数或数据表达式) 功能:功能:#HIGH伪指令用于取目标代码的高字节,而伪指令用于取目标代码的高字节,而#LOW伪指令用于取目标代码的低字节。在给定伪指令用于取目标代码的低字节。在给定时时/计数器赋初值时,该伪指令经常使用。计数器赋初值时,该伪指令经常使用。 例如:MOV TH0, #HIGH(5000) MOV TL0, #LOW(5000) 第一条指令将
10、数据5000(16进制为1388H)的高字节取出并送入TH0中,第二条指令将数据5000的低字节取出并送入TL0中 程序段执行后,(TH0)= 13H,(TL0)= 88H。二二 汇编语言程序设计汇编语言程序设计一、汇编语言程序设计的一般步骤一、汇编语言程序设计的一般步骤 分析课题分析课题 确定算法确定算法 画流程图画流程图 编写程序编写程序 上机调试上机调试二、程序结构二、程序结构 按程序的走向可以将程序分成按程序的走向可以将程序分成4种结构:种结构: 简单程序简单程序 分支程序分支程序 循环程序循环程序 子程序子程序一、汇编语言程序设计的一般步骤一、汇编语言程序设计的一般步骤 分析课题分析
11、课题 确定算法确定算法 画流程图画流程图 编写程序编写程序 上机调试上机调试二、程序结构二、程序结构当接到程序设计的任务后,首先对任务进行详尽的分析,搞清楚已知的数据和想要得到的结果,程序应该完成何种的功能。一、汇编语言程序设计的一般步骤一、汇编语言程序设计的一般步骤 分析课题分析课题 确定算法确定算法 画流程图画流程图 编写程序编写程序 上机调试上机调试二、程序结构二、程序结构 根据实际问题的要求和指令系统的特点,确定解决问题的具体步骤。根据任务要求,对不同的计算方法进行比较,选择最适宜的算法。 一、汇编语言程序设计的一般步骤一、汇编语言程序设计的一般步骤 分析课题分析课题 确定算法确定算法
12、 画流程图画流程图 编写程序编写程序 上机调试上机调试二、程序结构二、程序结构将解决问题的具体步骤用一种约定的几何图形、指向线和必要的文字说明描述出来的图形。一、汇编语言程序设计的一般步骤一、汇编语言程序设计的一般步骤 分析课题分析课题 确定算法确定算法 画流程图画流程图 编写程序编写程序 上机调试上机调试二、程序结构二、程序结构 经过上述各步骤后,解决问题的思路已经非常清楚,所以接下来就可以按流程图的顺序对每一个功能框选用合适的指令编写出汇编语言程序。 一、汇编语言程序设计的一般步骤一、汇编语言程序设计的一般步骤 分析课题分析课题 确定算法确定算法 画流程图画流程图 编写程序编写程序 上机调
13、试上机调试二、程序结构二、程序结构在应用程序的设计中,几乎没有一个程序只经过一次编写就完全成功的,所以必须经过上机调试。 一、汇编语言程序设计的一般步骤一、汇编语言程序设计的一般步骤 分析课题分析课题 确定算法确定算法 画流程图画流程图 编写程序编写程序 上机调试上机调试二、程序结构二、程序结构 按程序的走向可以将程序分成按程序的走向可以将程序分成4种结构:种结构: 简单程序简单程序 分支程序分支程序 循环程序循环程序 子程序子程序简单程序简单程序 简单程序是指一种无分支的直接程序,即CPU从第一条指令开始依次依次执行每一条指令,直到最后一条指令。 这种程序虽然比较简单,但也能完成一定的功能,
14、并且往往也是构成复杂程序的基础。拆字程序 拼字程序 求和程序 拆字程序拆字程序 例:例:将30H单元中存放的一个两位的BCD拆开并存入31H单 元和32H单元,高字节存入32H单元。 解解 : 分析命题分析命题确定算法确定算法画流程图画流程图编写程序编写程序上机调试上机调试32H31H30H89H09H08H分别屏蔽高4位与低4位,再将高4位交换MOV A,30H ANL A,#0F0HSWAP AMOV 32H,AMOV 31H,30HANL 31H,#0FHSJMP $开始将30H单元的内容送A将A中高、低4位交换将A中内容存入32H单元屏蔽30H单元内容的高4位屏蔽A中内容的低4位将30
15、H单元内容存入31H单元结束拼字程序拼字程序 例:例:将30H和31H单元中存放的2个一字节BCD码组合成一个2位的BCD码存入32H单元,31H单元中的数为低4位。 解解 : 分析命题分析命题确定算法确定算法画流程图画流程图编写程序编写程序上机调试上机调试32H31H30H04H07H47H将30H单元的高4与低4交换,再与31H单元相或 MOV A,30HSWAP AORL A,31HMOV 32H,ASJMP $开始将30H单元的内容送A将A中高、低4位交换将A中内容与31H单元内容相或将A中内容存入32H单元结束MOV A,30HADD A,32HMOV 40H,AMOV A,31HA
16、DDC A,33HMOV 41H,AMOV A,#00HADDC A,#0MOV 42H,ASJMP $求和程序求和程序 例:例:设2个16位二进制数存于以30H为首址的连续单元中,求二者的和,并将和存于以40H为首址的区域。(低字节在前) 解解 : 分析命题分析命题确定算法确定算法画流程图画流程图编写程序编写程序上机调试上机调试(30H)+(32H)送40H单元;(31H)+(33H)+Cy送41H单元; Cy+0送42H单元开始(30H)+(32H)送40H单元 (31H)+(33H)+Cy送41H单元Cy+0送42H单元结束分支程序分支程序 分支程序就是条件分支程序,即根据不同的条件,执
17、行不同的程序段。在编写分支程序时,关键是如何判断分支的条件。在MCS-51中可以直接用来判断分支条件的指令不是很多,只有累加器为零(或不为零)、比较条件转移指令CJNE等,但它还提供位条件转移指令,如JC,JB等。把这些指令结合在一起使用,就可以完成各种各样的条件判断,如正负判断、溢出判断、大小判断等。分段函数 符号函数 比较大小 例:例:设变量X存放于30H单元,函数值Y存放在31H单元。试按照下式的要求给Y赋值。 解解 : Y= 分析命题分析命题确定算法确定算法画流程图画流程图编写程序编写程序上机调试上机调试开始将30H单元的内容送A结束符号函数符号函数A=0?将0送31H单元A 0?将1
18、送31H单元将-1送31H单元VARDATA30HFUNCDATA31H MOV A,VAR JZ COMP JNB ACC.7,POSI MOV A,#0FFH SJMP COMPPOSI: MOV A,#1COMP: MOV FUNC,A SJMP $YNYN例:例:两个无符号数分别存于ONE和TWO单元,试比较它们的大小,将较大者存人MAX单元。若两数相等则任存入一个即可。 解解 :分析命题分析命题确定算法确定算法画流程图画流程图编写程序编写程序上机调试上机调试开始将ONE单元的内容送A结束比较大小比较大小A TWO将TWO单元内容送MAX单元MOV A,ONECJNEA, TWO,NE
19、XT1NEXT1: JC NEXT2 MOV MAX,ONESJMP $NEXT2: MOV MAX,TWO SJMP $YN将ONE单元内容送MAX单元循环程序循环程序 一、循环程序的应用场合一、循环程序的应用场合二、循环程序的组成二、循环程序的组成三、循环程序举例三、循环程序举例字符串长度 数组清0 循环程序循环程序 一、循环程序的应用场合一、循环程序的应用场合分段函数 符号函数 比较大小 在程序执行时,往往同样的一组操作要重复许多次。当然可以采用简单程序,重复使用同样的指令来完成,但若使用循环程序,重复执行同一条指令许多次来完成重复操作,就可大大减化程序。例如:例如:要使00H7FH单元
20、的内容清0。方法1:用128条赋值指令完成。方法2:只用一条赋值指令,并使之执行128次,每每次次执执行行时时操操作作数数亦亦作作相应的变化相应的变化以完成规定的操作。方法1:MOV 00H,#0 MOV 01H,#0 MOV 7FH,#0方法2: MOV R0,#128 CLR AUP:MOV R0,A DEC R0 CJNE R0,#00H,UP SJMP $循环程序循环程序 一、循环程序的应用场合一、循环程序的应用场合二、循环程序的组成二、循环程序的组成循环程序一般由四部分组成: 置循环初值置循环初值 循环体循环体 循环修改部分循环修改部分 循环控制部分循环控制部分确定循环开始时的状态,
21、如使得工作单元清0,计数器置初值等 。要求重复执行的部分 。每循环一次就要需要修改一次初值,以便在一定情况下,能结束循环。 根据循环结束条件,判断是否结束循环 流流 程程 图图循环程序循环程序 先处理后判断 先判断后处理例:使00H-7FH单元清0。 数组清数组清0分析命题分析命题确定算法确定算法画流程图画流程图编写程序编写程序上机调试上机调试7FH00H00H00H00H用MOV R0,A 做循环主体,修改R0的值,可以将0送入00H7FH单元中。 MOV R0,#128 CLR AUP:MOV R0,A DEC R0 CJNE R0,#00H,UP SJMP $开始给R0赋128、A清0A
22、送R0R0减1结束R0=00H?YN例:内存中以21H开始的区域有若干个字符和数字,一般称为一个字符串,最末一个字符为$,试统计这些字符数字的数目,结果存人20H单元 字符串长度字符串长度分析命题分析命题确定算法确定算法画流程图画流程图编写程序编写程序上机调试上机调试NUM DATA 20HSTRING DATA 21H CLRA MOV R0,#STRINGLOOP: CJNE R0,#24H,NEXT SJMP COMP NEXT: INC AINC R0 SJMP LOOPCOMP: INC A MOV NUM,A SJMP $开始给R0赋21H、A清0A加1,并送20H单元A加1R0加
23、1结束 R0=24H?YN【例4-6】设例4-4中,8位无符号数的个数n未知,数据存放的单元首址为30H,数据结束标志为十六进制数0FFH(有效数据中不含0FFH),求这n个8位无符号数之和,并将和存放在2DH和2EH单元,高字节在前。算法:此例属于单循环且循环次数未知的情况。初始化部分清零累加和单元;循环控制方式应为先判断后执行,即应先判断某单元数据是否为结束标志,不是则将该数据加入累加和,否则结束循环;循环体内用ADDC指令实现累加和与各无符号单字节数的加法运算。循环控制可CJNE指令实现。汇编程序C语言程序 ORG 0000HSTART:CLR C ; 清进位位 MOV 2DH, #00
24、H ; 清零累加和 MOV 2EH, #00H MOV R0, #30H ; 取数据首址LOOP: MOV A, R0;取无符号数据 CJNE A, #0FFH, SUM;不是结束标志,转加法程序 SJMP $SUM: ADD A, 2EH; 加到累加和低字节MOV 2EH, ACLR AADDC A, 2DH; 和高字节加进位位MOV 2DH, AINC R0SJMP LOOPEND#include unsigned int sum _at_ 0x2d; void main() unsigned char *addr;addr = 0x30; sum = 0; while(*addr !=
25、0xff)sum += *addr;addr +; while(1); 查表程序设计查表程序设计 【例4-7】设有一个MCS-51单片机控制系统,共10个按键,有键按下时键盘扫描程序将其键值(09)放在片内RAM 30H单元,编程将其转换成7段显示码(共阴),放到片内RAM 31H单元。汇编程序C语言程序 ORG 0000HSTART:MOV DPTR, #TAB ; DPTR指向表首址 MOV A, 30H ;取数据MOVC A, A+DPTR ;查(A)的7段码MOV 31H, A ;存7段码SJMP $TAB: DB 3fH, 06H, 5bH, 4fH, 66H ;码表DB 6dH,
26、7dH, 07H, 7fH, 6fHEND#include #define uchar unsigned charuchar addr _at_ 0x30;uchar seg _at_ 0x31;uchar code tab=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; void main()seg = tabaddr; while(1); 子程序子程序 主程序与子程序的关系:主程序与子程序的关系:(1)在进行子程序设计时,子程序的第一条指)在进行子程序设计时,子程序的第一条指令前应有代表子程序功能的标号,以便主令前应有代表子程序功能的标
27、号,以便主程序调用。程序调用。(2)子程序的末尾应有一条返回指令)子程序的末尾应有一条返回指令RET,以,以使子程序执行完后返回主程序。使子程序执行完后返回主程序。(3)主程序调用子程序处应有一条调用指令)主程序调用子程序处应有一条调用指令LCALL(或(或ACALL),进入并执行子程),进入并执行子程序。序。(4)在调用子程序前应根据需要保护现场。)在调用子程序前应根据需要保护现场。子程序子程序 例:每1秒使A中的内容左移一位。主程序: MOV A,#01HUP:RL A ACALL D1ms SJMP UP子程序:D1ms : MOV R7,#10D1ms2:MOV R6, #200D1m
28、s1:MOV R5, #250 DJNZ R5, $ DJNZ R6, D1ms1 DJNZ R7,D1ms2 RET ORG 2000HORG 2000HBCDBCD2 2B B:MOV AMOV A, R2R2 ; ;取入口数据取入口数据 ANL AANL A, # #0 0F0H F0H ; ;取出十位取出十位 SWAP A SWAP A ; ;高高4 4位位 低低4 4位位 MOV BMOV B, #0AH#0AH MUL AB MUL AB ; ;十位乘十位乘1010 MOV R3 MOV R3,A A ; ;积积暂存暂存进进R3R3 MOV A MOV A, R2;R2;再取入口数
29、据再取入口数据 ANL AANL A, #0FH #0FH ; ;取出个位取出个位 ADD AADD A, R3R3 MOV MOV R2R2,A A ; ;结果结果 R2R2 RET RET ; ;若若不是子程序可用不是子程序可用END END 例:例:将将R2R2中中BCDBCD码数转为码数转为二进二进制制数存进数存进R2R2(此子程序在此子程序在下一例中还要下一例中还要用到)用到)三三 设计实例设计实例编程要点:编程要点: 两字节两字节 BCDBCD码数范围为:码数范围为: 00000000H H99999999H H 相应相应2 2进制进制/16/16进制数为:进制数为: 000000
30、00H H270F270FH H 调用调用 BCDBCD2 2B B子程序子程序实现实现“千位,百位千位,百位”转为二进转为二进制制, , 并乘并乘100;100; 再调再调 BCDBCD2 2B B子程序子程序实现实现“十位,个位十位,个位”转为二进转为二进制制; ; 最后,对位相加。最后,对位相加。例:例:将将R5R4R5R4中的中的双字节双字节BCDBCD码码数转为数转为二进制二进制数存于数存于R5R4R5R4中中。X 100X 100千千 百百十十 个个二进制二进制+ +CyCy+ +(R5)(R4)(R5)(R4)(R6)(A)(R5)(A)二进制二进制二进制二进制二进制二进制二进制
31、二进制二进制二进制调调 BCD2B调调 BCD2B简简单单测测控控实实例例原原理理图图任务一:任务一:控制一盏灯点亮控制一盏灯点亮 任务二:任务二:红灯周期性亮红灯周期性亮/ /灭灭 任务三:任务三:红外防盗报警红外防盗报警 0RG 0000H0RG 0000H AJMP AJMP MAINMAIN ORG 0003H ORG 0003H RL ARL A ACALL DELAY ACALL DELAY RETI RETIMAINMAIN:MOV AMOV A,#80H#80H SETB EX0 SETB EX0 SETB EA SETB EAWAIT:JB ACC.0,WAIT:JB ACC
32、.0,JOB1JOB1 JB ACC.1, JB ACC.1,JOB2JOB2 JB ACC.2, JB ACC.2,JOB3JOB3 AJMP WAIT AJMP WAITJOB1JOB1: : CLR P1.0 CLR P1.0 ; ;亮红灯亮红灯HERE: AJMP HEREHERE: AJMP HEREJOB2JOB2: CPL P1.0 : CPL P1.0 ; ;亮亮/ /灭灭 ACALL DELAY ACALL DELAY ; ;延时延时1 1秒秒 AJMP JOB2 AJMP JOB2 ; ;重复重复JOB3JOB3: CLR P1.1 : CLR P1.1 ; ;亮绿灯亮绿灯
33、REDO: SETB P1.3 REDO: SETB P1.3 CHECK:JNB P1.3,CHECK CHECK:JNB P1.3,CHECK LOOP: LOOP: ; ;报警!报警! AJMP REDO AJMP REDO ; ;再再检测检测 ORG 1000H ORG 1000HDELAYDELAY:MOV R6MOV R6,#200 #200 ; 1Tm; 1TmLOOP1:MOV R7LOOP1:MOV R7,#248 ; #248 ; 1Tm1Tm NOP ; NOP ; 1Tm1TmLOOP2:DJNZ R7LOOP2:DJNZ R7,LOOP2 ; LOOP2 ; 2Tm2
34、Tm DJNZ R6 DJNZ R6,LOOP1 ; LOOP1 ; 2Tm2Tm RET RET ; 1Tm; 1Tm例例P:P:软件循环延时软件循环延时100mS(100mS(晶振晶振12MHz)12MHz) 1Tm =1uS 100mS = 100000 1Tm =1uS 100mS = 100000 uSuS MOV MOV RnRn #data #data 和和 NOP NOP 是是单机器周期单机器周期指令指令 DJNZ DJNZ RnRn,relrel 是是双机器周期双机器周期指令指令 200200 = 0C8H ; 248 = 0F8H= 0C8H ; 248 = 0F8H1+1
35、+ 1+1+ 248x248x2 2 =498=498(498+2)(498+2)x200x200 ORG 1000H ORG 1000HDL1SDL1S:MOV R7MOV R7,#10#10DL1DL1: MOV R6: MOV R6,#200#200DL2: DL2: MOV R5, #250MOV R5, #250 DL3: DL3: DJNZ R5, DL3DJNZ R5, DL3 DJNZ R6DJNZ R6,DL2DL2 DJNZ R7DJNZ R7,DL1DL1 RET RET例例: :软件循环延时软件循环延时1S1S( (晶振晶振12MHz)12MHz) 1Tm =1uS 1
36、S = 1000000 1Tm =1uS 1S = 1000000 uSuS MOV MOV RnRn #data #data 是是单机器周期单机器周期指令指令 DJNZ DJNZ RnRn,relrel 是是双机器周期双机器周期指令指令1+ 1+ 250x2250x21+ 1+ (1+250x2) (1+250x2) +2)x200+2)x2001+ 1+ (1+250x2+2) (1+250x2+2) x200x200+2x10+2x10 ORG 2000HORG 2000HH H2 2ASC: MOV A,ASC: MOV A,R2R2 ; ;取待转换的数据取待转换的数据( (入口入口)
37、 ) ADD A,#0F6H ADD A,#0F6H ; ;判此数是否判此数是否10 10 ? 若若10,10,则则C=1C=1;10,10,则则C=0C=0 MOV A, MOV A,R2 R2 ; ;重取待转换的数据重取待转换的数据 JNC AD30H JNC AD30H ; ;小于小于1010就跳去加就跳去加30H30H ADD A,#07H ADD A,#07H ;10;10就先加就先加7 7 再去加再去加30H30H AD30H: ADD A,#30H AD30H: ADD A,#30H MOV MOV R2R2,A ,A ; ;存存结果结果( (出口出口) ) RET RET例例1
38、:1:1616进制数进制数(00H0FH)(00H0FH)转转ASCIIASCII码码子程序子程序算法:算法:凡凡1010的十六进制数加的十六进制数加37H37H;凡凡1010的的 十六进制数加十六进制数加 30H30H。ieie. . 0 09 9 30H 30H39H, 39H, A AF F 41H 41H46H 46H TABL: TABL: DWDW 050FH,0E89H, 050FH,0E89H,0 0A695H,1EAAH,0D9BH,7F93H A695H,1EAAH,0D9BH,7F93H DWDW 0373H,26D7H, 2710H,9E3FH,1A66H,22E3H
39、0373H,26D7H, 2710H,9E3FH,1A66H,22E3H DWDW 1174H,16EFH, 33E4H,6CA0H 1174H,16EFH, 33E4H,6CA0H例例6 6:根据根据16个双字节个双字节数的数的序号查表序号查表找出对应数据找出对应数据表表地址地址#TABL#TABL#TABL+1#TABL+1#TABL+2#TABL+2#TABL+3#TABL+3#TABL+30#TABL+30#TABL+31#TABL+31数据数据Y YY0Y0高高Y0Y0低低Y1Y1高高Y1Y1低低Y15Y15高高Y15Y15低低序号序号X X00H00H01H01H0FH0FH编程思
40、路:编程思路:以表格以表格首地址首地址(TABL)为基址为基址,以序号以序号(的的2倍倍)为偏移量为偏移量,查找对应的数据,查找对应的数据 ORG 2000H ORG 2000H STA1: MOV A,R2 ;STA1: MOV A,R2 ;取待查数据的序号取待查数据的序号 X (X (入口入口) ) RL ARL A ; ;每数占每数占2 2个单元,序号要乘个单元,序号要乘2 2 MOV R4 MOV R4,A A ;R4 ;R4 序号序号 x2 (x2 (即即偏移量偏移量) ) MOV DPTR,#TABLMOV DPTR,#TABL ; ;DPTR DPTR 表格首地址表格首地址 MO
41、VC A,MOVC A,A A+DPTR+DPTR ;(A) ;(A) 查到数据高查到数据高8 8位位 XCH AXCH A,R4 ;R4 ;数据高数据高8 8位存进位存进R4(R4(出口出口) ) ; ;同时取出同时取出偏移量偏移量到到A INC DPTRINC DPTR ;DPTR ;DPTR指向下一个单元指向下一个单元 MOVC A,MOVC A,A A+DPTR+DPTR ; ;再查到数据低再查到数据低8 8位位 MOV R3,A ;MOV R3,A ;将数据低将数据低8 8位存进位存进R3(R3(出口出口) ) RET RETTABL:TABL: DW ;DW ;表格数据见前页表格数据见前页 ENDEND