指令系统和汇编语言程序设计实验本章实验主要包括指令系统和汇编语言程序设计两部分。采用软件模拟调试的方法,目的在于通过这些实验可以使学生巩固所学知识,加深对MCS-51单片机内部结构、指令系统的理解,更进一步掌握汇编语言程序设计的方法和技巧。实验操作说明Keil软件调试方式分为:软件仿真方式和硬件调试两种。软件仿真实验上机操作步骤:1、进入Keil,点击桌面上“KeilμVersion3”图标,进入Keil系统窗口;2、新建工程:1)打开“工程”菜单中的新建,在弹出的对话框中,键入自己定义的工程名;2)在进一步打开的对话框中,选择CPU的类型,为Intel公司的8032AH,确定;3)存入C:\keil文件夹中。(机房,安装在C盘,改为C:\keil)3、打开“视图”菜单中的“工程窗口”;4、在“工程窗口”中,右击“目标1”,为工程设置参数;1)在弹出的快捷菜单中选择“为目标“目标1”设置选项”;2)在弹出的对话框中选择“项目”选项卡,设置时钟为“12Mhz”;3)选择“调试”选项卡,在单选框选择“软件仿真方式”;4)确定,即完成了“软件仿真方式”的设置。5、新建文件1)打开“文件”菜单,选择“新建”;2)系统打开一个文本窗口,你可在窗口的编辑区输入要调试的汇编语言源程序;3)存盘,命名文件名和扩展名,文件名任起,扩展名必须是.asm,存入C:\keil文件夹中(在大机房,安装在C盘,改为C:\keil);例如: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指针即可指向程序的第一条指令。指令系统实验实验一熟悉键盘操作及数传指令编程设计一、实验目的1.熟悉软件模拟调试的环境及键盘操作。2.掌握汇编语言程序设计的方法,加深对指令的理解。3.学会软件模拟调试和察看修改观察项的方法。二、实验内容印证数据传送指令的功能、寻址方式以及PC指针、SP指针、DPTR指针、Ri指针分别对代码段、堆栈段、外扩数据存储器段、位寻址区等不同存储器的访问方式。三、实验步骤1.进入调试软件环境,输入源程序;2.汇编源程序;3.用单步方式运行程序;4.检查并记录各寄存器和存储单元内容的变化。四、程序清单1.内部RAM数据传送(MOV指令)1)寄存器寻址与立即寻址,需要查看的数据有A、PSW和不同寄存器区的Rn等单元的内容。ORG0000HAJMP0050HORG0050HMAIN:MOVPSW,#00H;RS1=0,RS0=00组寄存器MOVR0,#30HMOVA,R0MOVR6,ASETBRS1SETBRS0;RS1=1,RS0=13组寄存器MOVR0,#30HMOVA,R0MOVR6,AMOVPSW,#10H;RS1=1,RS0=02组寄存器MOVR0,#30HMOVA,R0MOVR6,ACLRRS1SETBRS0;RS1=0,RS0=11组寄存器MOVR0,#30HMOVA,R0MOVR6,ASJMP$END2)直接寻址,需查看30H、31H、32H、40H、ACC、PSW、02H等单元的内容。ORG0000HAJMP0060HORG0060HMAIN:MOV30H,#45HMOV31H,#46HMOV02H,31HMOV0E0H,30HMOV32H,ACCMOVACC,PSWMOV40H,ACCSJMP$END3)寄存器间接寻址,需查看@R0、RO等的内容。ORG0000HAJMP0070HORG0070HMAIN:MOV30H,#66HMOVR0,#30HMOV@R0,#30HINCR0MOV@R0,#31HSJMP$END2.外部程序存储器数据传送(MOVC指令)根据A中数据查外部程序存储器单元2000H~200FH单元中的字形码,依次存入内部RAM以30H开始的单元。ORG0000HAJMP0080HORG0080HMAIN:MOVR0,#30HMOVR2,#08HMOVR3,#00HLOOP:MOVA,R3MOVB,#02HADDA,BMOVDPTR,#2000HMOVCA,@A+DPTRMOV@R0,AINCR0INCR3DJNZR2,LOOPSJMP$ORG2000HTABL:DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HDB88H,83H,0C6H,0A1H,086H,08EHEND3.堆栈操作(PUSH和POP指令)需要查看的数据有50H、51H、A及SP指针和堆栈区中数据随PUSH和POP指令执行后的变化情况和数据的存放次序等。1)可用于保护现场和恢复现场的程序ORG0000HAJMP0090HORG0090HMAIN:MOVSP,#5FHMOV50H,#3BHMOV51H,#2FHMOVA,#12HPUSH50HPUSH51HPUSHACCPOP0E0HPOP51HPOP50HSJMP$END2)可用于数据交换的程序ORG0000HAJMPOOA0HORG00A0HMAIN:MOVSP,#6FHMOV50H,#3BHMOV51H,#2FHPUSH50HPUSH51HPOP50HPOP51HSJMP$END4.数据交换(SWAP、XCHD、XCH指令)记录每条指令运行后的结果,从而加深对各种不同的交换指令的理解。1)SWAP指令ORG0000HAJMP00B0HORG00B0HMAIN:MOVA,#58HSWAPAMOV40H,ASJMP$END2)XCHD指令ORG0000HAJMP00C0HORG00C0HMAIN:MOVA,#30HMOVR0,#30HMOV@R0,#09HXCHDA,@R0MOV41H,ASJMP$END3)XCH指令ORG0000HAJMP00D0HORG00D0HAMIN:MOVR0,#50HMOV50H,#1MOVA,#89HXCHA,50HMOVR7,#3XCHA,R7XCHA,@R0SJMP$END5.外部数据存储器数据传送(MOVX指令)将内部RAM中40H单元的内容送到外部数据存储器(或I/O口)3695H单元。1)DPTR作指针ORG0000HAJMP00F0HORG00F0HMAIN:MOV40H,#99HMOVA,40HMOVDPTR,#3695HMOVX@DPTR,ASJMP$END2)Ri作指针ORG0000HAJMP0100HORG0100HMAIN:MOV40H,#68HMOVA,40HMOVP2,#36HMOVR0,#95HMOVX@R0,ASJMP$END五、思考题1、寄存器寻址与寄存器间接寻址有什么区别?2、PC指针与SP指针有什么区别?3、DPTR指针与Ri(R0,R1)指针有什么区别?4、立即寻址与直接寻址有什么区别?5、同一个特殊功能寄存器不同表达形式。6、三种不同的交换指令的区别是什么?7、MOVX和MOVC指令的不同点。