实验四子程序设计实验
- 格式:doc
- 大小:117.50 KB
- 文档页数:17
三、资源分配
实验一:
1.起始地址为0090H
2.向片外数据区7000H、A000H开始的单元赋值。
3.将7010H-7073H单元内容传送至B000H开始的存储区中。
实验二:
1.起始地址1000H
2.统计片外数据区从2000H开始的256个符号数中偶数的个数,低位存入R3,高位存入R2。
答:
MOV DPTR,#2000H
MOV R1,#100H
MAIN: LCALL SEND
DJNZ R1,MAIN
ENDED: SJMP $
SEND: MOVX A,@DPTR
JZ ENDED
PUSH DPH
PUSH DPL
PUSH ACC
MOV A,DPL
ADD A,#0F4H
MOV DPL,A
MOV A,DPH
ADDC A,#1
MOV DPH,A
POP ACC
MOVX @DPTR,A
POP DPL
POP DPH
INC DPTR
RET
END
2.若要将偶数从小到大排序并置于从2000H开始的前端,其余符号数按原来顺序置于偶数后面。应如何编写程序?
F1 EQU PSW.1
COUNTEVE:
MOV R2,#0
MOV R1,#0
2.篡改检测区内容
3.检测结果:
(1)坏区数目R2
(2)坏区地址
(3)LED报警状态
七、心得与体会
这次实验通过传送数据的具体程序实验,进一步加深了对数据传送的基本步骤和思路的理解,在选作实验中也进一步对I/O的数据处理有了了解,在实验设计中对子程序和重复步骤的运用是相当重要的,对数据区的数据移动和传送也是要重点了解的。
MOVX @DPTR,A
INC DPTR
LESS: MOV A,R3
JZ CHECKR4
DEC R3
SJMP LOOP2
CHECKR4:MOV A,R4
JZ OUTLOOP2
DEC R4
SJMP LOOP2
OUTLOOP2:JNB F1,OUT
MOV A,R1
JZ CHECKR2
DEC R1
SJMP LOOP1
CHECKR2:MOV A,R2
JZ OUT
DEC R2
SJMP LOOP1
OUT: SJMP $
END
经测试,程序可以将偶数“挤到”最前面,同时保证非偶数顺序不变。然后可以将偶数排序(256个偶数也可以)。实现了所需功能。
3.若要求偶数的算术平均值,应如何编写程序?
答:(本题中除法是用循环减法实现的,因为多位数除法好像比较困难。)
;Description:数据块传送
;Resource used: R0:计数器
; DPTR:片外数据指针
; R2, R3源地址
; R4, R5目的地址
; R6, R7传送字节数
ORG0090H
START:;初始化7000H开始的片外RAM空间
MOV R0, #00H;设循环计数器
MOV DPTR, #7000H ;设数据指针
SJMP LP;源地址加1
DMVE1:INCR3
CJNER5, #0FFH, DMVE2
INCR4;目的地址加1
DMVE2:INCR5
CJNER7, #00H, DMVE3
CJNER6, #00H, DMVE4;数据传送结束?
SJMP$;原地踏步
DMVE3:DECR7;字节数减1
SJMP DMVE
DMVE4:DEC R7
MOV R5,#0 ;计数个数
MOV DPTR,#2000H
COUNT1: MOVX A,@DPTR
RRC A
JC NOTEVEN
LJMP CHANGE
CHANGE1:MOV A,R1
ADD A,#1
MOV R1,A
MOV A,R2
ADDC A,#0
MOV R2,A
NOTEVEN:INC DPTR
DJNZ R5,COUNT1
MOVR6, #01H
MOVR7, #00H
MOVR4, #0b0H
MOVR5, #00H
;数据串传送
DMVE:MOVSP, #70H;设栈底
MOVDPL, R3
MOVDPH, R2
MOVXA, @DPTR;取一个字节
MOVDPL, R5
MOVDPH, R4
MOVX @DPTR, A;传送一个字节
CJNER3, #73H, DMVE1
;以上程序实现对偶数计数并把它们
;"挤"到最前面
;
;以下程序是上次写得排序程序稍加修改
STEP2: MOV A,R2
JZ LOOP1
MOV R2,#0FH
MOV R1,#0FH
LOOP1: CLR F1
MOV A,R2
MOV R4,A
MOV A,R1
MOV R3,A
MOV DPTR,#2000H
LOOP2: MOVX A,@DPTR
CLR C
SUBB A,#1
MOV DPL,A
MOV A,DPH
SUBB A,#0
MOV DPH,A
MOVX A,@DPTR
INC DPTR
MOVX @DPTR,A
MOV A,DPL
CLR C
SUBB A,#1
MOV DPL,A
MOV A,DPH
SUBB A,#0
MOV DPH,A
SJMP NUOD1
CHECK:MOVX A,@DPTR;将数据送入A累加器中
CJNE A,#TEST,WARN;与指定内容比较,不相同则出错
SJMP GO
GO : INC DPTR
INC R0
CJNE R0, #00H, CHECK;判断循环是否结束
SJMP LP
WARN :MOV P2,#0FFH;LED显示出错状态
3.(选作题)设计子程序,实现对片外数据存储器的测试。具体要求如下:
1)测试方法自选
2)数据存储区首地址、长度可变。
3)可统计坏单元数目,并记录坏单元地址。
4)利用LED指示灯,提示测试过程和结果状态。
二、设计思路
实验一:
1.用MOVX@DPTR, A指令,向片外数据区7000H到70FFH单元内容送值。
MOV P3,#00H
START:;初始化7000H开始的片外RAM空间
MOV P0,#0FH;LED显示开始送数
MOV R0, #00H;设循环计数器
MOV R1, #10H;坏地址
MOV R2, #00H;坏地址个数
MOV DPTR,#7000H;设数据指针
ORGINAL DATA 7000H;定义数据存放初始地址
实验三:(选作题)
1.起始地址2000H
2.向7000H开始的片外RAM空间送监测数
3.错误数目放在R2中
4.错误地址放在片内IDATE中
四、流程图
2.
Y
N
Y
N
N
Y
3.
Y
N
N
Y
N
Y
五、源代码(含文件头说明、资源使用说明、语句行注释)
试验一代码:
;File name: dmove.asm
;Date:
;Designed by:
在这次程序设计中,尤其要注意的数据的起始地址等方面,另外,在循环和判断偶数实验中也要特别注意一些细节问题,在附加实验中,坏点的比较是比较需要注意处理的部分。
思考题
1.从2000H单元开始的外部RAM中存有100个数,要求把它传送到自2500H单元开始的存贮区中去,但在传递过程中要检查数的值,遇到第一个零就停止传送。应如何编写程序?
TEST DATA 00H;定义判定值TEST的大小
LOOP1:
MOVA, #TEST;
MOVX@DPTR, A;传送到片外RAM
INC DPTR;修改数据指针
INC R0;修改循环计数器
CJNER0, #00H, LOOP1;判断是否结束
MOV P0,#0FFH;LED显示检错状态
MOV DPTR,#ORGINAL;返回数据区首地址
COUNT1 :INC R3;低位加一
INC DPTR
SJMP GO
GO:INC R1
CJNE R1,#00H,ALLER;判定循环是否结束
SJMP LP
LP :SJMP LP
END
实验三代码:
ORG2000H
MOV P0,#00H;显示送数与检测功能
MOV P1,#00H;显示程序执行结束
MOV P2,#00H;显示警告功能
实验四:子程序设计实验
专业班级
姓名:
学号:
联系方式
一、任务要求:
1.调试程序dmove.asm,观察片外数据区7000H、A000H开始的单元内容变化规律。
修改程序将7010H-7073H单元内容传送至B000H开始的存储区中。
2.设计一个子程序,统计片外数据区从2000H开始的256个符号数中偶数的个数,低位存入R3,高位存入R2。
2.用同样的指令,将7010H-7073H单元内容传送至B000H开始的存储区中。
实验二:
1.将要检验的地址区域内容逐个取出,进行奇偶判断
2.是偶数则统计加一,之后对下一位进行判断
3.不是则对下一位进行判断
4.结束后返回
实验三:
1.先将监测区域内赋值
2.赋值完成后通过改变区域内的内容,再进行检测
3.若两次的内容不相同,则统计数加一并记录地址