资源描述
软件实验报告
软件实验一
一、实验目的
1.熟悉软件实验的基本步骤和汇编程序的调试方法;
2.了解内存块的移动方法;
3.了解将十六进制数转换成ASCII值的方法。
二、实验原理
用MOV和MOVX指令可以进行数据的赋值和移动,用循环可以完成大量数据的复制。
三、实验内容及步骤
1、 软件设置为模拟调试状态,在所建的Project文件中添加例程1的源程序进行编译,编译无误后,可以选择单步或跟踪执行方式或全速运行程序。打开CPU窗口,观察CPU窗口各寄存器的变化。打开View菜单中的Memory Window,可以观察内部RAM、外部RAM的数据和程序存储器中的程序。在Address窗口输入X:8000H后回车,观察8000H-800FF起始的256个字节单元的内容。
2、 新建一个Project文件,添加例程2的源程序进行编译,编译无误后,可以选择单步或跟踪执行方式或全速运行程序。打开View菜单中的Memory Window,在Address窗口的Memory#1输入X:3000H后回车,点击运行按钮后, 在Memory#2输入X:4000H后回车,观察外部RAM3000H和4000H中的内容。
3、 添加将片内30H-3FH单元的内容复制片外片外1030H~103FH中的源程序,编译运行,观察比较30-3FH单元中的内容和片外1030H-103FH中的内容。
4、 添加将30H、31H单元中的十六进制数,转换成ASCII码,存放到40H开始的4个单元中的源程序,编译运行,观察结果。
5、 添加求内部RAM 30H—37H单元中8个无符号数的算术和的源程序,8个无符号数设定为25H,36H,4AH,65H,7FH,82H,9BH,1DH,观察39H,38H中的数字是否分别为02H,C3H。
四、实验结果
1. 步骤1的结果为8000H-80FFH的内容都为1.
2. 步骤2的结果为3000H起始的256个字节存储块与4000H起始的256个字节存储块各单元内数据对应相同。
3. 步骤3的结果为片外1030H-103FH中的内容与片内30H-3FH单元的内容相同。
4. 步骤4的结果为将30H、31H中的十六进制数转换成了ASCII码,并存入到40H开始的4个单元中。
5. 步骤5的结果为8个无符号数的和为02C3H。
五、思考题
1、 如何将存储器块的内容置成某固定值(例全填充为0FFH)? 请用户修改程序,完成此操作。
答:程序修改如下:将MAIN修改如下即可:
MAIN: MOV DPTR, #START
MOV R0,#0
MOV A, #0FFH
MOV DPL, R3
MOVX @DPTR, A
CLR C
MOV A, R1
SUBB A, #0
MOV R1, A
CLR C
MOV A, R3
SUBB A, #0
MOV R3, A
MOV A, R0
SUBB A, #0
MOV R0, A
MOV A, R2
SUBB A, #0
MOV R2, A
DJNZ R7, LOOP1
SJMP $
END
2、 若源块地址和目标块地址有重叠,程序该如何设计(用地址减1方法移动块)?假设源块地址2000H,目标块地址2050H,移动块长度80H。
答:程序修改如下:
ORG 0000H
MOV DPTR, #2000H
MOV A, #01H
MOV R5, #0
LOOP:
MOVX @DPTR, A
INC DPTR
DJNZ R5, LOOP
MOV R0, #20H
MOV R1, #00H
MOV R2, #20H
MOV R3, #50H
MOV R7, #7FH
LOOP1:
MOV DPH, R0
MOV DPL, R1
MOVX A, @DPTR
MOV DPH, R2
六、源程序
1、将片内30H-3FH单元的内容复制片外片外1030H~103FH中
ORG 0000H
MOV R0, #30H
MOV DPTR, #1030H
MOV R7,#10H
LOOP1:MOV A, #0FH
MOV @R0, A
INC R0
DJNZ R7, LOOP1
MOV R0, #30H
MOV R7,#10H
LOOP: MOV A,@R0
INC R0
MOVX @DPTR, A
INC DPTR
DJNZ R7, LOOP
SJMP $
END
2、 将30H、31H单元中的十六进制数,转换成ASCII码,存放到40H开始的4个单元中
ORG 0100H
MOV 30H, #0FH
MOV 31H, #11H
MOV R0, #41H
MOV @R0, #00H
MOV A, 30H
XCHD A, @R0
ORL 41H, #30H
SWAP A
ORL A, #30H
MOV 40H, A
MOV R0, #43H
MOV @R0, #00H
MOV A, 31H
XCHD A, @R0
ORL 43H, #30H
SWAP A
ORL A, #30H
MOV 42H, A
END
3、 求内部RAM 30H—37H单元中8个无符号数的算术和
ORG 0000H
MOV 30H, #25H
MOV 31H, #36H
MOV 32H, #4AH
MOV 33H, #65H
MOV 34H, #7FH
MOV 35H, #82H
MOV 36H, #9BH
MOV 37H, #1DH
MOV R0, #30H
MOV 39H, #0
MOV R7, #8H
CLR C
MOV A, @R0
Loop: INC R0
ADD A, @R0
MOV 38H, A
MOV A,39H
ADDC A, #0
MOV 39H, A
MOV A, 38H
CLR C
DJNZ R7, Loop
SJMP $
END
软件实验二
一、实验目的
1、 熟悉软件实验的基本步骤和汇编程序的调试方法;
2、 掌握简单的数值算法;
3、 掌握多分支结构程序的编程方法。
二、实验原理
将给定的一字节二进制数,转换成十进制(BCD)码的方法为将数除以100,得百位数,保存百位数,再将余数除以10,得十位数并保存,最后的余数为个位数,将其保存。用A和B两个寄存器来完成除法,被除数和商放在A,除数和余数放在B。
三、实验及步骤
1、 在所建的Project文件中添加例程的源程序进行编译,编译无误后,可以选择单步或跟踪执行方式或全速运行程序。打开CPU窗口,观察CPU窗口各寄存器的变化。打开View菜单中的Memory Window,在Address窗口输入D:30H后回车,点击运行按钮,观察地址30H、31H、32H的数据变化。
2、添加实验书实验内容1的源程序,编译,运行,观察(33H)=0x58, (32H)=0xA2, (31H)=0x34, (30H)=0x7E和(43H)=0x07, (42H)=0x68, (41H)=0x85, (40H)=0x3B的差是否为(33H)=0x51, (32H)=0x39, (31H)=0xAF, (30H)=0x43。
3、添加实验书实验内容2的源程序,编译,运行,观察(0100H)=0x10, (0101H)=0x32, (0102H)=0x54, (0103H)=0x76和(0110H)=0x78, (0111H)=0x56, (0112H)=0x34, (0113H)=0x92的和是否为(0120)=0x88, (0121)=0x88, (0122)=0x88, (0123)=0x68, (0124)=0x01。
4、添加实验书实验内容3的源程序,编译,运行。
四、实验结果
1. 步骤1的结果为,30H内容将更新为01,31H更新为02,32H更新为03。
2. 步骤2的结果为,33H,32H,31H,30H中的数字分别为0x51,0x39,0xAF,0x43.
3. 步骤3的结果为,0120,0121,0122,0123中的数分别为0x88,0x88,0x88,0x68,0x01.
4. 步骤4的结果为,A中显示的为R3中的数的平方。
五、思考题
BCD码转换成二进制数的算法是什么?
答:BCD码转换成二进制的算法和二进制数转换成BCD码的算法相反,是高位乘10再与低位相加。
六、源程序
1、无符号多字节二进制数据减法。被减数放在30H开始的4个单元中(从低字节到高字节),减数放在40H开始的4个单元中(从低字节到高字节),差放入30H开始处(从低字节到高字节)
ORG 0000H
MOV R0, #30H
MOV R1, #40H
MOV R7, #04H
CLR C
LOOP:
MOV A, @R0
SUBB A, @R1
MOV @R0, A
INC R0
INC R1
DJNZ R7, LOOP
SJMP $
END
2、 多字节BCD码加法运算。两个4字节长的BCD码加数分别存放在外部RAM 0100H和0110H开始的单元中(从低字节到高字节),计算两数之和,结果保存在0120H开始的9个单元中。
ORG 0
MOV DPH #1H
MOV A, @R0
ADDC A, @R1
DA A
INC R0
INC R1
MOVX @DPTR, A
INC DPTR
DJNZ R7, LOOP3
MOV A, #0
ADDC A, #0
MOVX @DPTR, A
SJMP $
END
MOV DPL #0
MOV R0, #30H
MOV R7, #04H
LOOP1:
MOVX A, @DPTR
MOV @R0, A
INC DPTR
INC R0
DJNZ R7, LOOP1
MOV DPL, #10H
MOV R0, #40H
MOV R7, #04H
LOOP2:
MOVX A, @DPTR
MOV @R0, A
INC DPTR
INC R0
DJNZ R7, LOOP2
MOV DPL, #20H
MOV R0, #30H
MOV R1, #40H
CLR C
LOOP3:
2、 分别用近程查表指令和远程查表指令,查找R3内容的平方值。R3内容小于等于0FH。
近程查表指令:
ORG 0
MOV A,R3
ADD A,#2
MOVC A,@A+PC
SJMP $
TABL:DB 00H,01H,04H,09H
DB 10H,19H,24H,31H
DB 40H,41H,64H,79H
DB 0A9H,0C4H,0E1H
END
远程查表指令:
ORG 0
MOV DPTR,#TABL
MOV A,R3
MOVC A,@A+DPTR
SJMP $
ORG 4000H
TABL:DB 00H,01H,04H,09H
DB 10H,19H,24H,31H
DB 40H,41H,64H,79H
DB 0A9H,0C4H,0E1H
END 软件实验三
一、实验目的
1、 熟悉软件实验的基本步骤和汇编程序的调试方法;
2、 掌握数值的加减运算;
3、 掌握用查表的方法将BCD值转换成ASCII值。
二、实验原理
将一个BCD数转换成ASCII值的方法为:先将高四位用查表法转成ASCII码,再将低四位用查表法转成ASCII码。
三、实验及步骤
1、 在所建的Project文件中添加例程的源程序进行编译,编译无误后,可以选择单步或跟踪执行方式或全速运行程序。打开CPU窗口,观察CPU窗口各寄存器的变化,打开View菜单中的Memory Window,在Address窗口输入D:30H后回车,点击运行按钮,观察地址30H、31H的数据变化。
2、 添加实验书实验内容1的源程序,选两组数据,一组含有要查找的字节,一组不含要查找的字节,编译,运行,观察程序运行后A的内容。
3、 添加实验书实验内容2的源程序,输入-69H,65H,-7H, -25H ,-47H,56H, -3H,17H,6H,-5H,-45H, -1H, -57H, 23H ,-5H,-13H,编译,运行,观察2FH与2EH单元中的内容。
4、 添加实验书实验内容3的源程序,输入61H, -19H,12H, 0,78,3, -13H,0,17H,-69H,-5H,-14H,-31H,-43H,-67H,0编译,运行,观察2FH,2EH,2DH单元中的结果。
四、实验结果
1. 步骤1的结果为30H更新为31,31H更新为41。
2. 步骤2的结果为,当数据中含有要查找的字节时,A中为要查找的字节;当数据中不含要查找的字节时,A中显示FFH。
3. 步骤3的结果为,正数的和为89,负数的和为-199.
4. 步骤4的结果为,2FH、2EH、2DH单元的值分别为5,8,3.
五、思考题
BCD码和ASCII码有哪些区别?
答:BCD码是用二进制数来表示十进制数的表示方法。有压缩BCD码和非压缩BCD码两种。
ASCII码是美国国家信息交换标准字符码的字头缩码。采用7位二进制代码对字符进行编码。
BCD码和ASCII码是两种不同的编码方法,BCD码只能表示数字,ASCII码除了表示数字之外还可以表示通用控制字符,英文字母和专用符号。
六、源程序
1、 查找关键字节(1字节),要查找的字节在R3中,一串字节存放在30H开始的20个单元中,查找结果放入A,若查找不到,则将FFH放入A.
ORG 0
MOV R0, #30H
MOV R7, #14H
LOOP:
MOV A, @R0
CLR C
SUBB A, R3
JZ DONE
INC R0
DJNZ R7, LOOP
MOV A, #0FFH
SJMP OVER
DONE:
MOV A, R0
OVER:
SJMP OVER
END
2、 在内部RAM的30H单元开始,有一串带符号数据块,其长度在10H单元中。编程求其中正数与负数的和,并分别存入2FH与2EH开始的2个单元中。(负数存放形式为补码)。
ORG 0
MOV 30H,#-69H
MOV 31H,#65H
ADD A,2CH
MOV 2CH,A
MOV A,#0H
ADDC A,2DH
MOV 2DH,A
AJMP AGAIN
NEXT: ADD A,2EH
MOV 2EH,A
MOV A,#0H
ADDC A,2FH
MOV 2FH,A
AGAIN:INC R0
DJNZ R1,LOOP
SJMP $
END
MOV 32H,#-7H
MOV 33H,#-25H
MOV 34H,#-47H
MOV 35H,#56H
MOV 36H,#-3H
MOV 37H,#17H
MOV 38H,#6H
MOV 39H,#-5H
MOV 3AH,#-45H
MOV 3BH,#-1H
MOV 3CH,#-57H
MOV 3DH,#23H
MOV 3EH,#-5H
MOV 3FH,#-13H
MOV R0,#30H
MOV R1,#10H
LOOP:MOV A,@R0
JB ACC.7,NEXT
3、 要求同上。请分别求出这一串数据块中正数、负数和零的个数,存入2FH、2EH和2DH单元中。
ORG 0
MOV R0, #30H
MOV R1, #10H
MOV 2FH, #00H
MOV 2EH, #00H
MOV 2DH, #00H
LOOP:
MOV A, 2DH
INC A
MOV 2DH, A
INC R0
DJNZ @R1, LOOP
JZ @R1, DONE
COUNTP:
MOV A, 2EH
INC A
MOV 2EH, A
INC R0
DJNZ @R1, LOOP
JZ @R1, DONE
DONE: SJMP $
END
MOV A, @R0
JB Acc.7, COUNTN
CLR C
SUBB A, #0
JZ A, COUNTZ
SJMP COUNTP
COUNTN:
MOV A, 2FH
INC A
MOV 2FH, A
INC R0
DJNZ @R1, LOOP
JZ @R1, DONE
COUNTZ:
软件实验四
一、实验目的
1、 熟悉软件实验的基本步骤和汇编程序的调试方法;
2、 了解简单的函数计算;
3、 掌握程序的多分支结构。
二、实验原理
多分支结构是程序中常见的结构,在多分支结构的程序中,能够按调用号执行相应的功能,完成指定操作。若给出调用号来调用子程序,一般用查表方法,查到子程序的地址,转到相应子程序。
三、实验及步骤
1、 在所建的Project文件中添加例程的源程序进行编译,编译无误后可以选择单步或跟踪执行方式或全速运行程序。打开CPU窗口,观察CPU窗口各寄存器的变化。打开View菜单中的Memory Window,在Address窗口输入D:30H后回车,点击运行按钮,观察地址30H、31H、32H、33H的数据变化。
2、 添加实验书实验内容1, 编译,运行,观察8101H单元中的值是否与预期结果相同。
3、 添加实验书实验内容2, 编译,运行,观察40H开始的4个单元中的乘积是否正确。
4、 添加实验书实验内容3,编译,运行,观察MAX, MIN中的数是否正确。
四、实验结果
1. 步骤1的结果为:30H更新为0,31H更新为1,32H更新为2,33H更新为3。
2. 步骤2、3、4的结果均与实验要求结果相同。
五、思考题
1、写跳转程序时要注意些什么?
答:注意跳转地址的范围,如AJMP跳转的地址必须与PC+2在同一个2K范围内。此外偏移量rel的计算要用目标地址-源地址-指令的字节数。
2、跳转的作用有哪些?
答:跳过不需要执行的程序,直接指向目的地址。可以用于调用子程序,循环,执行分支程序,查表等。
六、源程序
1、根据外部RAM 8100H单元中的值X,决定Y的值,保存到8101H单元中。
2X X大于0时;
Y= 80H X等于0时;
X的反 X小于0时;
ORG 0
FUNC2:
INC DPTR
MOV A, #80H
MOV @DPTR, A
SJMP $
FUNC3:
MOVX A, @DPTR
MOV B, A
ADD A, B
MOVX @DPTR, A
SJMP $
END
MOV DPH, #81H
MOV DPL #00H
MOVX A, @DPTR
JB Acc.7, FUNC1
CLR C
SUBB A, #0
JZ A, FUNC2
JNZ A, FUNC3
SJMP $S
FUNC1:
MOVX A, @DPTR
OXL A, #FFH
INC DPTR
MOVX @DPTR, A
SJMP $
2.编程实现2字节与1字节的乘法。2字节数放在30H(高字节)、31H(低字节),1字节数放在32H,乘积请放在40H开始的4个单元中。
MOV B,32H
MUL AB
ADD A,@R1
MOV @R1,A
MOV A,B
ADDC A,#0
INC R1
MOV @R1,A
SJMP $
END
ORG 0
MOV R1,#40H
MOV R0,#31H
MOV A,@R0
MOV B,32H
MUL AB
MOV @R1,A
INC R1
MOV @R1,B
DEC R0
MOV A,@R0
3.在外部RAM 1000H开始处有10H个带符号数,请找出其中的最大值和最小值,分别存入内部RAM的MAX、MIN单元。
ORG 0
LOOP1:MOVX A,@DPTR
CJNE A,MIN,NEXT1
NEXT1:JNC WENT1
MOV MIN,A
WENT1:INC DPTR
DJNZ R2,LOOP1
SJMP $
END
MOV R2,#10H
MOV DPTR,#1000H
MOV MAX, #00H
MOV MIN, #0FFH
LOOP:MOVX A,@DPTR
CJNE A,MAX,NEXT
NEXT:JC WENT
MOV MAX,A
WENT:INC DPTR
DJNZ R2,LOOP
MOV DPTR,#1000H
MOV R2,#10H
15
展开阅读全文