1、,计算机硬件技术基础,专题五 汇编语言程序设计,第四章,主讲教师 赵晓安,计算机科学与软件学院计算机基础教学部,主讲教师 赵晓安,本章重点,教学目标:本章内容是软件编程的关键,地位重要。 程序结构(顺序、分支、循环、子程序); 应用实例; 熟练掌握程序设计的思路方法和技巧; 要求掌握典型算法; 找到分析问题和解决问题的着眼点; 学会抓住不同问题的规律性; 举一反三,独立思考,有创意,有新意,独到。,一、分清可执行指令和非执行指令及其功能 二、将高级语言程序设计方法迁移到汇编语言程序设计中来 三、特别注意汇编语言是面向机器的, 要记住 CPU的资源; 存储器结构与寻址方式; I/O口、定时/计数
2、器、中断系统等关键的参数; 寄存器间接寻址中指针的选择和使用技巧。 四、从宏观上看,MCS-51汇编语言程序的整体结构从微观上看,微机中各组成部分是如何通过程序联系起来。,汇编语言程序设计的要点:,41 汇编语言程序设计基础 42 MCS-51 单片机汇编语言程序设计,第四章 汇编语言程序设计,411 汇编语言与机器语言 412 汇编语言的格式 413 伪指令 414 汇编语言源程序的汇编 415 汇编语言程序设计的一般步骤,41 汇编语言程序设计基础,421 简单程序设计 422 分支程序设计 423 循环程序设计 424 查表程序设计 425 散转程序设 426 子程序设计 427 运算程
3、序设计,42 MCS-51 单片机汇编语言程序设计,机器语言 计算机唯一能够识别和执行的语言,面向机器,二进制。 汇编语言 “符号语言”,用指令助记符代表机器语言指令,面向机器。 要经过汇编。低级语言适合开发实时控制程序 高级语言 面向算法、过程、对象,类似自然语言,可移植性好,须经解释或翻译后才能被执行。,411 汇编语言与机器语言,412 汇编语言的格式,指令格式:,伪指令格式: 名字 定义符 参数,参数;注释或 标号:定义符 项表 ;注释,1 标号段标号段位于语句的开头,指明标号所在指令的首地址,标号又称为标号地址或符号地址,是一个可选项,只有需要时才设置。绝对不允许把指令的保留字、寄存
4、器号及伪指令字符作为语句的标号;标号在同一程序单位中只能出现一次。 2、 操作码段操作码段可以是可执行指令的助记符,操作码段用于指示计算机进行何种操作,因此,是任何一条语句中的必选项,汇编语言根据这一字段生成目标代码。操作码段也可以是伪指令的助记符,对汇编程序下命令,在汇编时起作用。,LOOP: MOV A,R0DJNZ R2,LOOP,3、操作数段 操作数段用于存放指令的操作数或操作数地址 , 操作数的个数因指令的不同而不同,通常有三种情况:无操作数 RET单操作数 JC LOOP双操作数 MOV A,B可以采用字母或数字等多种表示形式:(1) 操作数是立即数,可用二进制、十进制和十六进制形
5、式(2) 作寄存器和特殊功能寄存器名 MOV A,PSW(3) 标号地址 DJNZ R7,NEXT (4) 带加、减运算符的表达式 ,例:MOV A,#100-1 4、 注释段:注释指令或程序的含义,便于阅读程序、维护程序。 必须用“;”隔开,续行时,也必须以“;”开头 。,常数: 01010101B;12D,12;0F1H,59H 67Q;A,a 操作数: A,B,DPTR 表达式 mov A,#(12H-03H),414 汇编语言源程序的汇编,汇编可分成两种: 人工汇编机器汇编机器汇编是用机器自动把汇编语言源程序翻译成可以运行的目标代码程序,即二进制程序的过程,它是一种用机器来代替人脑的汇
6、编,完成这一汇编过程的软件称为“汇编程序”。,汇编,机器语言目标程序,汇编语言源程序,汇编程序,汇编,机器语言目标程序,汇编语言源程序,人工查指令机器码表,415 汇编语言程序设计的一般步骤,程序设计的方法 程序设计的步骤,程序设计的方法, 结构化设计 模块化设计 开发方法 自底向上开发 先底层开发 自顶向下开发 先顶层开发 混合方法,底,顶,程序设计的步骤,分析课题,确定算法和思路 根据算法和思路画出流程图 根据流程图编写程序 上机调试,排除错误,流程图图例,起止框处理框判断框连线,程序设计步骤流程图,413 伪指令,定义:仅向汇编程序发出的,并仅由汇编程序在汇编过程中识别和执行的一种汇编控
7、制命令,它本身在目标程序中不产生机器码。 汇编起始伪指令:ORG 汇编结束伪指令:END 定义字节伪指令:DB 定义字伪指令: DW 定义位伪指令: BIT 赋值伪指令: EQU DATA,汇编起始伪指令,格式: ORG 功能:指定汇编源程序编译成机器语言程序 的起始地址 例如: ORG 0000HLJMP 0100HORG 0100HStart: MOV A,#5AHSJMP $END,程序中可以有多条ORG语句,但定义的起始地址既不要交叉,也不要重叠。 必须从小地址向大地址分配程序或数据所占空间。,汇编结束伪指令,格式: END 起始地址 功能:停止汇编 示例:ORG 0000Hljmp
8、0100HORG 0100HStart: mov A,#5Ahsjmp $END,定义字节伪指令,格式: DB 功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表可以是一个字节、数或以引号括起来的字符串。ORG 1000H Dat: DB 11h,-1,A,BCDEND,该指令只能为程序存储器赋初值,不能为其他存储器赋初值,尤其不能为内部数据存储器赋初值。,注意:,1000H,11H,FFH,41H,42H,程序存储器,43H,44H,补码,ASCII码, ,定义字伪指令,格式: DW 功能:把项或项表的数值存入从标号开始的连续单元,其中项或项表是一个字(两字节)。ORG 1000H
9、 Dat: DW 1122h,3344h,-1END,1000H,11H,22H,33H,44H,程序存储器,只对程序存储器起作用,FFH,FFH,定义位伪指令,格式: BIT 功能:定义位变量地址U BIT 20H.0 V BIT 20H.1 W BIT 20H.2 X BIT P1.0 Y BIT P2.4 Z BIT P3.2 Q BIT TCON.2,赋值伪指令,格式: EQU 功能:定义符号变量值X EQU 05HY EQU 06HNEXT EQU 2000H 格式: DATA 功能:定义符号变量值(内部RAM)ONE DATA 30H (数据或地址)TWO DATA ONE+1,4
10、21 简单程序设计, 特点: 从第一条指令开始依次执行每一条指令,直到程序执行完毕,中间没有转移指令,没有分支。只有一个入口一个出口。,入口,出口,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位无符号二进制数占一个单元个位、十位和百位各占一个单
11、元,422 分支程序设计,用条件转移语句实现二分支 用cjne实现三分支 例4-6 多分支 用 jmp A+DPTR 实现多分支,根据不同的条件,执行不同的程序段。JZ、JNZ、JC、JNC、JB、JNB、CJNE 、DJNZ 正确合理地运用,用条件转移语句实现二分支,用cjne实现三分支,编程要点:cjne = 等于 不等于则:jc 大于 如何实现 ?,ORG 0000HCjne R3,#15,NEQsjmp L1 ;=15 NEQ: jnC L1 ;15sjmp L2 ;15L1: nop ;15L2:,y=,(R0)x,(R1)y,2、判正负,CJNE R0,#0,NZERO,CLR C
12、 MOV A,R0 SUBB A,#0 JZ ZERO,MOV A,R0 JZ ZERO,其它方法?,分析:,1、判零,MOV A,R0 JNB ACC.7, positive,CJNE R0,#7FH,DO1SJMP positive DO1: JC positive ;negative Positive:.0FFH80H negative00H7FH positive,用cjne实现三分支,cjne R0,#0,MP1mov R1,#0sjmp MP3 MP1:mov A,R0jnb ACC.7,MP2mov R1,#0FFhsjmp MP3 MP2:mov R1,#01h MP3:sjm
13、p $end,y=,(R0)x,(R1)y,判正负,判零,分支间 隔离,ORG 1000HONE DATA 30HTWO DATA 31HMAX DATA 32HCLR CMOV A ,ONE SUBB A ,TWO JZ XMAXJB ACC7 , NEGJB OV , YMAXSJMP XMAXNEG:JB OV , XMAX YMAX:MOV A ,TWOSJMP RMAX XMAX:MOV A , ONE RMAX:MOV MAX , A SJMP $ END,例46 ONE和TWO单元中的两个带符号数比较大小,将较大者存入MAX单元中。两数相等则任一个存入MAX即可。,若XY为负,则
14、OV=0,XY,若XY为正,则OV=0,XY OV=1,XY,用 jmp A+DPTR 实现多分支,KeyB5: mov DPTR,#JMPTBLclr Csubb A,#0Ahrl AJMP A+DPTR JMPTBL: ajmp AAAajmp BBBajmp CCCajmp DDD AAA: BBB: ,键入 10,转AAA11,转BBB12, 转CCC13, 转DDD,CCC: DDD: ,(A)=?,语句组1,语句组2,语句组3,语句组4,0AH,0BH,0CH,0DH,入口,AAA,BBB,CCC,DDD,423 循环程序设计,循环程序结构 循环程序通常有两种编制方法 循环问题的类
15、型 循环程序设计举例,循环程序结构,循环初始化: 循环控制变量的初始化、数据变量的初始化 循环工作部分:循环主体,重复执行的部分 循环控制部分:循环变量的修改、终止控制 循环结束:这部分程序用于存放执行循环程序所得结果以及恢复各单元的初值。,1、先循环处理后循环控制,称为直到型循环;,2、 先循环控制后循环处理,称为当型循环。,循环程序通常有两种编制方法,1、计数型 举例循环次数已知,用计数方法控制循环的终止。 2、条件型循环次数未知,根据某种条件判断是否终止循环。例47 内部RAM块传,遇到“#”字符结束3、计数型+条件型例48 8031外部RAM块传及冒泡排序 重点,循环问题的类型,单循环
16、程序 例1:多个单字节数求累加和 计数型 例2:内部数据区清零 计数型 例47 内部RAM块传 改为条件型没讲 多重循环程序 例3:50ms延时程序 计数型 例47 内部RAM块传 计数型+条件型没讲 例48 外部RAM块冒泡排序 重点 计数型+条件型没讲,循环程序设计举例,例1:多个单字节数求累加和,ORG 0000H SUM: mov R3,#0mov R4,#0mov R0,#50Hmov R2,#5 Loop: mov A,R4add A,R0mov R4,Ainc R0clr Aaddc A,R3,mov R3,Adjnz R2,Loopsjmp $END,累加和单元要先请零,例2:
17、内部数据区清零,ORG 0000H Zero: mov R0,#30Hmov R7,#10mov A,#00H Loop: mov R0,Ainc R0djnz R7,Loopsjmp $END,内部RAM,30H,R0,0,0,0,0,0,0,10个,例3:50ms延时程序,Delay: mov R7,#200 Del1: mov R6,#123nop Del2: djnz R6,Del2djnz R7,Del1sjmp $ ; (不计入),;1us ;1us ;1us ;2us ;2us,T =200(1+1+1232+2)+11us=50001us=50ms,例47把内部RAM中起始地址
18、为BLK1的数据块传送到外部RAM以BLK2为 起始地址的区域,直到遇到“#”字符的ASC码为止。去掉块长度。 参考程序如下:ORG 2000HBLK1 EQU 30H BLK2 EQU 1000HMOV SP,#6FH MOV R0 ,#BLK1 ;BLK1数据块起始地址MOV DPTR ,#BLK2 ;BLK2数据块起始地址XH: CLR CMOV A ,R0 ;取数据PUSH ACCSUBB A ,#23H ;判是否为“#”字符JZ STOPPOP ACCMOVX DPTR ,A ;数据传送INC R0INC DPTRAJMP XH ;循环控制STOP: SJMP $END,原题为 计数
19、型+条件型,改为条件型,例47把内部RAM中起始地址为BLK1的数据块传送到外部RAM以BLK2为 起始地址的区域,直到遇到“#”字符的ASC码为止。块长度在R1中。 参考程序如下:ORG 2000HBLK1 EQU 30H BLK2 EQU 1000H N EQU 100MOV SP,#6FH MOV R0 ,#BLK1 ;BLK1数据块起始地址MOV DPTR ,#BLK2 ;BLK2数据块起始地址MOV R1, #N ; 块长度INC R1SJMP CHECK ;防止数据块的长度为零 XH: CLR CMOV A ,R0 ;取数据PUSH ACCSUBB A ,#23H ;判是否为“#”
20、字符JZ STOPPOP ACCMOVX DPTR ,A ;数据传送INC R0INC DPTRCHECK : DJNZ R1,XH ;循环控制 计数STOP: SJMP $END,计数型+条件型,条件,改错,例48 设单片机8031外部RAM从3600H单元开始存放有100个无符号数,试编写程序能使它们按从小到大的顺序排列。(最小的数放在3600H单元) 解:排序程序采用“冒气泡”的方法,其“冒气泡”的过程如下:(设N=5时),8 5 4 2 9,5 4 2 8,4 2 5,2 4,第一轮 比较4次,第二轮 比较3次,第三轮 比较2次,第四轮 比较1次,9 8 5 4 2,8 9 5 4 2
21、,8 5 9 4 2,8 5 4 9 2,8 5 4 2,5 8 4 2,5 4 8 2,5 4 2,4 2,4 5 2,对 n 个数,则要进行n-1轮扫描, 在第 i 轮扫描中要进行 n-i 次比较。,可以 推知:,若将原始数据改为 9 8 2 4 5 ,则排序过程如下:,8 2 4 5 9,2 4 5 8,2 4 5,2 4,第一轮比较4次,第二轮比较3次,第三轮比较2次,第四轮 比较1次,9 8 2 4 5,8 9 2 4 5,8 2 9 4 5,8 2 4 9 5,8 2 4 5,2 8 4 5,2 4 8 5,2 4 5,2 4,2 4 5,可以看出:,第三轮排序中没有发生交换,即第
22、三轮结束后,已经排好了,应结束排序,不必再排第四轮。为此增加一个“排好序标志位”,预先将它清0,当产生交换时,将它置1,表示没排好,可以进行下一轮排序,否则,结束排序。,36H00H 01H 02H 03H 04H 05H 06H,P2,R0,R1,movx A,R0 mov 30h,A movx A,R1 movx R0,A xch A,30H movx R1,A,交换,用一个指针? 用一个R0? 用一个DPTR?,A,30H,冒泡法排序,ORG 0000hmov PSW,#00hmov P2,#36hmov R2,#100-1 Loop0:mov R0,#00hmov R1,#01hmov
23、 03h,R2clr 7Fh;排好序标志清0 Loop1:movx A,R0mov 30h,Amovx A,R1,cjne A,30h,Loop2sjmp L1 Loop2:JNC L1 ; 小到大,JC 大到小movx R0,Axch A,30hmovx R1,Asetb 7Fh;排好序标志置1 L1: inc R0inc R1djnz R3,Loop1; 轮内次数jnb 7Fh,Loop3;排好序标志 djnz R2,Loop0; 轮数 Loop3:sjmp $END,交换,426 子程序设计,子程序设计方法 子程序的调用过程与子程序嵌套 调用过程中的参数传递 通过寄存器传递 通过堆栈传递
24、 通过数据指针(DPTR)传递,子程序设计方法,格式: ;子程序名;子程序功能:;入口参数:;出口参数:;占用资源: 子程序名:.,子程序的调用过程与子程序嵌套,主程序要调用子程序时通过call 指令 子程序执行完后通过ret 指令返回 防止自然进入子程序和自然退出子程序子程序嵌套,通过寄存器传递,方法简单、参数有限 例:ORG 0000H Main: mov sp,#5FHmov R0,#40Hmov R7,#10Hlcall Zerosjmp $,;子程序名:Zero ;功能:对内部数据区清零 ;入口参数:R0内部数据区 ; R7内部数据区长度 ;出口参数:无 ;占用资源:A,R0,R7
25、Zero:clr A Loop:mov R0,Ainc R0djnz,R7,Loopret END,通过堆栈传递,ORG 0000H Main:MOV SP,#5FHmov 70H,#40hmov 71H,#10Hpush 70hpush 71hlcall Zerosjmp $,;子程序名:Zero ;功能:对内部数据区清零 ;入口参数:70内部数据区地址 ; 71h内部数据区长度 ;出口参数:无 ;占用资源:,R0,R7,70h,71h Zero:pop DPHpop DPLpop 07h;R7pop 00h;R0clr A Loop:mov R0,Ainc R0djnz,R7,Looppu
26、sh DPLpush DPHret END,63H,ZERO: MOV R0,SPDEC R0DEC R0MOV 07H,R0DEC R0MOV 01H,R0CLR A LOOP:MOV R1,AINC R1DJNZ,R7,LOOPRETEND,ORG 0000H Main:MOV SP,#5FHmov 70H,#40hmov 71H,#10Hpush 70hpush 71hlcall Zeropop accpop accsjmp $,方法2:,通过数据指针(DPTR)传递,将待传递参数紧跟在调用指令之后ORG 0000H Main:MOV SP,#6FHNOPACALL PRINTDB TH
27、IS IS ANDB EXAMPLEDB 0AH,0DH,00H NEXT: NOPSJMP $,PRINT:POP DPHPOP DPL PPP1:MOV A,#00HMOVC A,A+DPTRINC DPTRJZ PPPEND PPP2:MOV P1,ASJMP PPP1 PPPEND:JMP A+DPTREND,427 运算程序设计,多字节加、减、乘、除运算程序的设计 1多字节加减运算程序设计 例419 多字节无符号数求和例420 8位二进制带符号数加法例421 多字节减法子程序 例422 BCD数减法运算程序 2多字节乘除运算程序设计 例423 两个16位二进制无符号数相乘(连加)例4
28、24 16位二进制无符号数除法 例42 两个16位二进制带符号数相乘 例426 两位十进制数乘法程序设计 例427 两位十进制数除法程序设计 3. 讲解举例,查表程序1、 以PC为指针 2、以DPTR为指针,424 查表程序设计,425 散转程序设,散转程序 1、转移指令表 2、地址偏移量表 3、转向地址表,逻辑运算程序 ASCII码二进制 数据的拼装 与逻辑简单实例 多字节左移一位,讲解举例,算术运算程序 两个多字节数加法 多字节BCD码减法 多字节左移加乘法 多字节乘法,用MUL指令,两个多字节数加法,ORG 0000H JIA: MOV R0,#40HMOV R1,#50HMOV R2,
29、#4CLR C JIA1:MOV A,R1ADDC A,R0MOV R0,AINC R0INC R1 DJNZ R2,JIA1MOV F0,CSJMP $END,用三个指针怎么做?,ORG 1000HMOV R0,#40HMOV R1,#50HMOV R2,#4SETB RS0MOV R0,#60HCLR RS0CLR C LOOP: MOV A,R0ADDC A,R1INC R0INC R1,SETB RS0 MOV R0,A INC R0 CLR RS0 DJNZ R2,LOOP MOV F0,C SJMP $ END,+,0区R0,0区R1,1区R0,40H,50H,60H,例:24H
30、+ 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) HORG 0000H Jia: mov R0,#40hmov R1,#50hmov R2,#4clr C Jia1:mov A,#9Ahsubb A,R1add A,R0da A,CPL Cmov R0,A inc R0inc R1 djnz R2,Jia1mov F0,Csjmp $END,9AH-77H23H+66H89H CY=19AH66H133H +77HAA
31、H +66H10H CY=0,9AH55H45H +88HCDH +66H33H CY=09AH -44H56H +99HEFH+66H55H CY=0,9999999AH- 44556677H?,9A9AH,数据的拼装,x7x6x5x4x3x2x1x0 (20H) y7y6y5y4y3y2y1y0 (21H) y2y1y0x4x3x2x1x0 (30H)ORG 0000H START: MOV 30H,20HANL 30H,#00011111BMOV A,21HSWAP ARL AANL A,#11100000BORL 30H,ASJMP $END,ASCII码二进制,ORG 0000H A
32、toH: MOV A,#ACLR CSUBB A,#30HCJNE A,#0AH,NEQSJMP BIG NEQ: JC AEND BIG: SUBB A,#07H AEND:SJMP $END,ORG 0000H HtoA: MOV A,#0BHADD A,#90HDA AADDC A,#40HDA ASJMP $END,0BH+ 90H9BH+ 66H101H40H+ 142H,与逻辑简单实例,P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0,执行主程序的逻辑函数:F=P1.6 P1.4 P1.2 P1.2准备就绪信号,为“1”表示就绪 P1.4主回路工作正常
33、信号,为“1”表示正常 P1.6启动开关闭合信号,为“1”表示闭合 程序片段:WAIT: MOV A,P1 ;(P1)=XXXXXXXXBANL A,#54H; 01010100BCJNE A,#54H,WAIT;F=1?MAIN: ;主程序,多字节左移一位,B3L: CLR C LOOP: MOV A,R0RLC AMOV R0,AINC R0DJNZ R2,LOOPRETEND,ORG 2000HMAIN : MOV SP,#5FHMOV R0,#30HMOV R2,#3ACALL B3LSJMP $,两个多字节数左移加乘法,循环初值:1、乘法次数=左移次数=乘数的位数=(R3)*82、左
34、移字节数=乘数的字节数+被乘数的字节数=积的字节数(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 0000H MIAN: MOV R0,#45HMOV R1,#43HMOV R2,#3MOV R3,#2MOV A,R3ADD A,R2MOV R5,AMOV A,R1CL
35、R CSUBB A,R2MOV R6,AMOV R7,00HMOV A,#0MOV 00H,R6MOV 20H,R2 LOOP: MOV R0,A INC R0DJNZ 20H,LOOP,MOV B,R3MOV A,#8MUL ABMOV 21H,A GOON: MOV 22H,R5MOV R1,06HCLR CRLCP: MOV A,R1RLC AINC R1DJNZ 22H,RLCPMOV R1,06H JNC NEXTMOV 22H,R2 MOV R0,07HCLR C,ADDP: MOV A,R0ADDC A,R1MOV R1,AINC R0INC R1DJNZ 22H,ADDPJNC
36、 NEXTMOV A,R1ADDC A,#0MOV R1,AJNC NEXTINC R1MOV A,R1ADDC A,#0MOV R1,A NEXT: DJNZ 21H,GOONSJMP $END,用MUL指令做多字节乘法,例: 3344H*56H=?,ORG 3000H MOV A,#44H MOB B,#56H MUL AB MOV 30H,A ;(A)=4456L=(30H) MOV 31H,B ;(B)=4456H=(31H) MOV A,#33H MOV B,#56H MUL AB ;(A)=3356L ADD A,31H ;4456H+3356L=(31H) MOV 31H,A C
37、LR A ADDC A,B ;(B)=3356H+CY MOV 32H ,A SJMP $ 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值
38、由下式确定: PC当前值+data=数据表头地址 实际上data值等于查表指令和数据表格之间的字节数; 3)用指令MOVC A , A+PC完成查表 由于PC指针只能在A中提供的偏移地址的范围内查表,故,查表范围进在一页内。,查表程序设计,PC,ASCTAB +0,0 1 2 3,ASCTAB +2,PC当前值,3B,PC当前值+3=,PC当前值+3+2=,表头,(A),补偿值=表头地址-PC当前值,表中偏移量,MOV A,#2ADD A ,# 03H;计算偏移量MOVC A ,A+PC ;查表MOV R0 , A;存结果SIMP $ ASCTAB: DB 0,1,2,3,ORG 0100HM
39、OV A ,R0;取转换值ANL A ,# 0FH;屏蔽高四位ADD A ,# 03H;计算偏移量MOVC A ,A+PC ;查表MOV R0 , A;存结果SIMP $ ASCTAB: DB 0,1,2,3DB 4,5,6,7DB 8,9,A,BDB C,D,E,FEND,ASCTAB,1B 2B,PC当前值,3B,以PC为指针查表程序,TB1:mov A,R2add A,R2mov R3,Aadd A,#07Hmovc A,A+PCxch A,R3add A,#03H+1movc A,A+PCmov R4,Asjmp $,TAB1:DW 1520H,7586HDW 2345H, 1000H
40、DW 883H,9943H DW 4051H,6785H DW 4468H,5871HEND,TAB1,1B 2B 1B 1B 2B,以DPTR为指针查表程序,LTB2: mov DPTR,#TAB2mov A,R3clr Crlc Amov R3,Axch A,R2rlc Axch R2,Aadd A,DPLmov DPL,Amov A,DPHaddc A,R2mov DPH,A,clr Amovc A,A+DPTRmov R2,Aclr Ainc DPTRmovc A,A+DPTRmov R3,Aret TAB2: DW END,使用转移指令表的散转程序,ORG 0000Hmov R2,#
41、2 Main:mov DPTR,#TAJ1mov A,R2add A,R2jnc NADDinc DPH NADD:jmp A+DPTR TBJ1:ajmp PRG0ajmp PRG1 ajmp PRG2ajmp PRG3sjmp $,PRG0:mov A,#0sjmp Halt PRG1:mov A,#1sjmp Halt PRG2:mov A,#2sjmp Halt PRG3:mov A,#3 Halt: sjmp $END,使用地址偏移量表的散转程序,JMP3: mov R2,#2mov DPTR,#TBJ3movc A,A+DPTRjmp A+DPTR TBJ3: DB PRG0-TB
42、J3DB PRG1-TBJ3DB PRG2-TBJ3DB PRG3-TBJ3DB PRG4-TBJ3DB PRG5-TBJ3,PRG0:mov R0,#0sjmp Halt PRG1:mov R0,#1sjmp Halt PRG2:mov R0,#2sjmp Halt PRG3:mov R0,#3sjmp Halt PRG4:mov R0,#4sjmp Halt PRG5:mov R0,#5 Halt: sjmp $END,使用转向地址表的散转程序,JMP4: mov R2,#1mov DPTR,#TBL4mov A,R2add A,R2jnc NADDinc DPH NADD:mov R3,
43、Amovc A,A+DPTRxch A,R3inc Amovc A,A+DPTRmov DPL,Amov DPH,R3,clr Ajmp A+DPTR TBL4:DW PRG0DW PRG1DW PRG2DW PRG3 PRG0:mov R0,#0sjmp Halt PRG1:mov R0,#1sjmp Halt PRG2:mov R0,#2sjmp Halt PRG3:mov R0,#3 Halt: 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、教科书中运算程序讲点,