MCS51软件部分上机实验报告.docx
《MCS51软件部分上机实验报告.docx》由会员分享,可在线阅读,更多相关《MCS51软件部分上机实验报告.docx(48页珍藏版)》请在冰豆网上搜索。
MCS51软件部分上机实验报告
指令系统和汇编语言程序设计实验报告
实验一熟悉键盘操作及数传指令编程设计
一、实验目的
1.熟悉软件模拟调试的环境及键盘操作。
2.掌握汇编语言程序设计的方法,加深对指令的理解。
3.学会软件模拟调试和察看修改观察项的方法。
二、实验内容
印证数据传送指令的功能、寻址方式以及PC指针、SP指针、DPTR指针、Ri指针分别对代码段、堆栈段、外扩数据存储器段、位寻址区等不同存储器的访问方式。
三、实验步骤
1.进入调试软件环境,输入源程序;
2.汇编源程序;
3.用单步方式运行程序;
4.检查并记录各寄存器和存储单元内容的变化。
四、程序清单及实验结果
1.内部RAM数据传送
1)寄存器寻址与立即寻址,需要查看的数据有A、PSW和不同寄存器区的Rn等单元的内容。
ORG0000H
MOVPSW,#00H
MOVR0,#30H
MOVA,R0
MOVR6,A
MOVPSW,#14H
MOVR0,#30H
MOVA,R0
MOVR6,A
MOVPSW,#10H
MOVR0,#30H
MOVA,R0
MOVR6,A
MOVPSW,#08H
MOVR0,#30H
MOVA,R0
MOVR6,A
SJMP$
END
数据记录:
2)直接寻址,需查看30H、31H、32H、40H、ACC、PSW等单元的内容。
ORG0100H
MOV30H,#45H
MOV31H,#46H
MOV02H,31H
MOV0E0H,30H
MOV32H,ACC
MOVACC,PSW
MOV40H,ACC
SJMP$
END
数据记录:
3)寄存器间接寻址,需查看@R0、RO等的内容。
ORG0200H
MOV30H,#66H
MOVR0,#30H
MOV@R0,#30H
SJMP$
END
数据记录:
2.外部数据传送
需要查看的数据有外部数据存储器单元2000H,外部程序存储器单元2001H。
ORG0000H
MOVA,#89H
MOVDPTR,#2000H
MOVX@DPTR,A
INCDPTR
CLRA
MOVCA,@A+DPTR
SJMP$
ORG2000H
DB44H
DB78H
DB67H
END
数据记录:
3.堆栈操作
需要查看的数据有50H、51H、A及SP指针和堆栈区中数据随PUSH和POP指令执行后的变化情况和数据的存放次序等。
1)可用于保护现场和恢复现场的程序
ORG0000H
MOVSP,#5FH
MOV50H,#3BH
MOV51H,#2FH
MOVA,#12H
PUSH50H
PUSH51H
PUSHACC
POP0E0H
POP51H
POP50H
SJMP$
END
数据记录:
2)可用于数据交换的程序
ORG0100H
MOVSP,#6FH
MOV50H,#3BH
MOV51H,#2FH
PUSH50H
PUSH51H
POP50H
POP51H
SJMP$
END
数据记录:
4.数据交换
记录每条指令运行后的结果,从而加深对各种不同的交换指令的理解。
1)SWAP指令
ORG0000H
MOVA,#58H
SWAPA
MOV40H,A
SJMP$
END
数据记录:
2)XCHD指令
ORG0030H
MOVA,#30H
MOVR0,#30H
MOV@R0,#09H
XCHDA,@R0
MOV41H,A
SJMP$
END
数据记录:
3)XCH指令
ORG0100H
MOV50H,#1
MOVA,#89H
XCHA,50H
MOVR7,#3
XCHA,R7
XCHA,@R0
SJMP$
END
数据记录:
五、思考题
1、寄存器寻址与寄存器间接寻址有什么区别?
答:
寄存器寻址所需操作数放在寄存器中,确定了寄存器就得到了操作数,存放操作数的寄存器地址内含或隐含在指令的操作码字节中;而寄存器间接寻址是将指令指定的寄存器内容作为操作数的地址,该地址所指定的单元内容作为被寻找的操作数。
2、PC指针与SP指针有什么区别?
答:
PC指针是一个16位的程序地址寄存器,其内容是当前执行指令的下一条指令在程序内存中的地址,具有自动加1的功能,从而保证程序能够自动顺序执行,寻址范围达64KB,但是PC单元本身没有地址,是不可寻址的;而SP指针为堆栈指针,其内容是堆栈栈顶的存储单元地址,S可以初始化为不同的值,因此堆栈位置是浮动的。
进栈操作时,SP先加1,后写入数据,出栈操作时,先读出数据,再减1。
3、DPTR指针与Ri(R0,R1)指针有什么区别?
答:
数据指针DPTR为16位寄存器,存放16位地址,作为访问外部程序内存ROM、外部数据存储器RAM和扩展I/O接口时的地址;而Ri(i=0,1)可寻址片内RAM低128B(00H~7FH),与P2口配合使用,用Ri指示低8位地址(00H~0FFH),P2口输出高8位地址,可寻址片外数据存储器或I/O的64KB区域。
4、立即寻址与直接寻址有什么区别?
答:
立即寻址中,操作数直接由指令给出,通常紧跟指令操作码之后的一个或两个字节就是所需的操作数;而直接寻址则直接给出操作数所在的单元地址或位地址。
5、同一个特殊功能寄存器不同表达形式。
答:
书写时既可以使用寄存器符号,也可以使用寄存器单元地址,通常有四种表达形式。
例如:
Cy可以表示为Cy/0D7H/PSW.7/0D0H.7,但A累加器比较特殊,有三种表示方法:
A/ACC/0E0H。
6、三种不同的交换指令的区别是什么?
答:
三种不同的交换指令分别是:
整字节交换指令、低半字节交换指令、累加器高低半字节交换指令。
整字节交换指令,XCH,把累加器A的内容与内部RAM及SFR中的内容互相交换,影响P标志;低半字节交换指令,XCHD,累加器A低四位与片内RAM某单元低四位交换,高四位不变;累加器高低半字节交换指令,SWAP,将累加器A中的高四位与低四位内容交换,不影响标志位。
实验二数传指令程序设计
一、实验目的
1.掌握数据块的传送操作和算术运算指令的应用。
2.进一步掌握汇编语言设计和调试方法。
3.掌握观察窗口的使用方法。
4.学会给存储单元赋初值的方法。
二、实验内容
1、把内部RAM40H~4FH置初值0A0H~0AFH;
2、而后把40H~4FH内容传送到外部RAM9800H~980FH中;
3、再把9800H~980FH内容传送到50H~5FH中。
三、实验步骤
1.分别用单步和连续运行方式,调试上述程序;
2.在观察窗口中观察结果。
四、实验程序清单
数据块传送参考程序:
ORG0000H
MAIN:
MOVR0,#40H
MOVR2,#10H
MOVA,#0A0H
A1:
MOV@R0,A
INCR0
INCA
DJNZR2,A1
MOVR0,#40H
MOVDPTR,#9800H
MOVR2,#10H
A2:
MOVA,@R0
MOVX@DPTR,A
INCR0
INCDPTR
DJNZR2,A2
MOVR0,#50H
MOVDPTR,#9800H
MOVR2,#10H
A3:
MOVXA,@DPTR
MOV@R0,A
INCDPTR
INCR0
DJNZR2,A3
SJMP$
END
数据记录:
五、思考题
1)若两个数据块都在外部数据存储器中,如何实现数据块的传送?
答:
在外部数据存储器中的两个数据块不能直接传送数据,可将外部数据存储器中的数据块先送到片内,完成操作后再送回片外即可完成数据块的传送。
2)在调试程序时,若不用程序给40H~4FH赋初值,而用键盘在CPUDATA区给40H~4FH单元预赋初值,如何做?
答:
在输出窗口中对应的地址直接输入初值即可。
实验三算数运算指令编程设计
一、实验内容
1、求两个无符号数求和及差;
2、求两个带符号数求和及差;
3、求两个压缩的BCD码数的和及差。
二、实验程序清单及数据记录
1、计算下面各式中两个无符号数的和及差,观察CY,并记录运算结果,并求出结果的真值。
(1)计算200+200
(2)计算36589+46542
(3)计算100-200及200-100
(4)计算36589-16542及16542-36589
1)加法的参考程序:
(1)计算两个单字节数的和的参考程序:
states
PC$
A
PSW
CY
AC
ORG0000H
0
C:
0x0000
0x00
0x00
0
0
MOVA,#200
1
C:
0x0002
0xc8
0x01
0
0
ADDA,#200
2
C:
0x0004
0x90
0xc0
1
1
SJMP$
END
执行结果:
cy=1ac=1,所以计算结果(A)=100H+90H=190H=400
(2)计算两个双字节数的和的参考程序:
states
PC$
A
PSW
CY
AC
OV
ORG0100H
0
C:
0x0100
0x00
0x00
0
0
0
MOVA,#LOW(36589)
1
C:
0x0102
0xed
0x00
0
0
0
ADDA,#LOW(46542)
2
C:
0x0104
0xbb
0xc0
1
1
0
MOV30H,A
3
C:
0x0106
0xbb
0xc0
1
1
0
MOVA,#HIGH(36589)
4
C:
0x0108
0x8e
0xc0
1
1
0
ADDCA,#HIGH(46542)
5
C:
0x010A
0x44
0xc4
1
1
1
MOV31H,A
6
C:
0x010C
0x44
0xc4
1
1
1
MOVA,#0
7
C:
0x010E
0x00
0xc4
1
1
1
ADDCA,#0
8
C:
0x0110
0x01
0x01
0
0
0
MOV32H,A
9
C:
0x0112
0x01
0x01
0
0
0
SJMP$
END
执行结果:
计算结果为0144BBH,ac=0,cy=0,故为真值,0144BBH=83131
2)减法的参考程序
(1)两个单字节数的减法程序
states
PC$
A
PSW
CY
AC
OV
ORG0000H
0
C:
0x0000
0x00
0x00
0
0
0
CLRC
1
C:
0x0001
0x00
0x00
0
0
0
MOVA,#100
2
C:
0x0003
0x64
0x01
0
0
0
SUBBA,#200
3
C:
0x0005
0x9c
0xc4
1
1
1
SJMP$
END
执行结果:
cy=1,ac=1,ov=1,计算结果-100
(2)两个双字节数的减法程序
states
PC$
A
PSW
CY
AC
OV
ORG0100H
0
C:
0x0100
0x00
0x00
0
0
0
CLRC
1
C:
0x0101
0x00
0x00
0
0
0
MOVA,#LOW(36589)
2
C:
0x0103
0xed
0x00
0
0
0
SUBBA,#LOW(16542)
3
C:
0x0105
0x4f
0x41
0
1
0
MOV30H,A
4
C:
0x0107
0x4f
0x41
0
1
0
MOVA,#HIGH(36589)
5
C:
0x0109
0x8e
0x40
0
1
0
SUBBA,#HIGH(16542)
6
C:
0x010B
0x4e
0x04
0
0
1
MOV31H,A
7
C:
0x010D
0x4e
0x04
0
0
1
MOVA,#0
8
C:
0x010F
0x00
0x04
0
0
1
SUBBA,#0
9
C:
0x0111
0x00
0x00
0
0
0
MOV32H,A
10
C:
0x0113
0x00
0x00
0
0
0
SJMP$
END
执行结果:
计算结果为4E4FH,ac=0、cy=0,故为真值。
4E4FH=20047
计算16542-36589:
states
PC$
A
PSW
CY
AC
OV
ORG0100H
0
C:
0x0100
0x00
0x00
0
0
0
CLRC
1
C:
0x0101
0x00
0x00
0
0
0
MOVA,#LOW(16542)
2
C:
0x0103
0x9e
0x01
0
0
0
SUBBA,#LOW(36589)
3
C:
0x0105
0xb1
0x80
1
0
0
MOV30H,A
4
C:
0x0107
0xb1
0x80
1
0
0
MOVA,#HIGH(16542)
5
C:
0x0109
0x40
0x81
1
0
0
SUBBA,#HIGH(36589)
6
C:
0x010B
0xb1
0xc4
1
1
1
MOV31H,A
7
C:
0x010D
0xb1
0xc4
1
1
1
MOVA,#0
8
C:
0x010F
0x00
0xc4
1
1
1
SUBBA,#0
9
C:
0x0111
0xff
0xc0
1
1
0
MOV32H,A
10
C:
0x0113
0xff
0xc0
1
1
0
SJMP$
END
执行结果:
cy=1,计算结果为-(0FFFFFFH+1-0FFB1B1H)=-4E4FH=-20047
2、计算下面各式中两个带符号数的和及差,观察OV,并记录运算结果,并求出结果的真值。
(1)计算56+78
states
PC$
A
PSW
OV
AC
CY
ORG0000H
0
C:
0x0000
0x00
0x00
0
0
0
MOVA,#56
1
C:
0x0002
0x38
0x01
0
0
0
ADDA,#78
2
C:
0x0004
0x86
0x45
1
1
0
SJMP$
4
C:
0x0004
0x86
0x45
1
1
0
END
执行结果:
ov=1,溢出,结果无意义。
(2)计算120+120
states
PC$
A
PSW
OV
AC
CY
ORG0000H
0
C:
0x0000
0x00
0x00
0
0
0
MOVA,#120
1
C:
0x0002
0x78
0x00
0
0
0
ADDA,#120
2
C:
0x0004
0xf0
0x44
1
1
0
SJMP$
4
C:
0x0004
0xf0
0x44
1
1
0
END
执行结果:
ov=1,溢出,结果无意义。
(3)计算-56-78
states
PC$
A
PSW
OV
AC
CY
ORG0000H
0
C:
0x0000
0x00
0x00
0
0
0
CLRC
1
C:
0x0001
0x00
0x00
0
0
0
MOVA,#-56
2
C:
0x0003
0xc8
0x01
0
0
0
SUBBA,#78
3
C:
0x0005
0x7a
0x45
1
1
0
SJMP$
5
C:
0x0005
0x7a
0x45
1
1
0
END
执行结果:
ov=1,溢出,结果无意义
(4)计算-120-123
states
PC$
A
PSW
OV
AC
CY
ORG0000H
0
C:
0x0000
0x00
0x00
0
0
0
CLRC
1
C:
0x0001
0x00
0x00
0
0
0
MOVA,#-120
2
C:
0x0003
0x88
0x00
0
0
0
SUBBA,#123
3
C:
0x0005
0x0d
0x45
1
1
0
SJMP$
5
C:
0x0005
0x0d
0x45
1
1
0
END
执行结果:
ov=1,溢出,结果无意义。
3.BCD码运算,观察CY、AC,并记录运行结果,求出结果的真值。
1)计算56+99
ststes
PC$
A
PSW
AC
CY
ORG0000H
0
C:
0x0000
0x00
0x00
0
0
MOVA,#56H
1
C:
0x0002
0x56
0x00
0
0
ADDA,#99H
2
C:
0x0004
0xef
0x01
0
0
DAA
3
C:
0x0005
0xee
0x80
0
1
MOV30H,A
4
C:
0x0007
0xee
0x80
0
1
SJMP$
5
C:
0x0007
0xee
0x80
0
1
END
执行结果:
cy=1,有借位,故计算结果为100+55=155
2)计算56-99
ststes
PC$
A
PSW
AC
CY
ORG0000H
0
C:
0x0000
0x00
0x00
0
0
CLRC
1
C:
0x0001
0x00
0x00
0
0
MOVA,#9AH
2
C:
0x0003
0x9a
0x00
0
0
SUBBA,#99H
3
C:
0x0005
0x01
0x01
0
0
ADDA,#56H
4
C:
0x0007
0x57
0x01
0
0
DAA
5
C:
0x0008
0x57
0x01
0
0
MOV30H,A
6
C:
0x000A
0x57
0x01
0
0
CPLC
7
C:
0x000B
0x57
0x81
0
1
SJMP$
9
C:
0x000B
0x57
0x81
0
1
END
执行结果:
cy=1,有借位,故计算结果为-100+57=-43。
3)计算36826529+29541265
states
PC$
A
PSW
R0
R1
2iH
ov
ac
cy
ORG0000H
0
C:
0x0000
0x00
0x00
0x00
0x00
0x65
(20H)
0
0
0
MOVR0,#30H
1
C:
0x0002
0x00
0x00
0x30
0x00
0x65
(20H)
0
0
0
MOVR1,#20H
2
C:
0x0004
0x00
0x00
0x30
0x20
0x65
(20H)
0
0
0
MOV2FH,#04H
4
C:
0x0007
0x00
0x00
0x30
0x20
0x65
(20H)
0
0
0
CLRC
5
C:
0x0008
0x00
0x00
0x30
0x20
0x65
(20H)
0
0
0
DA1:
MOVA,@R0
6
C:
0x0009
0x29
0x01
0x30
0x20
0x65
(20H)
0
0
0
ADDCA,@R1
7
C:
0x000A
0x8e
0x04
0x30
0x20
0x65
(20H)
1
0
0
DAA
8
C:
0x000B
0x94
0x05
0x30
0x20
0x65
(20H)
1
0
0
MOV@R1,A
9
C:
0x000C
0x94
0x05
0x30
0x20
0x94
(20H)
1
0
0
INCR0
10
C:
0x000D
0x94
0x05
0x31
0x20
0x94
(20H)
1
0
0
INCR1
11
C:
0x000E
0x94
0x05
0x31
0x21
0x94
(20H)
1
0
0
DJNZ2FH,DA1
13
C:
0x0008
0x94
0x05
0x31
0x21
0x94
(20H)
1
0
0
总计循环DA1程序4次,states:
13-28,结果为:
(21H)=77H,(22H)=36H,(23H)=66H
29
C:
0x0008
0x36
0x80
0x33
0x23
0x29
(23H)
0
0
1
30
C:
0x0009
0x36
0x80
0x33
0x23
0x29
(23H)
0
0
1
31
C:
0x000A
0x60
0x40
0x33
0x23
0x29
(23H)
0
1
0
32
C:
0x000B
0x66
0x40
0x33
0x23
0x29
(23H)
0
1
0
33
C:
0x000C
0x66
0x40
0x33
0x23
0x66
(23H)
0
1
0
34
C:
0x000D
0x66
0x40
0x34
0x23
0x6