微机实验:指令功能实验

单片机实验

27人已加入

描述

微机实验:指令功能实验

实验目的

1、熟悉仿真器操作;

2、掌握51系列指令功能及其机器码的编译。

(一)数据传送和运算

实验内容:

两个16位无符号二进制数分别存放在片外RAM首址为2000H和2002H单元内,将它们相加后存放在片内RAM 30~31H单元。(高地址单元存高8位数,低地址单元存低8位数)。

参考程序:

ORG  1000H

MOV  DPTR, #2000H

;被加数送R2R3

 

MOVX  A, @DPTR

;A=____

 

MOV  R2, A

;R2=____

 

INC  DPTR

;DPTR=____

 

MOVX  A, @DPTR

 

 

MOV  R3, A

;R3=____

 

INC  DPTR

;求和,送R2R3

 

MOVX  A, @DPTR

;A=____

 

ADD  A ,R2

;R2=____

 

INC  DPTR

 

 

MOVX  A, @DPTR

;A=____

 

ADDC  A, R3

;R3=____

 

MOV  30H, R2

;和存30H、31H

 

MOV  31H, R3

;(30H)=__,(31H)=__

 

NOP

;实验断点

 

END

 

实验步骤:

1、复位。仿真器复位后,读初始值A、PSW、DPTR。

2、输入程序。 将源程序输入首址为1000H的存储单元。

3、设置初值。假设被加数为1234H,加数为5678H,分别送入片外RAM的2000H和2002H单元。

4、单步执行。每执行一步,观察A、R2、R3的数值变化。

5、连续执行。首先,重设初值,在结束处设置断点,然后全速运行。

6、上述程序模块最后一句NOP指令改为SJMP$(机器码80FE),再次执行单步和连续操作。

思考题:

1、8031对片内RAM和片外RAM各有哪些寻址方式?有哪些指令可以在片内RAM之间、片内外RAM之间实现数据传送?

2、调试程序模块时,为什么要在模块结束处设置断点或加SJMP$指令?

(二)从程序存储器取数

实验内容:将R0中的16进制数0~F改写为ASCⅡ码。

参考程序:

ORG  1020H

 

 

 

MOV  A, R0

;取16进制数

 

 

ADD  A, #03H

;修正A

 

 

MOVC  A ,@A+PC

;查存储器中ASCⅡ表

 

 

MOV  R0, A

;ASCⅡ码存R0

 

 

SJMP  $

;停

      DB

 

30H,31H,32H,33H,

;ASCⅡ码表

 

 

34H,35H,36H,37H,

 

 

 

38H,39H,41H,42H,

 

 

 

43H,44H,45H,46H

 

实验步骤:

1、输入程序。

2、R0单元输入任一数(0~F)。

3、用单步和连续运行程序,并检查结果。

4、计算相对转移指令的地址偏移量。

思考题:

1、有哪些指令可以读取程序存储器(EPROM)中的内容?

2、句中的修正量如何计算?

3、实验内容不变,但要求用MOVE A,@A+DPTR查表,试编写程序。

(三)子程序调用

实验内容:

已知整数n存于R0,求 ,k≤10,并存于R2R3。

参考程序:

ORG  2000H

 

 

 

CLR  A

;R2、R3清零

 

 

MOV  R2,  A

 

 

 

MOV  R3,  A

 

 

ML:

MOV  A,  R0

 

 

 

LCALL  SQ

;执行前,SP=___;PC=_ 

  执行后,SP=___;PC=__

 

 

ADD  A,R3

;累加和,存R2R3

 

 

MOV  R3,A

 

 

 

CLR  A

 

 

 

ADDC  A  R2

 

 

 

MOV  R2,A

 

 

 

DJNZ  R0,ML

 

 

 

SJMP  $

 

 

 

 

 

 

 

ORG

 

 

 SQ:

ADD  A,#01H

;求(A)2

 

 

MOVC  A,@A+PC

 

 

 

RET

;执行后,SP=___;PC=__

 

 DB:

01H,04H,09H,10H,19H

;1~10平方表

 

 

24H,31H,40H,51H,64H

 

实验步骤:

1、人工汇编上述程序,写出每条指令的首地址和机器码。

2、输入程序。

3、在R0输入某数(≤10)以后,单步执行,观察子程序调用和返回时堆栈的内容变化。然后连续执行至程序结束,观察R2、R3中结果。

思考题:

执行CALL和RET指令的过程中,堆栈内容如何变化?

(四)堆栈操作和跳转指令

实验内容:

将程序中存贮器中的字符串“ABC”和“12345”(字符串结束符00H)分别传送到片内RAM,首址为50H、60H的单元内。

参考程序:

ORG  1040H

 

 

 

MOV  SP,#20H

;设置堆栈

 

 

MOV  R1,#50H

;R1指向片内RAM首址

 

 

LCALL  SOT

 

 

  DB:

“ABC”, 00H

;字符串

 

 

MOV  R1,#60H

;R1指向片内RAM首址

 

 

LCALL  SOT

 

 

  DB:

“12345”,00H

;字符串

 

 

SJMP  $

 

 

 

 

 

 

 

ORG  1060H

 

 

 SOT:

POP  DPH

;字符串首地址DPTR

 

 

POP  DPL

 

 

SOT1:

CLR  A

 

 

 

MOVC  A,@A+DPTR

;读字符串

 

 

MOV  @R1,A

;写入片内RAM

 

 

INC  DPTR

;修正地址

 

  

INC  R1

 

 

 

JZ  SEND

;字符串结束?

 

 

SJMP  SOT1

;否,转SOT1

 

SEND:

JMP  @A+DPTR

;返回

实验步骤:

1、输入程序。

2、单步执行,观察堆栈指针SP、堆栈内容、DPTR、PC的变化情况。

思考题:

子程序SOT的结束处,为什么不用RET,而用JMP @A+DPTR?

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分