- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
西南科技大学单片机原理实实验二和代码
实验二 算术运算程序设计实验
实验目的
熟悉MCS-51指令系统中的指令,掌握汇编语言基本程序结构的实现方法,理解常用算术运算程序的算法,学习调试程序的技巧。
实验设备
Keil C单片机程序开发软件。
实验内容和步骤
内容:
设计并调试一个双字节无符号数乘法子程序。
实验程序:
功能:
双字节无符号数乘法子程序。
入口参数: 被乘数放在R7(高)和R6(低);乘数放在R5(高)和R4(低);积(片内RAM中的连续4字节)的首地址放在R0中。
设计思路:
图2.1 双字节无符号乘法示意图积R6 ? R4
图2.1 双字节无符号乘法示意图
积
R6 ? R4
B
A
R5
R4
R6 ? R5
R7 ? R5
R7 ? R4
+
?
低字节
高字节
R7
R6
B
A
B
A
B
A
M1
M0
M3
M2
MCS-51指令集中乘法指令的结果是固定存放在A和B中的,因此每次乘法操作后都须将结果保存在积中。所以应首先将积的初值置0且在每次乘法指令结束后需要进行2次加操作,分别将A和B加到积的对应位置(注意:在两次加法之间要考虑进位)。
预习:
编写好实验程序(子程序名为_dwMUL)。
根据编写的程序和实验步骤的要求制定调试仿真的操作方案。
步骤:
在Keil C中创建一个新工程,新工程保存为S: \ STUDY \ Kiel \ Ex02\Ex02.uv2,然后选择单片机型号为Generic中的8051。
设置工程选项(操作:鼠标点击选中Project Window中的Target 1,然后选择Project??Option for Target ‘Target 1’)。将工程选项设置如下:
Target: Xtal= 12 MHz
Debug: Use Simulator
创建新文件并输入编写的实验程序,然后保存在与工程相同的文件夹中(文件名为Ex02_1 . ASM),最后将其加入到工程中并编译。
重复任意设定乘数与被乘数,调试运行,检查结果,确认程序的正确性(若错误,则修改直至正确)。
[选做] 编写另一子程序,通过调用该双字节无符号数乘法子程序实现双字节有符号数乘法(子程序名为_nMUL,文件名为Ex02_2 . ASM)。
实验报告要求
工整书写实验程序并画出其流程图。
根据实验结果填写下表。
表2.4 双字节乘法调试结果表
次数
被乘数
乘数
积
R7
R6
R5
R4
M3
M2
M1
M0
1
2
…
代码:
;--------------INITIAL---------------------
MOV R7, #00H ;HIGH
MOV R6, #05H ;LOW
MOV R5, #00H ;HIGH
MOV R4, #05H ;LOW
MOV R0, #30H ;RESULT
ACALL _dwMUL
MOV B, @R0
MOV R1, B
DEC R0
MOV B, @R0
MOV R2, B
DEC R0
MOV B, @R0
MOV R3, B
DEC R0
MOV B, @R0
MOV R4, B
RET
;--------------FUNCTION---------------------
;子程序名: _dwMUL
;子程序功能: 双字节无符号数乘法子程序
;入口参数: 被乘数放在R7(高)和R6(低)
; 乘数放在R5(高)和R4(低)
; 积(片内RAM中的连续4字节)的首地址放在R0中
_dwMUL:
PUSH ACC
PUSH B
MOV B, R3
PUSH B
MOV R3, #04H ;循环次数
MOV B, R0 ;保存R0值
INIT:
MOV @R0, #00H
INC R0
DJNZ R3, INIT ;减1不为0则跳转
MOV R0, B ;恢复R0值
MM:
MOV A, R4 ;R6 x R4
MOV B, R6
MUL AB
ACALL ADDM1
MOV A, R4 ;R7 x R4
MOV B, R7
MUL AB
ACALL ADDM1
MOV A, R5 ;R6 x R5
MOV B, R6
MUL AB
DEC R0
ACALL ADDM1
MOV A, R5 ;R7 x R5
MOV B, R7
MUL AB
ACALL ADDM1
//恢复
POP B
MOV R3, B
POP B
POP ACC
RET
ADDM1:
ADD A, @R0 ; 加部分积
MOV @R0, A
MOV A, B
INC R0
ADDC A, @R0
MOV @R0, A
INC R0
MOV A, @R0
A
文档评论(0)