实验四 子程序设计实验
实验四子程序设计实验
专业班级光信息科学与技术姓名刘欣学号 012005025116
联系方式 134********
一、任务要求
1. 调试程序dmove.asm,观察片外数据区7000H、A000H开始的单元内容变化规律。
2. 修改程序将7010H-7073H单元内容传送至B000H开始的存储区中。
3. 设计一个子程序,统计片外数据区从2000H开始的256个符号数中偶
数的个数,低位存入R3,高位存入R2。
二、设计思路
内容一:
1. 调试程序dmove.asm,观察片外数据区7000H、A000H开始的单元内容变
化规律。
2.将7010H-7073H单元内容传送至B000H开始的存储区中。修改程序,未
修改过的“dmove.asm”程序的思路是,设置循环,依次赋值,所以只需要修
改相应的地址就可以了,需要注意的是,要求的是有结束的地址7073H,所以:
CJNE R3, #74H, DMVE1(跳转)来判断是否到达结束地址。
内容二:
1. 统计片外数据区从2000H开始的256个符号数中偶数的个数。
2. 采用循环,从2000H开始,判断JB ACC.0 ,NCOUNTDUB (跳转),则可以说
明是奇偶数。
三、资源分配
1.调试程序
在该程序中R0作为计数器,DPTR为片外数据指针R2,R3分别为源地址R4,R5为
目的地址,R6,R7 为传送字节数.
2.修改程序
在该程序中R0作为计数器,DPTR为片外数据指针, R2, R3 作为源地址 R4,R5
是目的地址;R6作为传送字节数.
3.子程序
该程序中R0设为循环计数器 ;R1 作为写入片外RAM的符号数;DPTR 为数据指针;R2 设为统计结果高八位;R3 设为统计结果低八位.
四、流程图
五、源代码(含文件头说明、资源使用说明、语句行注释)
1.调试程序
Resource used: R0: 计数器
; DPTR: 片外数据指针
; R2, R3 源地址
;R4, R5 目的地址
;R6, R7 传送字节数
ORG 0090H
START: ;初始化7000H开始的片外RAM空间
MOV R0, #00H ;设循环计数器
MOV DPTR, #7000H ;设数据指针
MOV R1, #00H
LOOP1:
MOV A, R1
MOVX @DPTR, A ;传送到片外RAM
INC DPTR ;修改数据指针
INC R0 ;修改循环计数器
INC R1
CJNE R0, #00H, LOOP1 ;判断是否结束
;给R2,R3,R4,R5,R6,R7赋初值
MOV R2, #70H
MOV R3, #00H
MOV R6, #01H
MOV R7, #00H
MOV R4, #0A0H
MOV R5, #00H
;数据串传送
DMVE: MOV SP, #70H ;设栈底
MOV DPL, R3
MOV DPH, R2
MOVX A, @DPTR ;取一个字节
MOV DPL, R5
MOV DPH, R4
MOVX @DPTR, A ;传送一个字节
CJNE R3, #0FFH, DMVE1
INC R2 ;源地址加1 DMVE1: INC R3
CJNE R5, #0FFH, DMVE2
INC R4 ;目的地址加1 DMVE2: INC R5
CJNE R7, #00H, DMVE3
CJNE R6, #00H, DMVE4 ;数据传送结束?
SJMP $ ;原地踏步
DMVE3: DEC R7 ;字节数减1 SJMP DMVE
DMVE4: DEC R7
DEC R6
SJMP DMVE
2.修改后的程序
Resource used: R0: 计数器
;DPTR: 片外数据指针
; R2, R3 源地址
; R4, R5 目的地址
;R6, 传送字节数
ORG 0090H
START: ;初始化7000H开始的片外RAM空间
MOV R0, #00H ;设循环计数器
MOV DPTR, #7010H ;设数据指针
MOV R1, #00H
LOOP1:
MOV A, R1
MOVX @DPTR, A ;传送到片外RAM
INC DPTR ;修改数据指针
INC R0 ;修改循环计数器
INC R1
CJNE R0, #63H, LOOP1 ;判断是否结束
;给R2,R3,R4,R5,R6,赋初值
MOV R2, #70H
MOV R3, #10H
MOV R6, #63H
MOV R4, #0B0H
MOV R5, #00H
;数据串传送
DMVE: MOV SP, #70H ;设栈底
MOV DPL, R3
MOV DPH, R2
MOVX A, @DPTR ;取一个字节
MOV DPL, R5
MOV DPH, R4
MOVX @DPTR, A ;传送一个字节
CJNE R3, #073H, DMVE1
INC R2 ;源地址加1
DMVE1: INC R3
CJNE R5, #063H, DMVE2
INC R4 ;目的地址加1 DMVE2: INC R5
CJNE R6, #00H, DMVE3 ;数据传送结束?
SJMP $ ;原地踏步
DMVE3: DEC R6 ;字节数减1
SJMP DMVE
END
4.子程序
RESOURCE USED;R0 设循环计数器
;DPTR 数据指针
;R2 统计结果高八位
;R3 统计结果低八位
;R1 写入片外RAM的符号数
ORG 0090H
START: ;初始化7000H开始的片外RAM空间
MOV R0, #00H ;设循环计数器
MOV DPTR, #2000H ;设数据指针
MOV R2, #00H
MOV R3,#00H
MOV R1,#02H;
LOOP1:
MOV A, R1
MOVX @DPTR, A ;传送到片外RAM
INC DPTR ;修改数据指针 INC R0 ;修改循环计数器 ;INC R1
CJNE R0, #00H, LOOP1 ;判断是否结束
MOV DPTR,#2000H
MOV R0,#00H
LP: MOVX A,@DPTR
INC R0
INC DPTR;
CJNE R0,#00H,LP1;
JB ACC.0,LP2;
INC R3
CJNE R3,#00H,LP2;
INC R2;
LP2: SJMP $ ;RET
LP1: JB ACC.0 , LP;
INC R3
CJNE R3,#00H,LP;
INC R2;
CJNE R0,#00H,LP;
RET
六、程序测试方法与结果、软件性能分析
内容一:结果正确。修改如上所述,直接运行,停止后可以得到5 4 3 2 1从大到小排序,R5=3,R4=3.正确。
内容二:结果正确。设置从2000H开始的256个符号数,然后运行程序,可以得到偶数个数的低位存入了R3,高位存入了R2。
七思考题
1.从2000H单元开始的外部RAM中存有100个数,要求把它传送到自2500H
单元开始的存贮区中去,但在传递过程中要检查数的值,遇到第一个
零就停止传送。应如何编写程序?
答:Resource used:
;DPTR: 片外数据指针
; R2, R3 源地址
; R4, R5 目的地址
;R6, 传送字节数
ORG 0090H
START:
;给R2,R3,R4,R5,R6,赋初值
MOV R2, #20H
MOV R3, #00H
MOV R6, #64H
MOV R4, #25H
MOV R5, #00H
;数据串传送
DMVE: MOV SP, #70H ;设栈底
MOV DPL, R3
MOV DPH, R2
MOVX A, @DPTR ;取一个字节
MOV DPL, R5
MOV DPH, R4
MOVX @DPTR, A ;传送一个字节
CJNE R3, #064H, DMVE1;源地址加1
INC R2
MOV R3,#00H
DMVE1: INC R3
JNZ LP;
SJMP $;
LP : CJNE R5, #064H, DMVE2
INC R4 ;目的地址加1
MOV R5,#00H;
DMVE2: INC R5
CJNE R6, #00H, DMVE3 ;数据传送结束?
SJMP $ ;原地踏步
DMVE3: DEC R6 ;字节数减1 SJMP DMVE
END
八、选做题
程序代码:
ORG 1000H
MOV DPTR ,#2000H
START: MOVX A,@DPTR
MOV R2,23H
MOV R0,#00H
MOV 10H,A ;地址数里面的数放在10H
MOVX A,@DPTR
CJNE A,10H,HUAI
INC DPTR
SJMP START
HUAI: INC R0 ;坏地址数目
CPL P1.0 ;产生坏地址信号
INC DPTR ;坏地址在DPTR
SJMP START
九,心得体会
这次微机试验上机中,我体会到细心看程序的重要性,特别是心要安静下来看,这样才能体会的深入。本实验基本完成了此次上机的教学目的。