180 likes | 357 Views
第四章 汇编语言程序设计 一 . 汇编语言的结构: LOOP : ADD A , 30H ;( A ) + ( 30H )送 A 标号 操作码 操作数 注释 二. 常用伪指令: 伪指令是供汇编程序用的,不产生目标代码,不使 CPU 产生一定动作。 1 . ORG nnH 起点指令 规定该指令后的程序或数据块的起始地址,例 ORG 8100H. 2 . DB 定义字节 例: ORG 2100H
E N D
第四章 汇编语言程序设计 一.汇编语言的结构: LOOP:ADD A, 30H ;(A)+(30H)送 A 标号 操作码 操作数 注释 二. 常用伪指令: 伪指令是供汇编程序用的,不产生目标代码,不使CPU产生一定动作。 1.ORG nnH起点指令 规定该指令后的程序或数据块的起始地址,例 ORG 8100H
2.DB定义字节 例: ORG 2100H FIRST:DB 01,02,03,15,78 其中ORG指定以下数据块从2100H开始存放(FIRST), DB指定2100H开始的单元存放01,02,03,15,78 3.DW定义十六位数据 例 ORG 8000H DW 7603H,7589H 则: (8000H)=76H (8001H)=03H (8002H)=75H (8003H)=89H
4.DS定义若干空单元 例: ORG 5000H DS 07H MOV A,#7AH ADD A, #22H ……….. 从5000H开使予留七个空单元以备后用,MOV A,#7AH指令从5007H开始存放。 5.EQU等值,取代的意思。一般用于为标号赋值。 例: AA EQU BB 则该指令后所有AA与BB等价。 LOOP: EQU 8300H LOOP标号的地址为8300H 6. END汇编语言程序结束标志。
三.程序设计的一般步骤: 1.弄请问题的性质,目的,已知数据,运算精度,速度,找出相应的数学模型或逻辑模型与之对应。 2.确定算法:把实际问题化成计算机求解的步骤和方法。 3.画流程图:将程序的流程用一系列图形和符号的形式表示出来,称程序框图。 流程图画法常用符号: ①椭圆框 用于表示程序的开始和结束。 开 始
②矩形框 工作框,用于说明一段程序的功能。 框内简明扼要地说明该程序段功能。 ③菱形框 判断框(逻辑框) 用于进行判断,规定程序转向。 ④圆形框 结合子,两处程序连接符号。 4.编写源程序并汇编。 5.上机调试并修改。 移入高四位 为0? A = B?
四.程序设计举例 1.直接程序(顺序程序) 例1 数据拼装 要求将20H单元低5位送入30H单元低5位 21H单元低3位送入30H单元高3位 MOV 30H,20H ; 取20H单元的数 ANL 30H,#00011111B ;切取低5位 MOV A, 21H ; 取21H单元的数 SWAP A ; 低4位移入高4位 CLR C RLC A ;原21H低3位移入高3位 ANL A,#11100000B ;切取高3位 ORL 30H ,A ;拼凑字节
例2 将7CH中的`两位BCD码拆开,高位送R6,低位送R5 MOV R1 ,#7CH 7CH MOV A,#0 XCHD A,@R1 R6 R5 MOV R5 ,A MOV A, 7CH SWAP A MOV R6, A 5 6 0 5 0 6
例3 查表程序:例如用热敏电阻温度计测量0~80°C的温度,热敏电阻的输出与温度的对应关系为: t°C 0 10 20 30 40 50 60 70 80 输出mv 0 1 2 3 4 5 6 7 8 将测温得到的输出mv级信号通过A/D转换成为数字量接入计算机,计算机采样存入片内RAM 20H单元,然后査表得到所测温度值存入21H单元,查表程序如下:
ORG 8000H TEM: PUSH DPH PUSH DPL MOV DPTR , #TABEL MOV A, 20H ;测温所得输出mv级信号的数 字量送入A MOVC A, @ A+DPTR MOV 21H, A ;查表所得对应温度值送入21H单元 POP DPL POP DPH RET
TABEL: EQU 8100H TABEL: DB 0 ;0mv DB 10 ;1mv DB 20 ;2mv DB 30 ;3mv DB 40 ;4mv DB 50 ;5mv DB 60 ;6mv DB 70 ;7mv DB 80 ;8mv
2.分支程序 例1 从30H和31H两个无符号数中找出较小者送入32H单元。 CLR C MOV R0 ,#30H ; (R0)指向1数 MOV A, @R0 ; 取1数送A INC R0 ; (R0)指向2数 SUBB A, @R0 ; 1数减2数 JNC STORE ; C=0,则1数≥2数C=1则2数大 DEC R0 ; 修改(R0),使其指向较小数 STORE: MOV 32H ,@R0 ;存较小数 SJMP $
例2 从30H-3FH中找出非零字节送往40H单元开始排放,所送非 零字节个数存入R3 MOV R0, #30H ;(R0)指向源数据单元 MOV R1, #40H ;(R1)指向非零字节存储区首址 MOV R2 , #10H ; R2计数16个单元 MOV R3 , #0 ; R3非零字节个数计数单元清零 SF: MOV A , @R0 JZ SFZ ;为零跳下 MOV @R1, A ;送非零字节 INC R3 ;非零字节个数计数 INC R1 ;修改非零字节存储区指针 SFZ: INC R0 ;修改源数据区指针 DJNZ R2, SF ;查完了吗? END
3.循环程序: 例1 对数据区的30H单元开始清零64个单元 MOV R0, #30H MOV R7, #64 MOV A, #0 LOOP: MOV @R0, A INC R0 DJNZ R7 ,LOOP
例2 计算一串8位二进制无符号数之和,假定数串长度50个,排放在30H单元开始的RAM中,并假定累加和不大于8位二进制数。 MOV R0, #30H MOV R1, #50 MOV A, #0 LOOP: ADD A, @R0 INC R0 DJNZ R1, LOOP STOP: MOV 65H, A
例3 软件延时——多重循环 ※时序的概念 一条指令可分解成若干微操作,而这些微操作所对应的脉冲信号在时间上有严格的先后次序,这种次序就是计算机的时序。 计算机时序的基本概念: ①振荡周期:为单片机提供定时信号的振荡源周期。P3页图是常用 的振荡电路,它用外接晶振作为定时单元, 晶振频率f在1.2MHZ~12MHZ之间。 1振荡周期=1/f ②状态周期: 1状态周期=2×振荡周期 常又把一个状态周期分为两个状态, 称P1状态,P2状态。
③机器周期: 1机器周期=12×振荡周期=12/f 可用机器周期把一条指令划分成若干阶段,每个机器周期完成 某些规定动作 ④指令周期:指完成一条指令所需的全部时间。各条指令不等。 以6MHZ晶振为例: 1振荡周期=1/6M=1/6μs 1状态周期=2×振荡周期=1/3μs 1机器周期=12/f= 2μs 1指令周期=2~8μs 执行每条指令需要的机器周期数可在指令表中查到。 延时程序就是计算机重复执行一些指令,累积的时间就是软件延时的时间。
例: 每条指令执行 执行 总机器 机器周期数T 次数 周期数 D15MS:MOV R5, #N 1 1 1 DD1: MOV R7, #M 1 N N DD2: NOP 1 MN MN NOP 1 MN MN NOP 1 MN MN DJNZ R7,DD2 2 MN 2MN DJNZ R5,DD1 2 N 2N RET 2 1 2 执行该程序所需总机器周期数为: 5MN+3N+3
忽略3机器周期,令该延时程序延时时间等于15ms,忽略3机器周期,令该延时程序延时时间等于15ms, 以6MHZ为例,T=2μs 则:(5MN+3N)×2×10-6=15×10-3 取 M=100 则:当N=14 ,延时时间为14.084ms 当 N=15 , 延时时间为15.09ms