微机实验报告一
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验名称 Keil 的使用与汇编语言上机操作成绩
一、任务要求
1.掌握Keil环境的使用
1)字节拆分、合并:调试e421.asm程序,观察相关寄存器和单元的内容。
2)数据块填充:调试fill.asm程序,观察相关寄存器和单元的内容。
2. 编写多个十六位数的加法程序
有4个十六位无符号数,连续存放在20H开始的片上数据区中,低八位先存,高
八位在后。要求:和存于R3(高八位)和R2(低八位),进位位存于R4。
二、设计思路
实验一已给出程序代码,不需要设计,下面阐明实验二,编写多个十六位数的加法程序的设计思路。
十六位数相加,先是低八位相加,低八位相加不用考虑进位,所以,此时用ADD指令,但因为在每次循环时都有CLR C操作,所以也可以用ADDC指令。而且题目中要求将和的低八位存于R2,所以将每次低八位相加的和存于R2,然后从R2中取值求和。
低八位相加后高八位相加,因为必须处理低位相加的进位问题,所以必须用ADDC指令。而且因为要求高位和存于R3,所以将每次计算的和存于R3,每次从R3中取数跟新的高八位相加。
另外考虑到高位进位的问题,所以必须安排一个地址单元或者寄存器存放最高位,也正是因为每次循环中,进位都会被处理,所以每次循环开始要CLR C。
三、资源分配
4个十六位无符号数,连续存放在20H开始的片上数据区中,低八位先存,高八位在后。
和存于R3(高八位)和R2(低八位),进位位存于R4。
R0和R1作为数据指针,存放低八位和高八位的地址。
循环次数存于R5。
四、流程图
NO
YES
五、源代码 (含文件头说明、语句行注释)
四个十六位数的加法程序:
File name: 3.asm
Description: 四个十六位数的加法程序
Date: 2016/09/23
Designed by: 陈钰
Source used: R0,R1 数据指针
R2,R3,R4,R5 寄存器
20H-27H
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV R0,#20H
MOV R1,#21H ;设数据指针
MOV R2,20H
MOV R3,21H ;R2←(20H),R3←(21H)
MOV R4,#00H ;最高位进位清零
MOV R5,#03H ;设置循环次数
LOOP: CLR C ;进位清零
MOV A,R2 ;A←R2
INC R0
INC R0 ;R0←R0+1+1,R0指向下一个低八位
ADD A,@R0 ;A←A+(R0),低八位相加
MOV R2,A ;R2←A,低八位的和存于R2
MOV A,R3 ;A←R3
INC R1
INC R1 ;R1←R1+1+1,R1指向下一个高八位
ADDC A,@R1 ;A←A+(R1)+C,高八位加进位的和
MOV R3,A ;R3←A,高八位的和存于R3
CLR A ;A寄存器清零
ADDC A,R4 ;A←A+R4+C,计算进位
MOV R4,A ;R4←A,进位信息存入R4
DJNZ R5,LOOP ;判断R5是否等于零判断循环是否结束
HERE: SJMP HERE
END
六、程序测试方法与结果
字节拆分、合并程序:(存于30H的数被拆分,分别转为ASCII码存于31H和32H,最后再合并存于33H)
数据块填充程序(将片外RAM 7000H-70FFH单元按一定规律填充)
四个十六位数的加法程序
输入的数:
结果:
思考题
1.怎样查看工作寄存器、SFR、片内RAM、片外RAM及程序代码空间内容?Disassembly 窗口有何作用?
1)观察工作寄存器,SFR:点击 View Registers Window,弹开“Registers”窗口。
在此窗口查看。
2)观察IO 端口,Timer,中断控制寄存器:点击菜单 Peripherals,弹出外设选项栏,选择对应外设,弹出相应外设控制寄存器窗口,即可观察。
3)观察片内 RAM,代码区和片外数据区:点击菜单 View Memory Windows,在 Address 栏中键入存储空间类型和地址,可以观察到相应内容。
Disassembly窗口显示代码及其相应的机器码,也展示了代码的PC地址。
2.字节拆分、合并还有哪些方法,举一例说明。
举例: ORG 0100H
MAIN: MOV SP, #40H ;赋堆栈指针
MOV 30H, #49H ;30H单元赋值
MOV A, 30H
ANL A,#0FH ;拆分出低四位
ORL 32H, #30H ;转换为ASCII
MOV A,30H
ANL A,#0F0H
SWAP A ;拆分出高四位
ORL A, #30H ;转换为ASCII
MOV 31H, A ;结果存于31H单元
HERE: SJMP HERE ;踏步
END
3.若按递减1规律填充数据块,应如何修改程序?
将“INC A”改为“DEC A”
改后运行结果如下:
4.若从7010H单元开始,连续填充20个字节,应该如何修改程序? ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV SP,#40H
FILL: CLR A ;A寄存器清零
MOV R0, #20 ;设循环计数器
MOV DPTR, #7010H ;设数据指针
FILL1: MOVX @DPTR, A ;传送到片外RAM
DEC A ;A内容加1
INC DPTR ;修改数据指针
DJNZ R0, FILL1 ;判断是否结束
HERE: SJMP HERE ;原地踏步
END
运行结果: