资源预览内容
第1页 / 共39页
第2页 / 共39页
第3页 / 共39页
第4页 / 共39页
第5页 / 共39页
第6页 / 共39页
第7页 / 共39页
第8页 / 共39页
第9页 / 共39页
第10页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第九课,复习,4.3.3 查表程序设计,4.3 汇编语言实用程序设计,4.3.8 循环程序设计,4.3.7 分支转移程序设计,复习,一个源程序的四个要素 子程序:形式、功能、入口参数、出口参数 子程序的调用:调用过程示意图 子程序调用及返回指令的执行过程 子程序的现场保护和参数传递 查表程序,一个完整的源程序必备的四个要素:,有ORG 0000H,即源程序的机器码从ROM的0000H单元开始存放。 通常源程序的存放要跳过中断向量区。实现方法:在0000H单元存放一条转移指令,转向中断向量区后的主程序的真实的入口地址,如START、MAIN等。 有END,告知汇编程序,你的源程序结束了。 源程序的主程序框架一定是一个顺序执行的无限循环的程序,运行过程必须构成一个圈;子程序与主程序相对独立。,4.3 汇编语言实用程序设计,MOV 30H, #20 MOV 40H, #50H CLR A LCALL ABC 按照规则包装成.ASM,ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV 30H, #20 MOV 40H, #50H CLR A LCALL ABC SJMP $ ABC: MOV R3, #30H;?30H MOV R1, #40H;?40H CLR A L1: MOV R1,A INC R1 DJNZ R3, L1 RET END,4.3 汇编语言实用程序设计,LENG EQU 10 SUM EQU 21H BLOCK EQU 22H ORG 0000 LJMP START ORG 0030H START: CLR A MOV R7, #LENG MOV R0, #BLOCK LOOP: ADD A, R0 INC R0 DJNZ R7, LOOP MOV SUM, A END,复习EQU,功能?,有错吗?,包装成子程序?,SJMP $ END,LENG EQU 10 SUM EQU 21H BLOCK EQU 22H ORG 0000 LJMP START ORG 0030H START: CLR A MOV R7, # LENG MOV R0, #BLOCK LCALL LOOP SJMP $ LOOP: ADD A, R0 INC R0 DJNZ R7, LOOP MOV SUM, A RET END,首先是用DB、DW伪指令建表,把握表格中的数据的位置与x的关系。由x来表达y在程序存储器中的地址,然后用MOVC指令实现查表。例如:求x平方时的表格结构。 DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H 举例:自编例1、例2、例3及课本上的例4-5、例4-6、例4-7。,4.3.3 查表程序设计,4.3 汇编语言实用程序设计,数据补偿、修正、计算、转换等各种功能,具有程序简单、执行速度快等优点。,查表就是根据自变量x,在表格中寻找y,使y=f(x)。,指令“MOVC A,A+DPTR”完成把A中的内容作为一个无符号数与DPTR中的内容相加,所得结果为某一程序存储单元的地址,然后把该地址单元中的内容送到累加器A中。 指令“MOVC A,A+PC”以PC作为基址寄存器,PC的内容和A的内容作为无符号数,相加后所得的数作为某一程序存储单元的地址,然后把该地址单元中的内容送到累加器A中。,4.3 汇编语言实用程序设计-查表程序设计,指令系统中给用户提供了两条极为有用的查表指令: MOVC A,A+DPTR MOVC A,A+PC 执行查表指令时,发出读程序存储器选通脉冲/PSEN。,例4-5 子程序的功能为:根据累加器A中的数x(09之间)查x的平方表y,根据x的值查出相应的平方y。x和y均为单字节数。 地 址 子程序 Y ADD A,#01H Y+2 MOVC A,A+PC Y+3 RET Y+4 DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H 第1条指令 ADD A,#01H 的作用是加上偏移量,可以根据A的内容查出X对应的平方。,MOVC A,A+PC的学习,4.3 汇编语言实用程序设计-查表程序设计,TAB1: DB 00H,01H,04H,09H,10H DB 19H,24H,31H,40H,51H,例1:求x的平方,x:09 特点:x、y均为一字节, y=f(x)在ROM中的地址是TAB1+x,ABC: MOV A, R0 PUSH DPH ;保存DPH PUSH DPL ;保存DPL MOV DPTR,#TAB1 MOVC A,A+DPTR POP DPL ;恢复DPL POP DPH ;恢复DPH RET,ABC: MOV A, R0 MOV DPTR,#TAB1 MOVC A,A+DPTR RET,堆栈指令的使用,4.3 汇编语言实用程序设计-查表程序设计,例2:求一个09的数是立方 特点:x为一字节、y为两字节, y=f(x)在ROM中的地址 是TAB1+2x及TAB1+2x+1 入口参数:在R0中; 出口参数:在R2、R1中,高字节在R2中,ABC: MOV A , R0 RL A MOV B, A MOVDPTR, #TAB MOVCA, A+DPTR MOV R2, A MOV A, B INC A MOVCA, A+DPTR MOV R1, A RET TAB: DW 0, 1, 8, 27, 64 DW 125, 216, 343, 512, 729,4.3 汇编语言实用程序设计-查表程序设计,例4-6,例4-6 在一个以MCS-51为核心的温度控制器中,温度传感器输出的电压与温度为非线性关系,传感器输出的电压已由A/D转换为10位二进制数x。根据测得的不同温度下的电压值数据构成一个表,表中放温度值y,x为电压值数据。设测得的电压值x放入R2R3中,根据电压值x,查找对应的温度值y,仍放入R2R3中。,特点:本例的x和y均为双字节无符号数。 y=f(x)在ROM中的地址 是TAB2+2x及TAB2+2x+1 入口参数:在R2R3 中; 出口参数:在R2R3 中; *学习双字节无符号数乘2的解决方法。 读P81 例4-6,4.3 汇编语言实用程序设计-查表程序设计,例4-7,例4-7 设有一个巡回检测报警装置,需对16路输入进行检测,每路有一最大允许值,为双字节数。运行时,需根据测量的路数,找出每路的最大允许值。看输入值是否大于最大允许值,如大于就报警。根据上述要求,编一个查表程序。 取路数为x(015),y为最大允许值,事先存放在表格中。,特点:x为单字节、 y均为双字节无符号数。 y=f(x)在ROM中的地址是TAB3+2x及TAB3+2x+1 入口参数:在R2 中; 出口参数:在R3R4 中; *又一种单字节无符号数乘2的解决方法。 用MOVC A,A+PC,偏移量的求法。 读P81 例4-7 问题:出口参数R3R4中哪个是高字节?,4.3 汇编语言实用程序设计-查表程序设计,子程序与查表的综合举例,例3 编写程序,实现 。设a,b,c分别存于内部RAM的30H,31H,32H三个单元中。程序段如下: START:MOV A,30H ;取a ACALL SQR ;调用查平方表 MOV R1,A ;a2 暂存于R1中 MOV A,31H ;取b ACALL SQR ;调用查平方表 ADD A,R1 ;a2+b2 存于A中 MOV 32H,A ;存结果 SJMP $ SQR :MOV DPTR,#TAB ;子程序 MOVC A,A+DPTR ; RET TAB :DB 0,1,4,9,16 ,25,36,49,64,81,4.3 汇编语言实用程序设计-查表程序设计,思考题,求 x平方,x在R0中,取值范围在515,ABC: MOV A, R0 MOV DPTR,#TAB1 MOVC A,A+DPTR RET TAB1: DB 25, 36, 49, 64,81 DB 100,121,169,196,225,ABC: MOV A, R0 CLR C SUBB A, #5 MOV DPTR,#TAB1 MOVC A,A+DPTR RET TAB1: DB 25, 36, 49, 64,81 DB 100,121,169,196,225,4.3 汇编语言实用程序设计-查表程序设计,特点是程序中含有转移指令。 转移指令有分为无条件转移和有条件转移。 有条件分支转移程序按结构类型来分,又分为单分支转移结构和多分支转移结构。,4.3.7 分支转移程序设计,1单分支转移结构 程序的判别部分仅有两个出口,两者选一。,2多分支转移结构 程序的判别部分有两个以上的出口流向。,4.3 汇编语言实用程序设计-分支转移程序设计,4.3 汇编语言实用程序设计-分支转移程序设计,4.3 汇编语言实用程序设计-分支转移程序设计,4.3 汇编语言实用程序设计-分支转移程序设计,有条件转移指令通常可以完成单分支转移 下列两种转移指令可以完成多分支转移 间接转移指令: JMP A+DPTR; 比较转移指令: CJNE A,direct,rel; CJNE A,#data,rel; CJNE Rn,#data,rel; CJNE Ri,#data,rel;,4.3 汇编语言实用程序设计-分支转移程序设计,例4两个无符号数比较,例4-13 散转,例4-12 求符号函数的值。,例5 :求50H单元后30个数的累加和,例4-16 测试字符串长度的程序。,例4-17 50ms延时程序,练习:写一个延时10ms的子程序。(钟频12MHz ),(2)分支程序设计,例4两个无符号数比较,内部RAM的40H单元和41H单元各存放了一个8位无符号数, 请比较这两个数的大小,比较结果通过单片机对LED的控制显示出来。即:,若(40H)(41H),则P1.0管脚连接的LED发光; 若(40H)(41H),则P1.1管脚连接的LED发光。,4.3 汇编语言实用程序设计-分支转移程序设计,N,开始,(40H)-(41H),CY0?,(40H)(41H) P1.0灯亮,(40H)(41H) P1.1灯亮,结束,图 两个无符号数比较流程图,流程图,4.3 汇编语言实用程序设计-分支转移程序设计,ORG 1000H CLR C ;清CY为零 MOV A,40H ;取第一个数送A SUBB A,41H ;两数比较 JNC LED0 ;CY=0,转至LED0 CLR P1.1 ;CY=1,(40H)(41H),点亮P1.1 LED LED0: CLR P1.0 ;CY=0,40H(41H),点亮P1.0 LED FINISH: RET,方法1:使用SUBB指令,依据借位CY状态判断两个数的大小!,4.3 汇编语言实用程序设计-分支转移程序设计,SJMP FINISH ;跳转到结束,ORG 0000H MOV A,40H ;取40H单元数据送A CJNE A,41H,COMP ;两数比较 COPM: JNC LED0 ;相等后的判别 CLR P1.1 ;CY=1,(40)(41H) ;点亮P1.1;连接的LED SJMP FINISH ;跳转到结束 LED0: CLR P1.0 ;CY=0,40H(41H), ;点亮P1.0连接的LED FINISH: SJMP $ END,方法2:使用CJNE指令比较,借位
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号