汇编语言C就是Cy吗,51单片机回顾【基本汇编语言】

数据传递类指令html

以累加器为目的操做数的指令编程

MOV A,Rnspa

MOV A,direct设计

MOV A,@Ri指针

MOV A,#datahtm

第一条指令中,Rn表明的是R0-R7。第二条指令中,direct就是指的直接地址,而第三条指令中,就是咱们刚才讲过的。第四条指令是将当即数data送到A中。对象

下面咱们经过一些例子加以说明:blog

MOV A,R1 ;将工做寄存器R1中的值送入A,R1中的值保持不变。内存

MOV A,30H ;将内存30H单元中的值送入A,30H单元中的值保持不变。ci

MOV A,@R1 ;先看R1中是什么值,把这个值做为地址,并将这个地址单元中的值送入A中。如执行命令前R1中的值为20H,则是将20H单元中的值送                          入A中。

MOV A,#34H ;将当即数34H送入A中,执行完本条指令后,A中的值是34H。

以寄存器Rn为目的操做的指令

MOV Rn,A

MOV Rn,direct

MOV Rn,#data

这组指令功能是把源地址单元中的内容送入工做寄存器,源操做数不变。

以直接地址为目的操做数的指令

MOV direct,A 例: MOV 20H,A

MOV direct,Rn MOV 20H,R1

MOV direct1,direct2 MOV 20H,30H

MOV direct,@Ri MOV 20H,@R1

MOV direct,#data MOV 20H,#34H

以间接地址为目的操做数的指令

MOV @Ri,A 例:MOV @R0,A

MOV @Ri,direct MOV @R1,20H

MOV @Ri,#data MOV @R0,#34H

十六位数的传递指令

MOV DPTR,#data16

8051是一种8位机,这是惟一的一条16位当即数传递指令,其功能是将一个16位的当即数送入DPTR中去。其中高8位送入DPH(083H),低8位送入DPL(082H)。例:MOV DPTR,#1234H,则执行完了以后DPH中的值为12H,DPL中的值为34H。反之,若是咱们分别向DPH,DPL送数,则结果也同样。若有下面两条指令:MOV DPH,#35H,MOV DPL,#12H。则就至关于执行了MOV DPTR,#3512H。

累加器A与片外RAM之间的数据传递类指令

MOVX A,@Ri

MOVX @Ri,A

MOVX #9; A,@DPTR

MOVX @DPTR,A

说明:

1)在51中,与外部存储器RAM打交道的只能够是A累加器。全部须要送入外部RAM的数据必须要经过A送去,而全部要读入的外部RAM中的数据也必需经过A读入。在此咱们能够看出内外部RAM的区别了,内部RAM间能够直接进行数据的传递,而外部则不行,好比,要将外部RAM中某一单元(设为0100H单元的数据)送入另外一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,而后再送到0200H单元中去。

2)要读或写外部的RAM,固然也必需要知道RAM的地址,在后两条指令中,地址是被直接放在DPTR中的。而前两条指令,因为Ri(即R0或R1)只是一个8位的寄存器,因此只提供低8位地址。由于有时扩展的外部RAM的数量比较少,少于或等于256个,就只须要提供8位地址就够了。

3)使用时应当首先将要读或写的地址送入DPTR或Ri中,而后再用读写命令。

例:将外部RAM中100H单元中的内容送入外部RAM中200H单元中。

MOV DPTR,#0100H

MOVX A,@DPTR

MOV DPTR,#0200H

MOVX @DPTR,A

程序存储器向累加器A传送指令

MOVC A,@A+DPTR

本指令是将ROM中的数送入A中。本指令也被称为查表指令,经常使用此指令来查一个已作好在ROM中的表格(相似C语言中的指针)

说明:

此条指令引出一个新的寻址方法:变址寻址。本指令是要在ROM的一个地址单元中找出数据,显然必须知道这个单元的地址,这个单元的地址是这样肯定的:在执行本指令立脚点DPTR中有一个数,A中有一个数,执行指令时,将A和DPTR中的数加起为,就成为要查找的单元的地址。

1)查找到的结果被放在A中,所以,本条指令执行先后,A中的值不必定相同。

例:有一个数在R0中,要求用查表的方法肯定它的平方值(此数的取值范围是0-5)

MOV DPTR,#TABLE

MOV A,R0

MOVC A,@A+DPTR

TABLE: DB 0,1,4,9,16,25

设R0中的值为2,送入A中,而DPTR中的值则为TABLE,则最终肯定的ROM单元的地址就是TABLE+2,也就是到这个单元中去取数,取到的是4,显然它正是2的平方。其它数据也能够类推。

标号的真实含义:从这个地方也能够看到另外一个问题,咱们使用了标号来替代具体的单元地址。事实上,标号的真实含义就是地址数值。在这里它表明了,0,1,4,9,16,25这几个数据在ROM中存放的起点位置。而在之前咱们学过的如LCALL DELAY指令中,DELAY 则表明了以DELAY为标号的那段程序在ROM中存放的起始地址。事实上,CPU正是经过这个地址才找到这段程序的。

能够经过如下的例子再来看一看标号的含义:

MOV DPTR,#100H

MOV A,R0

MOVC A,@A+DPTR

ORG 0100H.

DB 0,1,4,9,16,25

若是R0中的值为2,则最终地址为100H+2为102H,到102H单元中找到的是4。这个能够看懂了吧?

那为何不这样写程序,要用标号呢?不是增长疑惑吗?

答:若是这样写程序的话,在写程序时,咱们就必须肯定这张表格在ROM中的具体的位置,若是写完程序后,又想在这段程序前插入一段程序,那么这张表格的位置就又要变了,要改ORG 100H这句话了,咱们是常常须要修改程序的,那多麻烦,因此就用标号来替代,只要一编译程序,位置就自动发生变化,咱们把这个麻烦事交给计算机指PC机去作了。

堆栈操做

PUSH direct

POP #9; direct

第一条指令称之为推入,就是将direct中的内容送入堆栈中,第二条指令称之为弹出,就是将堆栈中的内容送回到direct中。推入指令的执行过程是,首先将SP中的值加1,而后把SP中的值看成地址,将direct中的值送进以SP中的值为地址的RAM单元中。例:

MOV SP,#5FH

MOV A,#100

MOV B,#20

PUSH ACC

PUSH B

则执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为60H,而后将A中的值送到60H单元中,所以执行完本条指令后, 内存60H单元的值就是100,一样,执行PUSH B时,是将SP+1,即变为61H,而后将B中的值送入到61H单元中,即执行完本条指令后,61H单元中的值变为20。

POP指令的执行是这样的,首先将SP中的值做为地址,并将此地址中的数送到POP指令后面的那个direct中,而后SP减1。

接上例&

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值