计算机硬件技术基础软件实验讲义北辰版528.docx
《计算机硬件技术基础软件实验讲义北辰版528.docx》由会员分享,可在线阅读,更多相关《计算机硬件技术基础软件实验讲义北辰版528.docx(49页珍藏版)》请在冰豆网上搜索。
计算机硬件技术基础软件实验讲义北辰版528
第3章指令系统和汇编语言程序设计实验
本章实验主要包括指令系统和汇编语言程序设计两部分。
采用软件模拟调试的方法,目的在于通过这些实验可以使学生巩固所学知识,加深对MCS-51单片机内部结构、指令系统的理解,更进一步掌握汇编语言程序设计的方法和技巧。
3.0实验操作说明
Keil软件调试方式分为:
软件仿真方式和硬件调试两种。
实验一到实验十为软件仿真实验;实验十一到实验十四为硬件仿真实验。
3.0.1软件仿真实验上机操作步骤
1、进入Keil,点击桌面上“KeilμVersion3”图标,进入Keil系统窗口;
2、新建工程:
1)打开“工程”菜单中的新建,在弹出的对话框中,键入自己定义的工程名;
2)在进一步打开的对话框中,选择CPU的类型,为Intel公司的8032AH,确定。
3、打开“视图”菜单中的“工程窗口”;
4、在“工程窗口”中,右击“目标1”,为工程设置参数;
1)在弹出的快捷菜单中选择“为目标“目标1”设置选项”;
2)在弹出的对话框中选择“项目”选项卡,设置时钟为“12Mhz”;
3)选择“调试”选项卡,在单选框选择“软件仿真方式”;
4)确定,即完成了“软件仿真方式”的设置。
5、新建文件
1)打开“文件”菜单,选择“新建”;
2)系统打开一个文本窗口,你可在窗口的编辑区输入要调试的汇编语言源程序;
3)存盘,命名文件名和扩展名,文件名任起,扩展名必须是.asm,存盘;例如:
a.asm。
6、将刚建的新文件添入当前的工程中
1)在“工程窗口”中,“目标1”的+号处打开,显示“源代码组1”;
2)右击“源代码组1”,在快捷菜单中选择“为“源代码组1”添加文件”,弹出一个对话框;
3)在对话框中选择“文件类型”为*.*;
4)选择文件所在路径,同时找到刚键入的a.asm文件,点击“add”按钮,然后点击“close”按钮;
5)在“工程窗口”点击“源代码组1”左侧的+号,显示添加的a.asm文件,添加成功。
7、汇编
1)在“工程窗口”点击“源代码组1”的a.asm文件;
2)打开“a.asm”文件编辑窗口;
3)点击工具按钮中的“重建所有的目标文件”,进行汇编;
4)在“输出窗口”显示汇编是否有错,无措,进入调试;
有错,在编辑窗口修改程序,改后,再次汇编,直至无措后进入调试;
8、调试程序
1)点击“开始/停止调试”按钮,进入调试界面;
2)在程序窗口中有一个黄箭头指向程序的第一条可执行指令的开头;
3)选择调试方式进行调试;
①在“调试”菜单中选择:
跟踪、单步、运行、断点等方式;
②或按单步或跟踪命令按钮,按一次单步,执行一条指令,pc指针指向下一条要被执行的指令;
③检查运行结果
Ⅰ打开“视图”菜单,选择“存储器窗口”,弹出存储器对话框;
Ⅱ在存储器对话框的下方选择memory1在地址栏中键入“C:
0X0000”回车,建立程序存储器的观察窗口;
Ⅲ选择memory2在地址栏中键入“D:
0X00”回车,建立内部数据存储器的观察窗口;
Ⅳ选择memory3在地址栏中键入“X:
0X0000”回车,建立外部数据存储器的观察窗口;
Ⅴ在“projectworkspace”窗口中观察r0-r7,a,pc,dptr,psw,要观察各个标志位,打开psw左侧的+号;
9、设置PC指针
当程序的首地址不是0000H时,汇编结束后,PC指针仍然指向0000H的地方,在调试程序前,一定要将PC设置到你的程序首地址处,方法为:
1)将光标移到程序的第一条指令处,击鼠标右键;
2)在快捷菜单中选择“SetProgramCounter”命令,PC指针即可指向程序的第一条指令。
3.0.2硬件仿真实验上机操作步骤
1、调试前硬件的连接
v用串口通信电缆连接TKSMonitor仿真器和计算机的串口
v用电源线连接TKSMonitor仿真器电源插口和实验仪电源输出插口
v用仿真电缆(40灰色排线)连接TKSMonitor仿真器和实验仪MCU锁紧插座
v检查连接,连接正确后,打开实验仪电源。
1)220V电源线
2)电源开关
3)电源指示灯
2、连接仿真器,TKSMonitor仿真器
1)40线仿真电缆,红线朝上
2)仿真器电源插口
3)RS-232C串口,连接计算机的COM1/COM2
4)仿真器复位按钮
5)仿真方式LOAD/RUN,选择RUN
6)仿真器状态指示灯POW/RUN/MON
3、实验仪连接
1)MCU锁紧座,仿真头插入,红线朝上,按下锁紧杆锁紧
2)实验仪电源输出插口
3)实验仪复位按钮
4、TKSMonitor仿真器状态
vLOAD:
下载方式暂不使用。
vRUN:
在Keil的UV3集成开发环境下,TKSMonitor仿真器即作为Keil的MON51调试器。
5、调试状态下的存储器模型
v内部MON51监控程序:
0000~7FFFH
v用户程序区:
8000H~0BFFFH
v用户数据区:
0C000H~0FFFFH
v外部I/O区:
0000H~7FFFH
注意:
在调试状态下,定时器T2、串行口UART已被MON51监控程序占用,用户不能使用。
6、工程设置
1)设备选择——单片机选择
NXP-P89C52X2
2)项目设置
①设置系统时钟频率:
11.0592MHz
②设置片外代码存储
Eprom#1开始:
0x8000,大小:
0x4000
③设置片外Xdata存储
Ram#1开始:
0xC000,大小:
0x4000
3)调试设置
选择使用“KeilMonitor-51Driver”;
目标系统设置:
设置串行口为:
COM1或COM2;
4)按“确定”按钮,保存设置并结束设置。
3.1指令系统实验
实验一熟悉键盘操作及数传指令编程设计
一、实验目的
1.熟悉软件模拟调试的环境及键盘操作。
2.掌握汇编语言程序设计的方法,加深对指令的理解。
3.学会软件模拟调试和察看修改观察项的方法。
二、实验内容
印证数据传送指令的功能、寻址方式以及PC指针、SP指针、DPTR指针、Ri指针分别对代码段、堆栈段、外扩数据存储器段、位寻址区等不同存储器的访问方式。
三、实验步骤
1.进入调试软件环境,输入源程序;
2.汇编源程序;
3.用单步方式运行程序;
4.检查并记录各寄存器和存储单元内容的变化。
四、程序清单
1.内部RAM数据传送
需要查看的数据有30H,31H,A,R0等。
ORG0000H
MOVR0,#30H
MOV30H,#45H
MOV31H,#46H
MOVR2,30H
MOV02H,31H
MOVA,#87H
MOV0E0H,30H
MOV30H,A
MOV31H,@R0
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.数据交换
记录每条指令运行后的结果,从而加深对各种不同的交换指令的理解。
ORG0000H
MOVA,#58H
SWAPA
MOV40H,A
MOVA,#30H
MOVR0,#30H
MOV@R0,#09H
XCHDA,@R0
MOV50H,#1
MOVA,#89H
XCHA,50H
MOVR7,#3
XCHA,R7
XCHA,@R0
SJMP$
END
五、思考题
1.寄存器寻址与寄存器间接寻址有什么区别?
2.PC指针与SP指针有什么区别?
3.DPTR指针与Ri(R0,R1)指针有什么区别?
4.立即寻址与直接寻址有什么区别?
4.同一个特殊功能寄存器不同表达形式。
实验二数传指令和算数运算指令编程设计
一、实验目的
1.掌握数据块的传送操作和算术运算指令的应用。
2.进一步掌握汇编语言设计和调试方法。
3.掌握观察窗口的使用方法。
4.学会给存储单元赋初值的方法。
二、实验内容
1.数据区传送
(1)把内部RAM40H~4FH置初值0A0H~0AFH;
(2)而后把40H~4FH内容传送到外部RAM9800H~980FH中;
(3)再把9800H~980FH内容传送到50H~5FH中。
2.多字节十进制加法
加数放在30H开始的单元中(最低位放在30H,按从小到大的顺序存放),被加数和结果存放在20H开始的单元(最低位在20H中),字节数放在2FH中,最高进位位放在位地址7FH单元中。
三、实验步骤
1.分别用单步和连续运行方式,调试上述两个程序;
2.在执行第二个程序之前,给被加数和加数单元赋初值;
3.在观察窗口中观察结果。
四、实验程序清单
1.数据块传送程序:
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
2.多字节十进制加法:
ORG0000H
MAIN:
MOVR0,#30H
MOVR1,#20H
MOV2FH,#04H
CLRC
DA1:
MOVA,@R0
ADDCA,@R1
DAA
MOV@R1,A
INCR0
INCR1
DJNZ2FH,DA1
MOV7FH,C
SJMP$
END
五、思考题
1.若两个数据块都在外部数据存储器中,如何实现数据块的传送?
2.在调试第一个程序时,若不用程序给40H~4FH赋初值,而用键盘在CPUDATA区给40H~4FH单元预赋初值,如何做?
3.若把第二个程序改为无符号数的减法,怎样修改程序?
4.在第二个程序中,若两数的和存放到从40H开始的单元,如何修改程序?
实验三逻辑运算及位操作指令编程设计
一、实验目的
(1)熟悉字节逻辑运算指令功能。
(2)熟悉位操作指令运算功能。
(3)从而更深入的掌握汇编语言程序设计。
(4)学会观察CPU窗口中BIT区的变化。
二、实验内容
1.字节逻辑运算程序
在片内RAM的FIRST和SECOND单元中各有一符号数X和Y,要求按下列条件算出Z,存入RESULT单元中(设运算结果仍为8位数)。
FIRSTEQU30H
SECONDEQU31H
RESULTEQU32H
ORG0000H
START:
MOVR0,FIRST
MOVA,R0
JBACC.7,NEG
MOVB,#2
DIVAB
MOVA,B
JZTEMP1
MOVA,R0
ADDA,SECOND
SJMPRES
TEMP1:
MOVA,R0
ANLA,SECOND
SJMPRES
NEG:
CPLACC.7
MOVB,#2
DIVAB
MOVA,B
JZTEMP2
MOVA,R0
ORLA,SECOND
SJMPRES
TEMP2:
MOVA,R0
XRLA,SECOND
RES:
MOVRESULT,A
SJMP$
END
2.位操作程序
布尔电路图如下:
XBIT00H
YBIT01H
ZBIT02H
FBIT03H
ORG0000H
START:
MOVC,Z
ANLC,/Y
MOVF,C
MOVC,Y
ANLC,/Z
ORLC,F
MOVF,C
MOVC,X
ANLC,Y
ORLC,/F
MOVF,C
SJMP$
END
3.拆字程序
把外部数据存储器2000H单元的内容拆开,其高四位送2001H低四位,低四位送2002H低四位,2001H、2002H高四位清零。
需要检查2000H、2001H和2002H单元的内容。
程序清单
ORG0000H
MOVDPTR,#2000H
MOVXA,@DPTR
MOVB,A
SWAPA
ANLA,#0FH
INCDPTR
MOVX@DPTR,A
INCDPTR
MOVA,B
ANLA,#0FH
MOVX@DPTR,A
SJMP$
END
程序框图
4.拼字程序
把外部数据存储器2000H、2001H单元的低四位分别送2002H高低四位。
需要察看2000H、2001H和2002H单元内容。
程序框图:
程序清单
ORG0000H
MOVDPTR,#2000H
MOVXA,@DPTR
ANLA,#0FH
SWAPA
MOVB,A
INCDPTR
MOVXA,@DPTR
ANLA,#0FH
ORLA,B
INCDPTR
MOVX@DPTR,A
SJMP$
END
5.自选程序设计
三、思考题
1.字节与位逻辑运算指令在编程上什么区别?
应注意什么?
2.若把两位十六进制数转换成对应的ASCII码,应如何编写程序?
3.采用其它方法设计第一个程序。
4.如何用断点方式调试本程序?
实验四代码转换
一、实验目的
1.掌握各种代码转换的算法,加深对各种数据编码的理解。
2.学会软件模拟调试和察看修改观察项的方法来观察转换结果。
三、实验内容
1.分析清楚个程序的功能。
2.调试各种代码转换的程序。
三、实验步骤
1.进入调试软件环境,输入源程序;
2.汇编源程序;
3.用单步或全速方式运行程序;
4.查看最终结果。
四、程序清单
1.十六进制数ASCII码
将十六进制数据08H,0CH转换成ASCII码,转换结果存入30H,31H两个单元中,再将30H,31H两个单元中的数据分别增1,然后转换成十六进制数存入40H,41H两个单元中。
ORG0000H
MOVSP,#2FH
MOVA,#08H
ADDA,#30H
PUSHACC
MOVA,#0CH
ADDA,#37H
PUSHACC
MOVA,30H
INCA
CLRC
SUBBA,#30H
MOV40H,A
POPACC
INCA
SUBBA,#37H
MOV41H,A
POPACC
SJMP$
END
2.二进制数BCD码
将二进制数10011011B转换成BCD码数,存入30H和31H单元中;再将30H单元中的数据加16H后,转换成二进制数据,存入40H单元中。
ORG0000H
MOVA,#10011011B
MOVB,#100
DIVAB
MOV30H,A
MOVA,B
MOVB,#10
DIVAB
SWAPA
ORLA,B
MOV31H,A
MOVA,30H
ADDA,#16H
DAA
PUSHACC
ANLA,#00001111B
MOV40H,A
POPACC
ANLA,#11110000B
SWAPA
MOVB,#10
MULAB
ADDA,40H
MOV40H,A
SJMP$
END
3.BCD码ASCII码
将20H单元中压缩的BCD码数78H转换成ASCII码,转换结果存入30H,31H两个单元中,再将30H,31H两个单元中的数据分别增1,然后转换成压缩BCD码数存入21H单元中。
ORG0000H
MOVA,20H
ANLA,#00001111B
ADDA,#30H
MOV30H,A
PUSHACC
MOVA,20H
ANLA,#11110000B
SWAPA
ADDA,#30H
MOV31H,A
INCA
CLRC
SUBBA,#30H
MOVR2,A
POPACC
INCA
CLRC
SUBBA,#30H
SWAPA
ORLA,R2
MOV21H,A
SJMP$
END
5.自选程序设计
六、思考题
1.如何查看上面三个程序的结果。
2.在程序1中,如果十六进制数未指定是否包含A~F数码,程序应如何修改?
3.在程序2中,如果要转换的二进制数是十六位的,程序应如何编写?
4.十六进制数转换成ASCII码与BCD码数转换成ASCII码有何区别?
实验五移位操作
一、实验目的:
掌握移位操作的方法,并理解左移或右移与乘除法运算的关系。
二、实验内容:
1.双字节二进制数左移一位
将两个内部RAM31H和30H单元中的内容组成的双字节数通过Cy左移一位。
功能示意图
程序清单
ORG0000H
CLRC
MOVA,30H
RLCA
MOV30H,A
MOVA,31H
RLCA
MOV31H,A
SJMP$
END
2.多字节二进制数右移一位
将三个内部RAM32H、31H和30H单元中的内容组成的三字节数通过Cy右移一位。
功能示意图
程序清单
ORG0000H
CLRC
MOVA,32H
RRCA
MOV32H,A
MOVA,31H
RRCA
MOV31H,A
MOVA,30H
RRCA
MOV30H,A
SJMP$
END
三、思考题
1.多于三个字节的移位操作如何进行?
2.如果不通过Cy如何移位?
实现的功能有何不同?
3.2汇编语言程序设计实验
实验六分支程序设计
一、实验目的
1.进一步熟悉MCS-51指令系统,了解汇编语言程序设计的基本结构。
2.掌握分支结构程序设计的方法。
3.学会用条件转移指令、CJNE、JMP及其配合使用来编写二分支、三分支和多分支程序。
二、实验内容
1.二分支的条件转移程序
设变量X存放于R0,函数值Y存放在R1,其中X、Y均为二进制数。
试按照下式的要求给Y赋值:
Y=
1
X>0
0
X=0
-1
X<0
程序框图2-1如下
:
N
图2-1二、三分支结构程序流程图
2.自选题目设计
三、实验步骤
1.根据实验内容和参考程序流程图,编出相应的分支结构程序。
2.输入程序,汇编成功;
3.用F4(执行到光标处)、F7(跟踪执行)、F8(单步执行)或断点运行等方式调试程序;
4.观察程序的流程,记录运行结果。
四、思考题
1.CJNE指令对CY有影响吗?
用CJNE和JC/JNC指令配合应注意什么?
在用JMP指令前,若变址255怎么办?
2.用什么指令可以实现多分支之间的隔离?
五、实验报告要求
写出题目运行结果。
六、参考程序清单
1、二分支的条件转移程序
1)用二分支结构程序实现:
ORG0000H
MOVA,R0
JZLOAD;等于零转LOAD
JNBACC.7,GO;大于零转GO
MOVA,#0FFH
SJMPLOAD
GO:
MOVA,#01H
LOAD:
MOVR1,A
SJMP$
END
2)用三分支结构程序实现:
ORG0000H
MOVA,R0
JNZCOMP;不等于零转COMP
MOVR1,#00H;等于零,则0(R1)
SJMPMP3
COMP:
CJNER0,#80H,MP1;(R0)中数与80H比较,不相等则转移到MP1
MOVR1,#0FFH;若比较相等,则-1(R1)
LJMPMP3
MP1:
JCMP2;两数不相等,(R0)>0转MP2
MOVR1,#0FFH;(R0)<0,-1(R1)
LJMPMP3
MP2:
MOVR1,#01H;(R0)>0,1(R1)
MP3:
SJMP$
END
实验七循环程序设计
一、实验目的
1.进一步熟悉MCS-51指令系统,了解汇编语言程序设计的基本结构。
2.掌握循环结构程序设计的方法,弄清单重及多重循环控制过程。
3.通过设计软件延时程序,学会计算内外循环次数以及循环体的循环时间。
二、实验内容
1.设计一个循环程序
具体要求:
将内部RAM中30H至32H的内容右移四位,程序流程图如图2-3所示。
2.设计循环程序:
冒泡法排序。
具体要求:
设单片机8031外部RAM从3600H单元开始存放10个无符号数,试编写程序能使它们按从大到小的顺序排列(最大数存放在3600H单元)。
程序流程图如图2-4所示。
3.自选题目设计。
三、实验步骤
1.输入预先编好的程序,汇编成功;
2.用自动单步方式执行程序,观察循环计数器的变化