片机教案汇编语言程序设计.ppt
,计算机硬件技术基础,专题五 汇编语言程序设计,第四章,主讲教师赵晓安,计算机科学与软件学院计算机基础教学部,本章重点,教学目标:本章内容是软件编程的关键,地位重要。程序结构(顺序、分支、循环、子程序);应用实例;熟练掌握程序设计的思路方法和技巧;要求掌握典型算法;找到分析问题和解决问题的着眼点;学会抓住不同问题的规律性;举一反三,独立思考,有创意,有新意,独到。,一、分清可执行指令和非执行指令及其功能二、将高级语言程序设计方法迁移到汇编语言程序设计中来三、特别注意汇编语言是面向机器的,要记住 CPU的资源;存储器结构与寻址方式;I/O口、定时/计数器、中断系统等关键的参数;寄存器间接寻址中指针的选择和使用技巧。四、从宏观上看,MCS-51汇编语言程序的整体结构 从微观上看,微机中各组成部分是如何通过程序联系起来。,汇编语言程序设计的要点:,41 汇编语言程序设计基础42 MCS-51 单片机汇编语言程序设计,第四章 汇编语言程序设计,411 汇编语言与机器语言412 汇编语言的格式413 伪指令414 汇编语言源程序的汇编415 汇编语言程序设计的一般步骤,41 汇编语言程序设计基础,421 简单程序设计422 分支程序设计 423 循环程序设计424 查表程序设计425 散转程序设426 子程序设计427 运算程序设计,42 MCS-51 单片机汇编语言程序设计,机器语言计算机唯一能够识别和执行的语言,面向机器,二进制。汇编语言“符号语言”,用指令助记符代表机器语言指令,面向机器。要经过汇编。低级语言适合开发实时控制程序高级语言面向算法、过程、对象,类似自然语言,可移植性好,须经解释或翻译后才能被执行。,411 汇编语言与机器语言,412 汇编语言的格式,指令格式:,伪指令格式:名字 定义符 参数,参数;注释或标号:定义符 项表;注释,1 标号段 标号段位于语句的开头,指明标号所在指令的首地址,标号又称为标号地址或符号地址,是一个可选项,只有需要时才设置。绝对不允许把指令的保留字、寄存器号及伪指令字符作为语句的标号;标号在同一程序单位中只能出现一次。2、操作码段 操作码段可以是可执行指令的助记符,操作码段用于指示计算机进行何种操作,因此,是任何一条语句中的必选项,汇编语言根据这一字段生成目标代码。操作码段也可以是伪指令的助记符,对汇编程序下命令,在汇编时起作用。,LOOP:MOV A,R0 DJNZ R2,LOOP,3、操作数段 操作数段用于存放指令的操作数或操作数地址,操作数的个数因指令的不同而不同,通常有三种情况:无操作数 RET 单操作数 JC LOOP 双操作数 MOV A,B 可以采用字母或数字等多种表示形式:(1)操作数是立即数,可用二进制、十进制和十六进制形式(2)作寄存器和特殊功能寄存器名 MOV A,PSW(3)标号地址 DJNZ R7,NEXT(4)带加、减运算符的表达式,例:MOV A,#100-14、注释段:注释指令或程序的含义,便于阅读程序、维护程序。必须用“;”隔开,续行时,也必须以“;”开头。,常数:01010101B;12D,12;0F1H,59H67Q;A,a操作数:A,B,DPTR表达式mov A,#(12H-03H),414 汇编语言源程序的汇编,汇编可分成两种:人工汇编机器汇编 机器汇编是用机器自动把汇编语言源程序翻译成可以运行的目标代码程序,即二进制程序的过程,它是一种用机器来代替人脑的汇编,完成这一汇编过程的软件称为“汇编程序”。,汇编,机器语言目标程序,汇编语言源程序,汇编程序,汇编,机器语言目标程序,汇编语言源程序,人工查指令机器码表,415 汇编语言程序设计的一般步骤,程序设计的方法程序设计的步骤,程序设计的方法,结构化设计模块化设计开发方法自底向上开发先底层开发自顶向下开发先顶层开发混合方法,底,顶,程序设计的步骤,分析课题,确定算法和思路根据算法和思路画出流程图根据流程图编写程序上机调试,排除错误,流程图图例,起止框处理框判断框连线,程序设计步骤流程图,413 伪指令,定义:仅向汇编程序发出的,并仅由汇编程序在汇编过程中识别和执行的一种汇编控制命令,它本身在目标程序中不产生机器码。汇编起始伪指令:ORG汇编结束伪指令:END定义字节伪指令:DB定义字伪指令:DW定义位伪指令:BIT赋值伪指令:EQU DATA,汇编起始伪指令,格式:ORG 功能:指定汇编源程序编译成机器语言程序 的起始地址例如:ORG 0000H LJMP 0100H ORG 0100H Start:MOV A,#5AH SJMP$END,程序中可以有多条ORG语句,但定义的起始地址既不要交叉,也不要重叠。必须从小地址向大地址分配程序所占空间。,汇编结束伪指令,格式:END 起始地址功能:停止汇编示例:ORG 0000H ljmp 0100H ORG 0100H Start:mov A,#5Ah sjmp$END,定义字节伪指令,格式:DB 功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表可以是一个字节、数或以引号括起来的字符串。ORG 1000HDat:DB 11h,-1,A,BCD END,该指令只能为程序存储器赋初值,不能为其他存储器赋初值,尤其不能为内部数据存储器赋初值。,注意:,1000H,11H,FFH,41H,42H,程序存储器,43H,44H,补码,ASCII码,定义字伪指令,格式:DW 功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表是一个字(两字节)。ORG 1000HDat:DW 1122h,3344h,-1 END,1000H,11H,22H,33H,44H,程序存储器,只对程序存储器起作用,FFH,FFH,定义位伪指令,格式:BIT 功能:定义位变量地址U BIT 20H.0V BIT 20H.1W BIT 20H.2X BIT P1.0Y BIT P2.4Z BIT P3.2Q BIT TCON.2,赋值伪指令,格式:EQU 功能:定义符号变量值 X EQU 05H Y EQU 06H NEXT EQU 2000H 格式:DATA 功能:定义符号变量值(内部RAM)ONE DATA 30H(数据或地址)TWO DATA ONE+1,421 简单程序设计,特点:从第一条指令开始依次执行每一条指令,直到程序执行完毕,中间没有转移指令,没有分支。只有一个入口一个出口。,入口,出口,1、例43 两位压缩的BCD码转换成相应的ASCII码算法1 ANL 拆字、ORL#30H拼字算法2 DIV 拆字、ORL#30H 拼字存储 两位BCD数指压缩的BCD码占一个单元 相应的ASCII码占二个单元,2、例44 将8位无符号二进制数转换成三位BCD码 算法1 DIV 100 得百位,再DIV 10 的十位和个位 算法2 DIV 10 的个位,再DIV 10 的十位和百位 存储 8位无符号二进制数占一个单元 个位、十位和百位各占一个单元,422 分支程序设计,用条件转移语句实现二分支用cjne实现三分支例4-6 多分支用 jmp A+DPTR 实现多分支,根据不同的条件,执行不同的程序段。JZ、JNZ、JC、JNC、JB、JNB、CJNE、DJNZ正确合理地运用,用条件转移语句实现二分支,用cjne实现三分支,编程要点:cjne=等于不等于则:jc 大于 如何实现?,ORG 0000H Cjne R3,#15,NEQ sjmp L1;=15NEQ:jnC L1;15 sjmp L2;15 L1:nop;15 L2:,y=,(R0)x,(R1)y,2、判正负,CJNE R0,#0,NZERO,CLR CMOV A,R0SUBB A,#0JZ ZERO,MOV A,R0 JZ ZERO,其它方法?,分析:,1、判零,MOV A,R0JNB ACC.7,positive,CJNE R0,#7FH,DO1 SJMP positiveDO1:JC positive;negativePositive:.0FFH80H negative 00H7FH positive,用cjne实现三分支,cjne R0,#0,MP1 mov R1,#0 sjmp MP3MP1:mov A,R0 jnb ACC.7,MP2 mov R1,#0FFh sjmp MP3MP2:mov R1,#01hMP3:sjmp$end,y=,(R0)x,(R1)y,判正负,判零,分支间隔离,ORG 1000H ONE DATA 30H TWO DATA 31H MAX DATA 32H CLR C MOV A,ONE SUBB A,TWO JZ XMAX JB ACC7,NEG JB OV,YMAX SJMP XMAX NEG:JB OV,XMAXYMAX:MOV A,TWO SJMP RMAX XMAX:MOV A,ONERMAX:MOV MAX,ASJMP$END,例46 ONE和TWO单元中的两个带符号数比较大小,将较大者存入MAX单元中。两数相等则任一个存入MAX即可。,若XY为负,则OV=0,XY,若XY为正,则OV=0,XY OV=1,XY,用 jmp A+DPTR 实现多分支,KeyB5:mov DPTR,#JMPTBL clr C subb A,#0Ah rl A JMP A+DPTRJMPTBL:ajmp AAA ajmp BBB ajmp CCC ajmp DDDAAA:BBB:,键入 10,转AAA 11,转BBB 12,转CCC 13,转DDD,CCC:DDD:,(A)=?,语句组1,语句组2,语句组3,语句组4,0AH,0BH,0CH,0DH,入口,AAA,BBB,CCC,DDD,423 循环程序设计,循环程序结构循环程序通常有两种编制方法循环问题的类型循环程序设计举例,循环程序结构,循环初始化:循环控制变量的初始化、数据变量的初始化循环工作部分:循环主体,重复执行的部分循环控制部分:循环变量的修改、终止控制循环结束:这部分程序用于存放执行循环程序所得结果以及恢复各单元的初值。,1、先循环处理后循环控制,称为直到型循环;,2、先循环控制后循环处理,称为当型循环。,循环程序通常有两种编制方法,1、计数型 举例 循环次数已知,用计数方法控制循环的终止。2、条件型 循环次数未知,根据某种条件判断是否终止循环。例47 内部RAM块传,遇到“#”字符结束 3、计数型+条件型 例48 8031外部RAM块传及冒泡排序 重点,循环问题的类型,单循环程序例1:多个单字节数求累加和 计数型例2:内部数据区清零 计数型例47 内部RAM块传 改为条件型没讲多重循环程序例3:50ms延时程序 计数型例47 内部RAM块传 计数型+条件型没讲例48 外部RAM块冒泡排序 重点 计数型+条件型没讲,循环程序设计举例,例1:多个单字节数求累加和,ORG 0000HSUM:mov R3,#0 mov R4,#0 mov R0,#50H mov R2,#5Loop:mov A,R4 add A,R0 mov R4,A inc R0 clr A addc A,R3,mov R3,A djnz R2,Loop sjmp$END,累加和单元要先请零,例2:内部数据区清零,ORG 0000HZero:mov R0,#30H mov R7,#10 mov A,#00HLoop:mov R0,A inc R0 djnz R7,Loop sjmp$END,内部RAM,30H,R0,0,0,0,0,0,0,10个,例3:50ms延时程序,Delay:mov R7,#200Del1:mov R6,#123 nopDel2:djnz R6,Del2 djnz R7,Del1 sjmp$;(不计入),;1us;1us;1us;2us;2us,T=200(1+1+1232+2)+11us=50001us=50ms,例47把内部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2为 起始地址的区域,直到遇到“#”字符的ASC码为止。去掉块长度。参考程序如下:ORG2000HBLK1EQU30HBLK2EQU1000H MOV SP,#6FH MOVR0,#BLK1;BLK1数据块起始地址MOVDPTR,#BLK2;BLK2数据块起始地址XH:CLRCMOVA,R0;取数据PUSHACCSUBBA,#23H;判是否为“#”字符JZSTOPPOPACCMOVXDPTR,A;数据传送INCR0INCDPTRAJMP XH;循环控制 STOP:SJMP$END,原题为计数型+条件型,改为条件型,例47把内部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2为 起始地址的区域,直到遇到“#”字符的ASC码为止。块长度在R1中。参考程序如下:ORG2000HBLK1EQU30HBLK2EQU1000H N EQU 100 MOV SP,#6FH MOVR0,#BLK1;BLK1数据块起始地址MOVDPTR,#BLK2;BLK2数据块起始地址 MOV R1,#N;块长度 INCR1SJMPCHECK;防止数据块的长度为零 XH:CLRCMOVA,R0;取数据PUSHACCSUBBA,#23H;判是否为“#”字符JZSTOPPOPACCMOVXDPTR,A;数据传送INCR0INCDPTR CHECK:DJNZ R1,XH;循环控制 计数 STOP:SJMP$END,计数型+条件型,条件,改错,例48 设单片机8031外部RAM从3600H单元开始存放有100个无符号数,试编写程序能使它们按从小到大的顺序排列。(最小的数放在3600H单元)解:排序程序采用“冒气泡”的方法,其“冒气泡”的过程如下:(设N=5时),85429,5428,425,24,第一轮比较4次,第二轮比较3次,第三轮比较2次,第四轮比较1次,98542,89542,85942,85492,8542,5842,5482,542,42,452,对 n 个数,则要进行n-1轮扫描,在第 i 轮扫描中要进行 n-i 次比较。,可以推知:,若将原始数据改为 9 8 2 4 5,则排序过程如下:,82459,2458,245,24,第一轮比较4次,第二轮比较3次,第三轮比较2次,第四轮比较1次,98245,89245,82945,82495,8245,2845,2485,245,24,245,可以看出:,第三轮排序中没有发生交换,即第三轮结束后,已经排好了,应结束排序,不必再排第四轮。为此增加一个“排好序标志位”,预先将它清0,当产生交换时,将它置1,表示没排好,可以进行下一轮排序,否则,结束排序。,36H 00H 01H 02H 03H 04H 05H 06H,P2,R0,R1,movx A,R0mov 30h,Amovx A,R1movx R0,Axch A,30Hmovx R1,A,交换,用一个指针?用一个R0?用一个DPTR?,A,30H,冒泡法排序,ORG 0000h mov PSW,#00h mov P2,#36h mov R2,#100-1Loop0:mov R0,#00h mov R1,#01h mov 03h,R2 clr 7Fh;排好序标志清0Loop1:movx A,R0 mov 30h,A movx A,R1,cjne A,30h,Loop2 sjmp L1 Loop2:JNC L1;小到大,JC 大到小 movx R0,A xch A,30h movx R1,A setb 7Fh;排好序标志置1L1:inc R0 inc R1 djnz R3,Loop1;轮内次数 jnb 7Fh,Loop3;排好序标志 djnz R2,Loop0;轮数Loop3:sjmp$END,交换,426 子程序设计,子程序设计方法子程序的调用过程与子程序嵌套调用过程中的参数传递通过寄存器传递通过堆栈传递通过数据指针(DPTR)传递,子程序设计方法,格式:;子程序名;子程序功能:;入口参数:;出口参数:;占用资源:子程序名:.,子程序的调用过程与子程序嵌套,主程序要调用子程序时通过call 指令子程序执行完后通过ret 指令返回防止自然进入子程序和自然退出子程序子程序嵌套,通过寄存器传递,方法简单、参数有限例:ORG 0000HMain:mov sp,#5FH mov R0,#40H mov R7,#10H lcall Zero sjmp$,;子程序名:Zero;功能:对内部数据区清零;入口参数:R0内部数据区;R7内部数据区长度;出口参数:无;占用资源:A,R0,R7Zero:clr ALoop:mov R0,A inc R0 djnz,R7,Loop ret END,通过堆栈传递,ORG 0000HMain:MOV SP,#5FH mov 70H,#40h mov 71H,#10H push 70h push 71h lcall Zero sjmp$,;子程序名:Zero;功能:对内部数据区清零;入口参数:70内部数据区地址;71h内部数据区长度;出口参数:无;占用资源:,R0,R7,70h,71hZero:pop DPH pop DPL pop 07h;R7 pop 00h;R0 clr ALoop:mov R0,A inc R0 djnz,R7,Loop push DPL push DPH ret END,63H,ZERO:MOV R0,SP DEC R0 DEC R0 MOV 07H,R0 DEC R0 MOV 01H,R0 CLR ALOOP:MOV R1,A INC R1 DJNZ,R7,LOOP RET END,ORG 0000HMain:MOV SP,#5FH mov 70H,#40h mov 71H,#10H push 70h push 71h lcall Zero pop acc pop acc sjmp$,方法2:,通过数据指针(DPTR)传递,将待传递参数紧跟在调用指令之后 ORG 0000HMain:MOV SP,#6FH NOP ACALL PRINT DB THIS IS AN DB EXAMPLE DB 0AH,0DH,00HNEXT:NOP SJMP$,PRINT:POP DPH POP DPLPPP1:MOV A,#00H MOVC A,A+DPTR INC DPTR JZ PPPENDPPP2:MOV P1,A SJMP PPP1PPPEND:JMP A+DPTR END,427 运算程序设计,多字节加、减、乘、除运算程序的设计 1多字节加减运算程序设计 例419 多字节无符号数求和 例420 8位二进制带符号数加法 例421 多字节减法子程序 例422 BCD数减法运算程序 2多字节乘除运算程序设计 例423 两个16位二进制无符号数相乘(连加)例424 16位二进制无符号数除法 例42 两个16位二进制带符号数相乘 例426 两位十进制数乘法程序设计 例427 两位十进制数除法程序设计3.讲解举例,查表程序 以PC为指针 以DPTR为指针,424 查表程序设计,425 散转程序设,散转程序 转移指令表 地址偏移量表 转向地址表,逻辑运算程序 ASCII码二进制数据的拼装与逻辑简单实例多字节左移一位,讲解举例,算术运算程序 两个多字节数加法 多字节BCD码减法 多字节左移加乘法 多字节乘法,用MUL指令,两个多字节数加法,ORG 0000HJIA:MOV R0,#40H MOV R1,#50H MOV R2,#4 CLR CJIA1:MOV A,R1 ADDC A,R0 MOV R0,A INC R0 INC R1 DJNZ R2,JIA1 MOV F0,C SJMP$END,用三个指针怎么做?,ORG 1000HMOV R0,#40H MOV R1,#50H MOV R2,#4 SETB RS0 MOV R0,#60H CLR RS0 CLR CLOOP:MOV A,R0 ADDC A,R1 INC R0 INC R1,SETB RS0 MOV R0,AINC R0CLR RS0DJNZ R2,LOOPMOV F0,CSJMP$END,+,0区R0,0区R1,1区R0,40H,50H,60H,例:24H+56H=7AH,(R0),(R0),(R0),0区,1区,2区,问:下例怎么设计?,多字节BCD码减法,99 88 77 66 H(43 42 41 40)H-44 55 66 77 H(53 52 51 50)H ORG 0000HJia:mov R0,#40h mov R1,#50h mov R2,#4 clr CJia1:mov A,#9Ah subb A,R1 add A,R0 da A,CPL C mov R0,A inc R0 inc R1 djnz R2,Jia1 mov F0,C sjmp$END,9AH-77H 23H+66H 89HCY=1 9AH 66H 1 33H+77H AAH+66H 10HCY=0,9AH 55H 45H+88H CDH+66H 33HCY=0 9AH-44H 56H+99H EFH+66H 55HCY=0,9999999AH-44556677H?,9A9AH,数据的拼装,x7x6x5x4x3x2x1x0(20H)y7y6y5y4y3y2y1y0(21H)y2y1y0 x4x3x2x1x0(30H)ORG 0000HSTART:MOV 30H,20H ANL 30H,#00011111B MOV A,21H SWAP A RL A ANL A,#11100000B ORL 30H,A SJMP$END,ASCII码二进制,ORG 0000HAtoH:MOV A,#A CLR C SUBB A,#30H CJNE A,#0AH,NEQ SJMP BIGNEQ:JC AENDBIG:SUBB A,#07HAEND:SJMP$END,ORG 0000HHtoA:MOV A,#0BH ADD A,#90H DA A ADDC A,#40H DA A SJMP$END,0BH+90H 9BH+66H 101H 40H+1 42H,与逻辑简单实例,P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0,执行主程序的逻辑函数:F=P1.6 P1.4 P1.2P1.2准备就绪信号,为“1”表示就绪P1.4主回路工作正常信号,为“1”表示正常P1.6启动开关闭合信号,为“1”表示闭合程序片段:WAIT:MOV A,P1;(P1)=XXXXXXXXB ANL A,#54H;01010100B CJNE A,#54H,WAIT;F=1?MAIN:;主程序,多字节左移一位,B3L:CLR CLOOP:MOV A,R0 RLC A MOV R0,A INC R0 DJNZ R2,LOOP RET END,ORG 2000H MAIN:MOV SP,#5FH MOV R0,#30H MOV R2,#3 ACALL B3L SJMP$,两个多字节数左移加乘法,循环初值:1、乘法次数=左移次数=乘数的位数=(R3)*8 2、左移字节数=乘数的字节数+被乘数的字节数=积的字节数(R3)+(R2)=(R5)3、扩大部分积的字节数=被乘数的字节数,=扩大部分积要清零的单元数=(R2)4、加法次数=(R2),有CY=1,再ADDC处理存储结构:(R0)=45H,(R1)=43H(R6)=(R1)-(R2)=43H-3=40H,47H 46H 45H 44H 43H 42H 41H 40H,被乘数最低位,乘数最低位,积最低位,积,R0,R1,ORG 0000HMIAN:MOV R0,#45H MOV R1,#43H MOV R2,#3 MOV R3,#2 MOV A,R3 ADD A,R2 MOV R5,A MOV A,R1 CLR C SUBB A,R2 MOV R6,A MOV R7,00H MOV A,#0 MOV 00H,R6 MOV 20H,R2LOOP:MOV R0,A INC R0 DJNZ 20H,LOOP,MOV B,R3 MOV A,#8 MUL AB MOV 21H,A GOON:MOV 22H,R5 MOV R1,06H CLR C RLCP:MOV A,R1 RLC A INC R1 DJNZ 22H,RLCP MOV R1,06H JNC NEXT MOV 22H,R2 MOV R0,07H CLR C,ADDP:MOV A,R0 ADDC A,R1 MOV R1,A INC R0 INC R1 DJNZ 22H,ADDP JNC NEXT MOV A,R1 ADDC A,#0 MOV R1,A JNC NEXT INC R1 MOV A,R1 ADDC A,#0 MOV R1,ANEXT:DJNZ 21H,GOON SJMP$END,用MUL指令做多字节乘法,例:3344H*56H=?,ORG 3000HMOV A,#44HMOB B,#56HMUL AB MOV 30H,A;(A)=4456L=(30H)MOV 31H,B;(B)=4456H=(31H)MOV A,#33HMOV B,#56HMUL AB;(A)=3356LADD A,31H;4456H+3356L=(31H)MOV 31H,ACLR AADDC A,B;(B)=3356H+CYMOV 32H,ASJMP$END,查表程序实现查表算法。该方法把事先计算或实验数据按一定顺序编成表格,存于程序存储器内,然后根据输入参数值,从表中取得结果。查表指令:MOVC A,A+DPTR查表前数据表格表头地址存入DPTR,要查得的数在表中相对表头地址的偏移量送入累加器A,最后MOVC A,A+DPTR完成查表,可在64KB内查表因为DPTR可以人为修改。,MOVC A,A+PC分为三步:1)用传送指令把所查数据的项数送入累加器A;2)使用ADD A,#data指令对累加器A进行修正,data值由下式确定:PC当前值+data=数据表头地址实际上data值等于查表指令和数据表格之间的字节数;3)用指令MOVC A,A+PC完成查表由于PC指针只能在A中提供的偏移地址的范围内查表,故,查表范围进在一页内。,查表程序设计,PC,ASCTAB+0,0123,ASCTAB+2,PC当前值,3B,PC当前值+3=,PC当前值+3+2=,表头,(A),补偿值=表头地址-PC当前值,表中偏移量,MOV A,#2 ADD A,#03H;计算偏移量 MOVC A,A+PC;查表 MOV R0,A;存结果 SIMP$ASCTAB:DB 0,1,2,3,ORG 0100H MOV A,R0;取转换值 ANL A,#0FH;屏蔽高四位 ADD A,#03H;计算偏移量 MOVC A,A+PC;查表 MOV R0,A;存结果 SIMP$ASCTAB:DB 0,1,2,3 DB 4,5,6,7 DB 8,9,A,B DB C,D,E,F END,ASCTAB,1B2B,PC当前值,3B,以PC为指针查表程序,TB1:mov A,R2 add A,R2 mov R3,A add A,#07H movc A,A+PC xch A,R3 add A,#03H+1 movc A,A+PC mov R4,A sjmp$,TAB1:DW 1520H,7586H DW 2345H,1000H DW 883H,9943H DW 4051H,6785H DW 4468H,5871H END,TAB1,1B2B1B1B2B,以DPTR为指针查表程序,LTB2:mov DPTR,#TAB2 mov A,R3 clr C rlc A mov R3,A xch A,R2 rlc A xch R2,A add A,DPL mov DPL,A mov A,DPH addc A,R2 mov DPH,A,clr A movc A,A+DPTR mov R2,A clr A inc DPTR movc A,A+DPTR mov R3,A retTAB2:DW.END,使用转移指令表的散转程序,ORG 0000H mov R2,#2Main:mov DPTR,#TAJ1 mov A,R2 add A,R2 jnc NADD inc DPHNADD:jmp A+DPTRTBJ1:ajmp PRG0 ajmp PRG1 ajmp PRG2 ajmp PRG3 sjmp$,PRG0:mov A,#0 sjmp HaltPRG1:mov A,#1 sjmp HaltPRG2:mov A,#2 sjmp HaltPRG3:mov A,#3Halt:sjmp$END,使用地址偏移量表的散转程序,JMP3:mov R2,#2 mov DPTR,#TBJ3 movc A,A+DPTR jmp A+DPTRTBJ3:DB PRG0-TBJ3 DB PRG1-TBJ3 DB PRG2-TBJ3 DB PRG3-TBJ3 DB PRG4-TBJ3 DB PRG5-TBJ3,PRG0:mov R0,#0 sjmp HaltPRG1:mov R0,#1 sjmp HaltPRG2:mov R0,#2 sjmp HaltPRG3:mov R0,#3 sjmp HaltPRG4:mov R0,#4 sjmp HaltPRG5:mov R0,#5Halt:sjmp$END,使用转向地址表的散转程序,JMP4:mov R2,#1 mov DPTR,#TBL4 mov A,R2 add A,R2 jnc NADD inc DPHNADD:mov R3,A movc A,A+DPTR xch A,R3 inc A movc A,A+DPTR mov DPL,A mov DPH,R3,clr A jmp A+DPTRTBL4:DW PRG0 DW PRG1 DW PRG2 DW PRG3PRG0:mov R0,#0 sjmp HaltPRG1:mov R0,#1 sjmp HaltPRG2:mov R0,#2 sjmp HaltPRG3:mov R0,#3Halt:sjmp$end,专题五结束,下次见,3.6 第六讲 2学时内容 专题四 第三章 1、位操作指令及举例 2、调用子程序和返回指令及举例 专题五 1、4.1节5个问题 2、4.2节 4.2.1 顺序程序 4.2.2 分支程序 4.2.3 循环程序 及举例3个 还有三个没讲,3.10 第七讲 内容 1、循环程序 举例(1)条件型(2)冒泡排序 条件+计数 2、子程序 参数传递及举例 3.13 第八讲 1、实验讲解 2、运算类程序3.17 第九讲 第五周 实验一 1、查表 2、散转 3、教科书中运算程序讲点,