当前位置:文档之家› 微机实验报告(1)

微机实验报告(1)

《微机实验》报告实验名称 KeilC的使用与汇编语言上机操作指导教师刘小英专业班级中法1201 姓名肖洋学号 U3 联系电话一、任务要求1.掌握KeilC环境的使用1)字节拆分、合并:调试程序,观察相关寄存器和单元的内容。

2)数据块填充:调试程序,观察相关寄存器和单元的内容。

2. 编写两个十六位数的加法程序。

有两个十六位无符号数,分别存放在从20H和30H开始的数据区中,低八位先存,高八位在后,和存于R3(高八位)和R4(低八位),进位位存于R2。

二、设计思路1.字节拆分、合并程序:利用汇编语言中的 XCHD 和 SWAP 两个语句来实现将八位二进制数拆分为两个四位二进制数并分别存储于不同的存储空间的功能,BCD 码与 30H 相或(加上 30H)得到 ASCII 码。

将两个 ASCII 码和 0FH 相与(高四位清零)得到 BCD 码,利用 SWAP 语句将高位数放至高四位,将高位数和低位数相或可实现字节的合并。

2.数据块填充程序:将 R0 用作计数器,DPTR 用作片外数据指针,A 作为原始数据来源,依顺序在片外的存储单元内容填充数据。

利用循环语句来减少程序长度,并控制填充单元个数为片外 100H 个。

(通过 R0 的进位控制)3.两个十六位数加法程序:把第一个十六位无符号数的地八位和高八位分别存于 20H 和21H 中,把第二个十六位无符号数的地八位和高八位分别存于 30H 和 31H 中,对 20H 和30H 中的两个低八位进行 ADD 加法操作,结果存于 R4 中;然后对 21H 和 31H 中的两个高八位进行 ADDC 带进位的加法操作,结果存于 R3 中.然后将累加器 A 清零,并和#00H进行 ADDC 带进位的加法操作,结果产生进位数并存于 R2 中,程序结束。

三、资源分配1. 字节拆分、合并程序:片内 30H 单位存放原 BCD 码,31H 和 32H 存放拆分后的两个 ASCII 码,33H 存放合并后的 BCD 码。

2.数据块填充程序:R0 作为计数器,DPTR 作为数据指针,片外RAM空间从 7000H 开始填充。

3.两个十六位数加法程序:20H,21H: 第一个数的低八位和高八位 30H,31H:第二个数的低八位和高八位 R4:加法结果的低八位 R3:加法结果的高八位 R2:加法结果的进位四、流程图1.字节拆分、合并程序2.数据块填充程序3.两个十六进制数相加程序五、源代码 (含文件头说明、语句行注释)1.字节拆分、合并程序File name:Description: 1字节BCD 码转换为2字节ASCII2字节ASCII 码转化为1字节BCD 码Source used: 30H: BCD data31H, 32H :ASCII data31H, 32H ->33HORG 0000HLJMP MAINORG 0100H MAIN: MOV SP, #40H ;赋堆栈指针MOV 30H, #49H ;30H单元赋值MOV R0, #32H ;R0指针赋值MOV @R0, #0 ;32H单元清零MOV A, 30HXCHD A, @R0 ;拆分字节ORL 32H, #30H ;转换为ASCIISWAP AORL A, #30H ;转换为ASCIIMOV 31H, A ;结果存于31H单元MOV A, 31H ;从31H单元取值ANL A, #0FH ;转换为BCDSWAP AMOV 33H, A ;结果存于33H单元MOV A, 32H ;从32H单元取值 ANL A, #0FH ;转换为BCDORL 33H, A ;合并字节HERE: SJMP HERE ;踏步END2.数据块填充程序:将片外RAM 7000H-70FFH单元按一定规律填充File name:Source used: R0: 计数器DPTR: 片外数据指针ORG 0000HLJMP MAINORG 0100HMAIN: MOV SP,#40HFILL: CLR A ;A寄存器清零MOV R0, #00H ;设循环计数器MOV DPTR, #7000H ;设数据指针FILL1: MOVX @DPTR, A ;传送到片外RAMINC A ;A内容加1INC DPTR ;修改数据指针INC R0 ;修改循环计数器CJNE R0, #00H, FILL1 ;判断是否结束HERE: SJMP HERE ;原地踏步END3.两个十六位数加法程序:File name:Description:Source used:ORG 0000HLJMP MAINORG 0100HMAIN:CLR C ;进位清零MOV 20H,#11H ;赋值MOV 21H,#19HMOV 30H,#90HMOV 31H,#09HMOV R0,#20H ;置数据指针MOV R1,#30HMOV A,@R0 ;取第一个数低位ADD A,@R1 ;两位数低位相加MOV R4,A ;存“和”低位ADDC A,#00H ;处理地位相加进位INC R0 ;修改指针INC R1MOV A,@R0 ;取第一个数高位ADDC A,@R1 ;两数高位相加MOV R3,A ;存“和”高位CLR AADDC A,#00H ;处理高位相加进位MOV R2,A ;最终进位存于R2HERE: SJMP HERE ;原地踏步END六、程序测试方法与结果1.字节拆分、合并程序:测试方法:单步调试观察寄存器变量和片内RAM的存储空间。

结果如图:性能分析:该程序能很方便地实现将一个BCD码拆分为两个ASCII码以及将两个ASCII码合并成一个BCD码的功能。

2.数据块填充程序:测试方法:利用程序的运行和停止控制来观察最终的寄存器变量和片内RAM的存储空间。

结果如图:性能分析:从寄存器变量DPTR最后的取值(7100H)来看,该程序能实现片外RAM从7000H到70FFH的数据填充。

程序中利用R0从00H到FFH 的计数中产生的进位很巧妙地控制了循环的次数。

3.两个十六进制数相加测试方法:手动输入两个加数,运行程序,观察结果是否正确。

在调试过程中,跟踪A,R2,R3,R4的值,看是否与预期相同。

结果如图:结果:输入两个十六进制数为1911H和0990H,得出合数为22A1H,进位为0,各项指标均与预期相同,程序正确。

七、思考题1.怎样查看工作寄存器、SFR、片内RAM、片外RAM及程序代码空间内容Disassembly 窗口有何作用(1)选择Debug下的Start/Stop Debug Session,在界面的左侧会出先程序代码的空间地址内容(2)Disassembly窗口可以显示编译之后的汇编代码2. 字节拆分、合并还有哪些方法,举一例说明(1)字节拆分可以利用与运算ANL,例如将30H单元中的数据从中间拆分,低字节存于31H,高字节存于32H:MOV A, 30HANL A, #0FHMOV 31H, AMOV A,30HANL A, #F0HMOV 32H,A(2)合并字节可以利用或运算ORL,例如将31H单元中的数据和32H单元中的数据合并,结果存放于30H中:MOV A,31HSWAP AORL A,32HMOV 30H,A3. 若按递减1规律填充数据块,应如何修改程序修改后程序如下ORG 0000HLJMP MAINORG 0100HMAIN: MOV SP,#40HFILL: CLR A ;A寄存器清零MOV R0, #FFH ;设循环计数器MOV DPTR, #70FFH ;设数据指针FILL1: MOVX @DPTR, A ;传送到片外RAMDEC A ;A内容减1DEC DPTR ;修改数据指针DEC R0 ;修改循环计数器CJNE R0, #FFH, FILL1 ;判断是否结束HERE: SJMP HERE ;原地踏步END4.若从7020H单元开始,连续填充10个字节,应该如何修改程序ORG 0000HLJMP MAINORG 0100HMAIN: MOV SP, #40HFILL: CLR A ;A寄存器清零MOV R0, #00H ;设循环计数器 MOV DPTR, #7020H ;设数据指针FILL1: MOVX @DPTR, A ;传送到片外RAM INC A ;A内容加1INC DPTR ;修改数据指针 INC R0 ;修改循环计数器 CJNE R0, #10H, FILL1 ;判断是否结束HERE: SJMP HERE ;原地踏步END5. 若完成双字节BCD码加法,应如何修改程序ORG 0000HLJMP MAINORG 0100HMAIN: MOV SP, #40HMOV 20H, #0ABHMOV 21H, #99HMOV 30H, #0CDHMOV 31H, #0EFHMOV A, 20HADD A, 30HDA AMOV R4, AMOV A, 21HADDC A, 31H DA AMOV R3, ACLR AADDC A, #00H DA AMOV R2, ASJMP $END。

相关主题