微机实验报告一

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

运行结果:

相关文档
最新文档