第五章 汇编语言程序设计C_第1页
第五章 汇编语言程序设计C_第2页
第五章 汇编语言程序设计C_第3页
第五章 汇编语言程序设计C_第4页
第五章 汇编语言程序设计C_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2 占用内存单元和占用内存单元和CPUCPU少少程序简短,执行速度快程序简短,执行速度快直接调用计算机全部资源,有效利用计算机的专有特性直接调用计算机全部资源,有效利用计算机的专有特性准确掌握指令的执行时间,适用于实时控制系统准确掌握指令的执行时间,适用于实时控制系统3一一. .分析问题,建立数学模型。分析问题,建立数学模型。二二. .确定算法。确定算法。三三. .制定程序流程图(程序结构和程序功能)。制定程序流程图(程序结构和程序功能)。 四四. .编制源程序:编制源程序: 1. 1.合理分配存储器单元和合理分配存储器单元和I/OI/O接口的地址;接口的地址; 2. 2.按功能设计程序,明确

2、按功能设计程序,明确各程序之间的相互关系;各程序之间的相互关系; 3. 3.用注释行说明程序,便用注释行说明程序,便于阅读、修改和调试。于阅读、修改和调试。开始开始结束结束 YN? 五五. .程序调试。程序调试。4 (1)程序的执行时间。程序的执行时间。 (2)程序所占用存储器的字节数。程序所占用存储器的字节数。 (3)程序的逻辑性、可读性。程序的逻辑性、可读性。 (4)程序的兼容性、可扩展性。程序的兼容性、可扩展性。 (5)程序的可靠性。程序的可靠性。 5 l顺序程序又称简单程序,程序走向只有一条路径。顺序程序又称简单程序,程序走向只有一条路径。例例1 1 双字节负数变补程序双字节负数变补程

3、序( (设数据设数据在在R4R5R4R5中中) ): MOV A MOV A,R5R5 ;取低字节取低字节 CPL A CPL A ADD A ADD A,#1#1 ;低字节变补低字节变补 MOV R5 MOV R5,A A MOV A MOV A,R4R4 ;取高字节取高字节 CPL A CPL A ADDCADDC A A,#0#0 ;高字节变补高字节变补 SETB ACC.7SETB ACC.7 MOV R4 MOV R4,A A SJMP $ SJMP $6lMOVMOV R0 R0,#40H#40H ;设指针设指针lMOVMOV A A,R0R0;取一个字节取一个字节lMOVMOV

4、R2 R2,A A;暂存暂存R2R2lANLANL A A,#0FH#0FH;高半字节清高半字节清0 0lINCINC R0 R0lMOVMOV R0 R0,A A ;保存个位数据保存个位数据lMOVMOV A A,R2R2lSWAP ASWAP A ;十位换到低半字节十位换到低半字节lANLANL A A,#0FH #0FH ;高半字节清高半字节清0 0lINCINC R0 R0lMOVMOV R0 R0,A A;保存十位数据保存十位数据 片片内内 RAM 42H 0 十十 41H 0 个个 40H 十十 个个7一个判断决策框,程序有两条出路。一个判断决策框,程序有两条出路。条件满足条件满足

5、?N影响条件影响条件Y处理段处理段例例1 1 求求R2R2中数据的补码(正数不变,负中数据的补码(正数不变,负数变补)。数变补)。 MOV AMOV A,R2R2 JNB ACC.7 JNB ACC.7,NEXT NEXT ;为正数?为正数? MOV CMOV C,ACC.7ACC.7 CPL ACPL A ;负数取反负数取反 INC A MOV ACC.7 MOV ACC.7,C C MOV R2 MOV R2,A ANEXTNEXT: SJMP NEXT SJMP NEXT ;结束结束8例例5-75-7 设设3030H H单元存放的是单元存放的是一元二次方程一元二次方程axax2 2+bx

6、+c=0+bx+c=0根根的判别式的判别式= =b b2 2-4ac-4ac的值。的值。解解: :值为有符号数,有三值为有符号数,有三种情况:大于零、等于零以种情况:大于零、等于零以及小于零。及小于零。 9程序:程序: ORG 1000H START: MOV A,30H ;值送值送A JNB ACC.7,YES ;非负,非负,转转YES MOV 31H,#0;0转转TOW MOV 31H,#1;=0有相同实根有相同实根 SJMP FINISH TOW: MOV 31H,#2;有两个不同实根有两个不同实根FINISH: SJMP $10l 根据前面程序运行的结果,可以有根据前面程序运行的结果,

7、可以有N N种选择,并种选择,并能转向其中任一处理程序。能转向其中任一处理程序。 例例5-105-10 128128路分支程序。路分支程序。 功能:功能:根据根据R3R3的值的值(00(00H H7FH)7FH)转到转到128128个目的地址。个目的地址。 入口条件:入口条件:( (R3)=R3)=转移目的地转移目的地址代号址代号(00(00H H7FH)7FH)。出口条件:出口条件:转移到转移到128128个分支个分支程序段入口。程序段入口。 PRGTBL: AJMP ROUT00 AJMP ROUT01 AJMP ROUT7F 11参考程序:参考程序: JMPl28:MOV A,R3 RL

8、 A ;(A)2 MOV DPTR,#PRGTBL ;散转表首散转表首 ;址送;址送DPTR JMP A+DPTR ;散转散转PRGTBL:AJMP ROUT00 AJMP ROUT01 AJMP ROUT7F ;128个个AJMP指令占指令占 ;256256个字节个字节12例例5-115-11 256路分支程序。路分支程序。 功能:功能:根据根据R3的值转移到的值转移到256个目的地址。个目的地址。入口条件:入口条件:( (R3)=R3)=转移目的地址代号转移目的地址代号(00(00H HFFH)FFH)。出口条件:出口条件:转移到相应分支处理程序入口。转移到相应分支处理程序入口。特点:特点

9、: 1.入口地址为双字节入口地址为双字节(16位位),查表前应先把,查表前应先把R3内容乘以内容乘以2。当。当地址代号为地址代号为00H7FH时时(前前128路分支路分支),乘,乘2不会产生进位;当不会产生进位;当地址代号为地址代号为80HFFH时,乘时,乘2会产生进位,此时应使基址高会产生进位,此时应使基址高8位位内容(内容(DPH)加加1。乘。乘2功能采用指令功能采用指令RLC A完成。完成。 2. 程序采用程序采用“堆栈技术堆栈技术”,巧妙地将查表得到的分支入口地,巧妙地将查表得到的分支入口地址址低低8位和高位和高8位分别压入堆栈,然后执行位分别压入堆栈,然后执行RET指令把栈顶内容指令

10、把栈顶内容(分分支入口地址支入口地址)弹入弹入PC实现转移。实现转移。 13 JMP256: MOV A,R3 ;取取N值值 MOV DPTR,#PRGTBL ;指向分支地址表首址指向分支地址表首址 CLR C RLC A ;(A)2 JNC LOWl28 ;是前是前128个分支程序,则转移个分支程序,则转移 INC DPH ;否则基址加否则基址加256LOWl28: MOV TEMP,A ;暂存暂存A INC A ;指向地址数据的低指向地址数据的低8位位 MOVC A,A+DPTR ;查表,读分支地址低查表,读分支地址低8位位 PUSH ACC ;地址数据的低地址数据的低8位入栈位入栈 MO

11、V A,TEMP ;恢复恢复A,指向地址数据的高指向地址数据的高8位位 MOVC A,A+DPTR ;查表,读分支地址高查表,读分支地址高8位位 PUSH ACC ;地址数据的高地址数据的高8位入栈位入栈 RET ;分支地址弹入分支地址弹入PC,实现转移实现转移PRGTBL: DW ROUT00 ;高高8 8位在低地址,低位在低地址,低8 8位在高地址位在高地址 14例例5-125-12 大于大于256路分支转移程序。路分支转移程序。( (不讲不讲) ) 功能:功能:根据入口条件转向根据入口条件转向n个分支处理程序。个分支处理程序。入口条件:入口条件:(R7R6)=转移目的地址代号。转移目的地

12、址代号。出口条件:出口条件:转移到相应分支处理程序入口。转移到相应分支处理程序入口。特点:特点: 程序散转表中有程序散转表中有N N条条LJMPLJMP指令,每条指令,每条LJMPLJMP指令占指令占3 3个个字节,因此要按入口条件将地址代号乘以字节,因此要按入口条件将地址代号乘以3 3,并将乘积的,并将乘积的高字节加上(高字节加上(DPHDPH)、)、将乘积的低字节送将乘积的低字节送A(A(变址寄存器变址寄存器) )。15参考程序:参考程序:JMPN:MOV DPTR,#PRGTBL ;DPTR指向散转表首址指向散转表首址 MOV A,R7 ;取地址代号取地址代号高高8位位 MOV B,#3

13、 MUL AB ;3 ADD A,DPH MOV DPH,A ;修改指针高修改指针高8位位 MOV A,R6 ;取地址代号低取地址代号低8位位 MOV B,#3 ;3 MUL AB XCH A,B ;交换乘积的高低字节交换乘积的高低字节 ADD A,DPH ;乘积的高字节加上乘积的高字节加上(DPH) MOV DPH,A XCH A,B ;乘积的低字节送乘积的低字节送A JMP A+DPTR ;散转散转 PRGTBL: LJMP ROUT0 16循环控制循环控制 ?循环工作循环工作循环结束循环结束循环初始化循环初始化YN一初始化部分一初始化部分(循环准备工作)(循环准备工作) 如:清结果单元、

14、设指针、设循如:清结果单元、设指针、设循环控制变量初值等。环控制变量初值等。二循环体二循环体 循环工作部分:需多次重复处理的工作。循环工作部分:需多次重复处理的工作。 循环控制部分:修改指针和循环控制变循环控制部分:修改指针和循环控制变量;检测循环条件(满足循环条件则继续循量;检测循环条件(满足循环条件则继续循环,否则退出循环)。环,否则退出循环)。三三. . 结束部分结束部分(处理和保存循环结果)(处理和保存循环结果) 循环次数的控制:循环次数的控制:循环次数已知(用计数器控制);循环循环次数已知(用计数器控制);循环次数未知(按给定条件控制)。次数未知(按给定条件控制)。 允许允许0 0次

15、循环的循环结构应在循环工作次循环的循环结构应在循环工作之前之前检测循环条件。检测循环条件。17l例:例:求求n n个单字节数据的累加和。设数据在个单字节数据的累加和。设数据在4343H H起始单元,起始单元,数据串长度数据串长度n n在在4242H H单元,累加和不超过单元,累加和不超过2 2个字节。个字节。 片片内内 RAM Xn 43H X1 42H n 41H SUMH 40H SUML SUMSUM: MOVMOVR0R0,#42H#42H;设指针设指针MOVMOVA A,R0R0MOVMOVR2R2,A A ;循环计数器循环计数器n nCLRCLRA A ;结果单元清结果单元清0 0

16、(A(A放和放和) )MOVMOVR3R3,A A (R3(R3放相加后进位位放相加后进位位) )ADD1ADD1:INCINCR0R0 ;修改指针修改指针ADDADDA A,R0 R0 ;累加累加JNC NEXTJNC NEXT ;处理进位处理进位INCINCR3R3 ;有进位,高字节加有进位,高字节加1 1NEXT:NEXT: DJNZ DJNZ R2,ADD1 R2,ADD1 ;循环控制:数据是否加完循环控制:数据是否加完?MOVMOV40H40H,A A ;循环结束,保存结果循环结束,保存结果MOVMOV41H41H,R3R3RETRET18一一. .计数控制:计数控制: 设循环计数器

17、控制循环次数,有设循环计数器控制循环次数,有正计数正计数和和倒计数倒计数两种方式。两种方式。例:例:为一串为一串7 7位位ASCIIASCII码码数据的数据的D D7 7位加上位加上奇校验奇校验。设数据存放在。设数据存放在片外片外RAMRAM的的21012101H H起始单元,数据长度在起始单元,数据长度在21002100H H单元。单元。 片片外外 RAM 2102H 01101000 2101H 00101101 2100H n MOV DPTRMOV DPTR,#2100H#2100HMOVX AMOVX A,DPTRDPTRMOV R2MOV R2,A A;(R2(R2放数据长度放数据

18、长度) )NEXTNEXT:INC DPTRINC DPTRMOVX AMOVX A,DPTRDPTRORL AORL A,#80H#80H;(最高位置;(最高位置1 1)JNB PJNB P,PASSPASS;判断是否需要加奇校验判断是否需要加奇校验(P(P为为ACCACC奇偶标志)奇偶标志)MOVX DPTRMOVX DPTR,A A ;需要,则加奇校验需要,则加奇校验PASSPASS:DJNZ R2DJNZ R2,NEXTNEXTDONEDONE:SJMP DONESJMP DONE19例:例:找正数表最小值。正数表存在片外找正数表最小值。正数表存在片外RAMRAM中以中以LISTLIS

19、T开始的单开始的单元,以元,以-1-1(补码为补码为0 0FFHFFH)为结束标志。为结束标志。STARTSTART:MOVMOVDPTRDPTR,#LIST#LIST ;数表首地址数表首地址 MOVMOVB B,#127#127 ;预置最小值预置最小值127127(8(8位正数的最大值位正数的最大值) )NEXTNEXT: MOVX A MOVX A,DPTRDPTR ;取数取数 INC INCDPTRDPTR ;修改指针修改指针 CJNE ACJNE A,#0FFH#0FFH,NEXT1NEXT1;是否为数表结尾?是否为数表结尾? SJMP DONESJMP DONE ;是结尾,则循环结束

20、是结尾,则循环结束NEXT1NEXT1:CJNE ACJNE A,B B,NEXT2NEXT2 ;与与预置最小值预置最小值127127比较比较 NEXT2NEXT2:JNCJNCNEXT NEXT ;Cy=1,Cy=1,则则ABAB;Cy=0,Cy=0,则则ABAB MOV MOVB B,A A ;保存小值(把小的数放到保存小值(把小的数放到B B里,里, SJMP NEXT SJMP NEXT ;作为下一次的被比较数)作为下一次的被比较数)DONEDONE: SJMP DONE SJMP DONE20 循环体中套循环,以双重循环使用居多。循环体中套循环,以双重循环使用居多。 例:例:将片内将

21、片内RAMRAM中一串单字节无符号数按升序排序。(不讲)中一串单字节无符号数按升序排序。(不讲) 具体做法:具体做法:每次取相邻单元的两个数比较,决定是否需要交每次取相邻单元的两个数比较,决定是否需要交换数据位置。换数据位置。 第一次循环,比较第一次循环,比较N-1N-1次,取到数据表中最大值。次,取到数据表中最大值。 第二次循环,比较第二次循环,比较N-2N-2次,取到次大值。次,取到次大值。 第第N-1N-1次循环:比较一次,排序结束。次循环:比较一次,排序结束。片片 内内 RAMM AX5241T TA AB B3内循环控制内循环控制 ?循环工作循环工作循环结束循环结束外循环控制外循环控

22、制 ?内循环初始化内循环初始化开始开始外循环初始化外循环初始化21SORTSORT: MOV MOV A A,#(N-1)#(N-1) MOVMOV R4 R4,A A;外循环次数外循环次数LOOP1LOOP1: MOV MOV A A,R4R4 MOV MOV R3 R3,A A;内循环次数内循环次数 MOVMOV R0 R0,#TAB#TAB;设数据指针设数据指针LOOP2LOOP2: MOV MOV A A,R0R0;取相邻两数取相邻两数 MOVMOV B B,A A INC INC R0 R0 MOV MOV A A,R0R0 CJNE A CJNE A,B B,L1L1;比较比较L1

23、L1: JNC JNC UNEX UNEX;ABAB,不交换不交换 DECDEC R0 R0;否则交换数据否则交换数据 XCHXCH A A,R0R0 INC INC R0 R0 MOV MOV R0 R0,A AUNEXUNEX: DJNZ R3 DJNZ R3,LOOP2LOOP2;内循环结束?内循环结束? DJNZ R4DJNZ R4,LOOP1LOOP1;外循环结束?外循环结束? RETRET(R3)1=0 ?B (R0) A ( R0 + 1 )循环结束循环结束外循环次数外循环次数R4(R4)1=0 ?内循环次数内循环次数R3表首表首TABR0开始开始A BA B?( (R0)(R0

24、+1)R0)(R0+1)R0 R0+1R0 R0+1Y YN N22例:例:试计算延时程序的执行时间。试计算延时程序的执行时间。源程序源程序 指令周期指令周期(M) (M) 指令执行次数指令执行次数DELAYDELAY:MOV R6MOV R6,#64H#64H1 1 I1 I1: MOV R7 MOV R7,#0FFH #0FFH 1 1 I2 I2: DJNZ R7 DJNZ R7,I2I22 2 DJNZ R6 DJNZ R6,I1 2I1 2 RET RET 2 2延时时间计算(设振荡频率为延时时间计算(设振荡频率为12MHz12MHz):(1(11+11+1100+2100+2100

25、100255+2255+2100+2100+21)1)M = 51.3msM = 51.3ms1 11001001001002552551001001 123编写循环程序应注意的问题:编写循环程序应注意的问题: 1)进入循环体前应注意安排循环初始化,合理设置初始化变)进入循环体前应注意安排循环初始化,合理设置初始化变 量;量; 2)循环体只能执行有限次,无限执行的为)循环体只能执行有限次,无限执行的为“死循环死循环”; 3)不能破坏或修改循环体,避免从循环体外直接跳转到循环体)不能破坏或修改循环体,避免从循环体外直接跳转到循环体 内;内; 4)内外循环间不应相互交叉;)内外循环间不应相互交叉;

26、 5)循环体内可直接转到循环体外或外层循环中,实现一个循环)循环体内可直接转到循环体外或外层循环中,实现一个循环 由多个条件控制结束的结构。由多个条件控制结束的结构。 24例例5-19 一个十六进制数存放在一个十六进制数存放在HEX单元的低四位,将其转换成单元的低四位,将其转换成ASCII码并送回码并送回HEX单元。单元。 程序:程序: ORG 0100H HEX EQU 30H HEXASC:MOV A , ,HEX ANL A,#00001111B ADD A,#3 ;变址调整变址调整 MOVC A, A+PC MOV HEX,A ;2 2字节字节 RET ;1 1字节字节 ASCTAB:

27、DB 30H,3lH,32H,33H DB 34H,35H,36H,37H DB 38H,39H,41H,42H DB 43H,44H,45H,46H END 25 子程序:能完成某项特定功能的独立程序段,可被子程序:能完成某项特定功能的独立程序段,可被反复调用。反复调用。一、子程序结构一、子程序结构 1 1)子程序入口用标号作为子程序名。)子程序入口用标号作为子程序名。 2 2)调用子程序之前设置好堆栈。)调用子程序之前设置好堆栈。 3 3)用返回指令)用返回指令RETRET结束子程序,并保证堆栈栈顶为调用程序结束子程序,并保证堆栈栈顶为调用程序的返回地址。的返回地址。 4 4)子程序嵌套时

28、须考虑堆栈容量。)子程序嵌套时须考虑堆栈容量。 5 5)提供足够的调用信息)提供足够的调用信息: : 如:如:子程序名子程序名、子程序功能子程序功能、入口参数入口参数和和出口参数出口参数、子、子程序占用的程序占用的硬件资源硬件资源、子程序中调用的、子程序中调用的其他子程序名其他子程序名等。等。入口参数:调用子程序之前,需要传给子程序的参数。入口参数:调用子程序之前,需要传给子程序的参数。出口参数:子程序返回给调用程序的结果参数。出口参数:子程序返回给调用程序的结果参数。 1)1)子程序无须传递参数子程序无须传递参数 例例5-23 5-23 27 例例5-24 5-24 双字节负数求补子程序双字

29、节负数求补子程序CPLDCPLD。 入口参数:入口参数:(R7R6)=16位数。位数。 出口参数:出口参数:(R7R6)=求补后的求补后的16位数。位数。 CPLD: MOV A,R6 CPL A ADD A,#1 MOV R6,A MOV A,R7 CPL A ADDC A,#0 SETB ACC.7 MOV R7,A RET 2)2)用累加器或工作寄存器传递参数用累加器或工作寄存器传递参数 28例例5-255-25 n字节负数求补子程序。字节负数求补子程序。入口参数:入口参数:(R0)=待待求补数的低字节指针,求补数的低字节指针,(R7)=n-1。出口参数:出口参数:(R0)=求补后的指针(高字节)。求补后的指针(高字节)。 CPLN: MOV A,R0 CPL A ADD A,#1 MOV R0,A NEXT: INC R0 MOV A,R0 CPL A ADDC A,#0 MOV R0,A DJNZ R7,NEXT MOV A,R0 SETB ACC.7 MOV R0,A RET3)3)通过操作数地址传递参数通过操作数地址传递参数 29例例5-265-26 在在HEXHEX单元存放两个十六进制数单元存放两个十六进制数(8(8位位) ),将它们,将它们分别转换成分别转换成ASCASC码并存入码并

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论