80c51汇编语言程序设计.pptx
文本预览下载声明
第四章 80C51汇编语言程序设计;教学目的;4.1 汇编语言程序设计的步骤与基本结构;程序的基本结构;4.2 汇编语言程序程序设计;例4.1 将20H中存放的压缩BCD数转换成二进制数存放在累加器A中。;例4.2 设两个16位无符号数,分别存放在30H、31H单元和32H、33H单元,求它们的和,结果保存在34H和35H单元中。默认为(低字节和高字节);例4.3 将内部RAM30H单元的高4位和31H单元的低4位拼成一个数,存入32H单元。;例4.4 计算Y=X1+X2-X3X1=38H ,X2=2AH , X3=19H ,Y=BUF;4.2.2 分支程序设计;例4.5 设变量X存放于VAR单元,函数值Y??放在FUNC单元。试按照下式的要求给Y赋值。;ORG 8000H
CLR C
MOV A ,40H
CJNE A ,41H , COMP
SJMP DONE
COMP:
JNC DONE
MOV A ,41H
DONE:
MOV 42H ,A
SJMP $
END;例4.7从内部RAM 22h单元开始存有一个无符号数数据块,长度n存于21h中。求出数据块中的最小数,存于20h中。;编程如下:;ORG 4000H
START:
MOV A ,30H
JZ LP2
JB ACC.7 ,LP1
MOV 31H ,#01H
RET
LP1:
MOV 31H ,#0FFH
RET
LP2:
MOV 31H ,#00H
RET; JMP @A+DPTR
;(PC)← (A)+(DPTR)
若DPTR值固定,改变A的内容,即可形成多个分枝。;散转程序设计;ORG 0030H
JUMP1:
MOV DPTR , #TAB
CLR A
MOV A , R7
ADD A , R7
AJMP @A+DPTR
ORG 0100H
TAB:
AJMP Prog0
AJMP Prog1
AJMP Prog2
……;MOV DPTR ,#KEY
MOV A ,50H
RL A
ADD A ,50H
JMP @A+DPTR
KEY :
LJMP KEY0
LJMP KEY1
......
LJMP KEYn;FRT: MOV A ,40H ;取行李重量G放在40H
MOV R3 ,A
MOV B ,#03H ;M=G×3
MUL AB
MOV R2 ,A ;暂存3 × G在R2
MOV A ,R3 ;取回G
CJNE A ,#06H ,L1 ;G≤5 ?
L1:JC WETC ;是,转至WETC
SUBB A ,#05H ;否则M=3G+2(G-5)
RLC A
ADD A ,R2
MOV R2 , A
WETC:MOV 41H ,A ;最后结果M存41H
END;4.2.3 循环程序设计;图4.2 循环程序结构流程图;例4.12 在外部RAM 2000H单元开始存放有20个无符号数,找出其最大值,把它放在内部RAM30H单元中。;例4.13 编写无符号数排序程序。假设在片内RAM中,起始地址为40H的10个单元中存放有10个无符号数。试进行升序排序。;图4.3 冒泡法排序程序流程图;程序如下:;;续前;例4.8 编写50ms软件延时程序。;例4.14 一组10个数存放在片内RAM 50H开始的连续单元,求和,高字节放R3,低字节放R4中。;源程序:;解释:;4.2.4 查表程序;例4.15 计算X2,设X为小于10的非负整数,存放在内部RAM 20H单元中,结果保存在内部RAM 21H单元中。;例4.16 利用查表法求函数值Y=3X2,X=0~9。设X存放在30H单元中,Y存放在31H单元中。;4.9.6 子程序;80C51单片机指令系统提供了两条子程序调用指令:
ACALL addr11 和 LCALL addr16
指令中的地址为子程序的入口地址,在实际的程序中通常用标号来代表。
在主程序调用子程序时,只需执行调用指令,单片机即可先将当前的PC值压入堆栈,然后将PC值修改为指令中标号所代表的地址,从而实现了子程序的调用。
子程序中应该有返回指令RET或RETI,以确保子程序能够正确返回。执行RET指令时单片机将原来存在堆栈中的断点送回PC,保证了子程序返回主程序中调用的地方继续执行。
由此可见,子程序从子程序标号开始,到RET或RETI指令结束。;现场保护与恢复
调用子程序后,CPU处理权转到了子程序,在转子程序前,CPU有关寄存器和内存有关单元是主程序的现场,若这个现场信息还有用处,那么在调用子程序前要设法保护这个现场。恢复现场是保护现场的逆操作。当用堆栈保护现场时,还应注意恢复现
显示全部