Keil 的使用与汇编语言上机操作 实验报告.docx

上传人:b****5 文档编号:28950713 上传时间:2023-07-20 格式:DOCX 页数:23 大小:527.27KB
下载 相关 举报
Keil 的使用与汇编语言上机操作 实验报告.docx_第1页
第1页 / 共23页
Keil 的使用与汇编语言上机操作 实验报告.docx_第2页
第2页 / 共23页
Keil 的使用与汇编语言上机操作 实验报告.docx_第3页
第3页 / 共23页
Keil 的使用与汇编语言上机操作 实验报告.docx_第4页
第4页 / 共23页
Keil 的使用与汇编语言上机操作 实验报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

Keil 的使用与汇编语言上机操作 实验报告.docx

《Keil 的使用与汇编语言上机操作 实验报告.docx》由会员分享,可在线阅读,更多相关《Keil 的使用与汇编语言上机操作 实验报告.docx(23页珍藏版)》请在冰豆网上搜索。

Keil 的使用与汇编语言上机操作 实验报告.docx

Keil的使用与汇编语言上机操作实验报告

实验名称Keil的使用与汇编语言上机操作

指导教师罗志祥

专业班级光电1406姓名段昳晖学号U2014*****

联系电话137******

1、任务要求

1.掌握Keil环境的使用

1)字节拆分、合并:

调试e421.asm程序,观察相关寄存器和单元的内容。

2)数据块填充:

调试fill.asm程序,观察相关寄存器和单元的内容。

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

有4个十六位无符号数,连续存放在20H开始的片上数据区中,低八位先存,高八位在后。

要求:

和存于R3(高八位)和R2(低八位),进位位存于R4.

2、设计思路

1.掌握Keil环境的使用

1)字节拆分、合并

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

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

2)数据块填充

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

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

利用RO的进位实现,当且仅当RO=00H时,结束循环赋值过程,此时R0已经经历了从00H-0FFH的过程,即计数周期为100。

同时赋值循环也历经了一百次,完成了将片外RAM7000H-70FFH单元按数据依次递增规律的填充。

2.多个十六位数的加法程序

以2个十六位无符号数相加为基础,将输入的4个无符号数(以a、b、c、d代表),两两相加,所得的2个和,再作为加数,求和,得到4个数的和。

其中需要注意的是进位的处理。

四数求和进位,不仅有两和数相加产出的进位还要加上产生两和数时的进位。

其中2个十六位无符号数相加的原理为,先对两数低位求和,提取出其进位,加到两数高位和中,并将高位求和进位,即两数求和进位保存下来。

3、资源分配

1.掌握Keil环境的使用

1)字节拆分、合并

一字节BCD码存于30H:

两字节ASCII码存于31H,32H

2)数据块填充

RO:

计数器

DPTR:

片外数据指针

7000H-70FFH,数据填充单元

2.多个十六位数的加法程序

1)加数存储:

(1)加数a:

低8位存于20H;高8位存于21H

(2)加数b:

低8位存于22H;高8位存于23H

(3)加数c:

低8位存于24H;高8位存于25H

(4)加数d:

低8位存于26H;高8位存于27H

2)和储存

(1)a、b低位相加和,存于40H;a、b高位相加和,存于41H

(2)c、d低位相加和,存于50H;c、d低位相加和,存于51H

(3)4数低位相加和,存于R2;4数高位相加和,存于R3

3)进位数储存

(1)a、b相加进位,存于42H

(2)c、d相加进位,存于52H

(3)4数相加进位,存于R4

4、流程图

1.掌握Keil环境的使用

1)字节拆分、合并:

调试e421.asm程序,观察相关寄存器和单元的内容。

 

2)数据块填充:

调试fill.asm程序,观察相关寄存器和单元的内容。

 

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

 

5、源代码(含文件头说明、语句行注释)

1.掌握Keil环境的使用

1)字节拆分、合并

Filename:

e421.asm

Description:

1字节BCD码转换为2字节ASCII

2字节ASCII码转化为1字节BCD码

Date:

Designedby:

Sourceused:

30H:

BCDdata

31H,32H:

ASCIIdata

31H,32H->33H

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

MOVSP,#40H;赋堆栈指针

MOV30H,#96H;30H单元赋值

MOVR0,#32H;R0指针赋值

MOV@R0,#0;32H单元清零

MOVA,30H

XCHDA,@R0;拆分字节

ORL32H,#30H;转换为ASCII

SWAPA

ORLA,#30H;转换为ASCII

MOV31H,A;结果存于31H单元

MOVA,31H;从31H单元取值

ANLA,#0FH;转换为BCD

SWAPA

MOV33H,A;结果存于33H单元

MOVA,32H;从32H单元取值

ANLA,#0FH;转换为BCD

ORL33H,A;合并字节

HERE:

SJMPHERE;踏步

END

2)数据块填充

Filename:

fill.asm

Date:

2011.8.20

Designedby:

CDH

Sourceused:

R0:

计数器

DPTR:

片外数据指针

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

MOVSP,#40H

FILL:

CLRA;A寄存器清零

MOVR0,#00H;设循环计数器

MOVDPTR,#7000H;设数据指针

FILL1:

MOVX@DPTR,A;传送到片外RAM

INCA;A内容加1

INCDPTR;修改数据指针

INCR0;修改循环计数器

CJNER0,#00H,FILL1;判断是否结束,RO=00H,继续执行,否则跳转至FILL1

HERE:

SJMPHERE;原地踏步

END

 

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

Filename:

add.asm

Description:

4个16位无符号数的加法,输出运算结果

Date:

2016.9.23

Designedby:

DYH

Sourceused:

R0、R1:

地址指针

R2:

存放4数和的低位

R3:

存放4数和的高位

R4:

存放4数和的进位

20H-27H:

存放a、b、c、d加数

40H:

存放a、b低位相加和

41H:

存放a、b高位相加和

42H:

存放a、b相加进位

50H:

存放c、d低位相加和

51H:

存放c、d高位位相加和

52H:

存放c、d相加进位

 

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

CLRC

;abcd,加数赋值

MOV20H,#01H;a_min

MOV21H,#11H;a_max

MOV22H,#02H;b_min

MOV23H,#22H;b_max

MOV24H,#03H;c_min

MOV25H,#33H;c_max

MOV26H,#04H;d_min

MOV27H,#44H;d_max

;ab求和

MOVR0,#20H;地址指针赋值,指向ab低位

MOVR1,#22H

MOVA,@R0

ADDA,@R1

MOV40H,A;低位和存于40H

INCR0;地址+1.指向ab高位

INCR1

MOVA,@R0

ADDCA,#00H;低位求和进位

ADDA,@R1;求高位和

MOV41H,A;ab高位和存于41H

CLRA

ADDCA,#00H;ab求和进位

MOV42H,;ab求和进位存于42H

;cd求和

MOVR0,#24H;地址指针赋值,指向cd低位

MOVR1,#26H

MOVA,@R0

ADDA,@R1

MOV50H,A;低位和存于50H

INCR0;地址+1.指向cd高位

INCR1

MOVA,@R0

ADDCA,#00H;低位求和进位

ADDA,@R1;求cd高位和

MOV51H,A;cd高位和存于51H

CLRA

ADDCA,#00H;cd求和进位

MOV52H,A;cd求和进位存于52H

;abcd求和

MOVR0,#40H;地址指针赋值,指向ab和及cd和低位

MOVR1,#50H

MOVA,@R0

ADDA,@R1

MOVR2,A;低位和存于R2

INCR0;地址+1.指向ab的和以及cd的和高位

INCR1

MOVA,@R0

ADDCA,#00H;低位求和进位

ADDA,@R1;求高位和

MOVR3,A;abcd高位和存于R3

;求4数求和的进位

CLRA

ADDCA,#00H;和数高位求和进位

ADDA,42H;

ADDA,52H;;加上分开计算ab和、cd和时的进位

MOVR4,A;abcd求和进位存于R4

;最终结果为adder={R4,R3,R2},进位为R4

HERE:

SJMPHERE;原地踏步

END

6、程序测试方法与结果

1.掌握Keil环境的使用

1)字节拆分、合并(以96H,单步测试)

可见拆分后的结果已经存放在31H和32H

合并后结果存放在33H

2)数据块填充:

调试fill.asm程序,观察相关寄存器和单元的内容。

程序执行后的片外存储器的内容

程序执行后的寄存器状态

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

考虑到本程序的目的是求4个16位无符号数的和,考虑到进位的问题,于是选取了4组数据测试程序的正确性

1.无进位

观察42H以及52H,均无进位

结果为AA0AH,无进位,经验证正确

2.2数求和无进位,4数求和有进位

观察42H以及52H,ab求和无进位,cd求和无进位

结果为BA0AH,无进位,经验证正确

3.2数求和有进位,4数求和有进位

观察42H以及52H,ab低位求和有进位,cd求和有进位

此时4数求和无进位,经检查调试发现了问题

(调试前)

 

(调试后)

调试后结果如下

结果为027342H,有进位,经验证结果正确

思考题

1.怎样查看工作寄存器、SFR、片内RAM、片外RAM及程序代码空间内容?

Disassembly窗口有何作用?

选择Debug下的Start/StopDebugSession,在界面的左侧会出先程序代码的空间地址内容,点选register,查看工作寄存器内容。

在debug模式下,点击View菜单下的MemoryWindow命令或对应的按钮,就会显示或隐藏存储器窗口。

在4个显示区上边的“Address”栏输入不同类型的地址,可以观察不同的存储区域。

在Address栏输入D:

xx,可观察片内RAM直接寻址的data区;

在Address栏输入I:

xx,可观察片内RAM间接寻址的idata区;

在Address栏输入X:

xxxx,可观察片外RAM的xdata区;

在Address栏输入C:

xxxx,可观察程序存储器ROMcode区。

2.字节拆分、合并还有哪些方法,举一例说明。

字节拆分可以利用与运算ANL,例如将20H单元中的数据从中间拆分,低字节存于21H,高字节存于22H,程序如下:

MOVA,20H

ANLA,#0FH

MOV21H,A

MOVA,20H

MOV22H,A

合并字节可以利用或运算ORL

SWAPA

MOVA,21H

ORLA,22H

MOV30H,A

3.若按递减1规律填充数据块,应如何修改程序?

原程序

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

MOVSP,#40H

FILL:

CLRA;A寄存器清零

MOVR0,#00H;设循环计数器

MOVDPTR,#7000H;设数据指针

FILL1:

MOVX@DPTR,A;传送到片外RAM

INCA;A内容加1

INCDPTR;修改数据指针

INCR0;修改循环计数器

CJNER0,#00H,FILL1;判断是否结束,RO=00H,继续执行,否则跳转至FILL1

HERE:

SJMPHERE;原地踏步

END

 

修改后

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

MOVSP,#40H

FILL:

CLRA;A寄存器清零

MOVR0,#00H;设循环计数器

MOVDPTR,#70FFH;设数据指针

FILL1:

MOVX@DPTR,A;传送到片外RAM

INCA;A内容加1

DECDPTR;修改数据指针

INCR0;修改循环计数器

CJNER0,#00H,FILL1;判断是否结束,RO=00H,继续执行,否则跳转至FILL1

HERE:

SJMPHERE;原地踏步

END

 

4.若从7010H单元开始,连续填充20个字节,应该如何修改程序?

原程序

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

MOVSP,#40H

FILL:

CLRA;A寄存器清零

MOVR0,#00H;设循环计数器

MOVDPTR,#7000H;设数据指针

FILL1:

MOVX@DPTR,A;传送到片外RAM

INCA;A内容加1

INCDPTR;修改数据指针

INCR0;修改循环计数器

CJNER0,#00H,FILL1;判断是否结束,RO=00H,继续执行,否则跳转至FILL1

HERE:

SJMPHERE;原地踏步

END

修改后

ORG0000H

LJMPMAIN

ORG0100H

MAIN:

MOVSP,#40H

FILL:

CLRA;A寄存器清零

MOVR0,#0ECH;设循环计数器

MOVDPTR,#7010H;设数据指针

FILL1:

MOVX@DPTR,A;传送到片外RAM

INCA;A内容加1

INCDPTR;修改数据指针

INCR0;修改循环计数器

CJNER0,#00H,FILL1;判断是否结束,RO=00H,继续执行,否则跳转至FILL1

HERE:

SJMPHERE;原地踏步

END

5.若完成双字节BCD码加法,应如何修改程序?

可以运用二—十进制调整指令,在ADD、ADDC后加上DA,进行十进制修正。

 

本人承诺:

本报告内容真实,无伪造数据,无抄袭他人成果。

本人完全了解学校相关规定,如若违反,愿意承担其后果。

签字:

2016年9月25日

 

 

其它说明:

1.标题:

黑体,小四号

2.正文:

宋体,五号,1.5倍行距

3.流程图使用SmartDraw7或Visio软件绘制

4.不要加封面

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1