在本文中,我们教导您大约8051个地址模式。如果您已经熟悉8051,则可能知道寻址模式是一种解决操作数的方法。如果您是新的,请不要担心 - 我们详细介绍了大约8051个地址模式的各个方面。让我们开始旅程。

让我们用一个简单的问题开始这篇文章。“什么是寻址模式?。一个简单的问题也总是有一个简单的答案。寻址模式是一种解决操作数的方法。操作数意味着我们在操作的数据(在大多数情况下源数据)。它可以是内存的直接地址,它可以是寄存器名称,它可以是任何数值数据等。我将用简单的数据移动指令为8051来解释这一点。

mov a,#6ah

这里的数据6A是操作数,通常称为源数据。当这个指令被执行时,数据6AH被移动到累加器a。有5种不同的方式执行这个指令,因此我们说,我们有5种寻址模式为8051。他们是1)立即寻址模式2)直接寻址模式3)寄存器直接寻址方式4)注册间接寻址模式5)索引寻址模式

立即寻址模式

让我们从一个例子开始。

mov a,#6ah

通常我们可以写MOV A, #数据

这种寻址模式被命名为“即时”因为它立即将8位数据传输到累加器(目标操作数)。

上图描述了上述指令及其执行。MOV A,#数据的操作码为74h。OPCODE在0202地址中保存在程序内存中。数据6AH被保存在程序存储器0203中。(参见,可以使用程序存储器的任何部分,这只是一个示例)当读取操作码74h时,所采取的下一步是在下一节目处传送任何数据时存储器地址(在0203处)到累加器A(e0h是累加器的地址)。该指令具有两个字节,并在一个周期中执行。因此,在执行此指令后,程序计数器将添加2并移动到程序存储器的O204。

笔记:'#'6Ah之前的符号表示操作数是数据(8位)。如果'#',则十六进制数将被视为地址。

直接寻址模式

这是解决操作数的另一种方式。这里,数据(源数据)的地址被给出为操作数。让我们举个例子。

mov a,04h

这里04h是寄存器库#0的寄存器4的地址。执行该指令时,将数据存储在寄存器04H中的数据被移动到累加器。在下面的图片中,我们可以看到,寄存器04h保存数据1FH。因此,数据1FH被移动到累加器。

笔记:我们没有使用过'#'在直接寻址模式下,与立即模式不同。如果我们使用过'#',数据值04h将被传送到累加器而不是0f 1FH。

如上图所示,这是一个2字节的指令,需要1个周期来完成。程序计数器将增加2,位于0204。指令的操作码移动A,地址E5H。当指令在0202被执行时(E5H),累加器被激活并准备接收数据。然后程序控制转到下一个地址0203,查找源数据(要转移到累加器)所在的位置(04H)的地址。在04H,控件找到数据1F并将其传输到累加器,因此执行完成。

寄存器直接寻址方式

在这种寻址模式中,我们直接使用寄存器名(作为源操作数)。下面展示了一个示例。

mov a,r4

在时间寄存器中可以从R0,R1 ...取向R7。您可能已经知道有32个这样的寄存器。那么你如何访问32个寄存器,只有8个变量来解决寄存器?现在开始使用注册银行了。有4个寄存器库,分别为0、1、2和3。每家银行有8个从R0到R7的寄存器。一次只能选择一个登记银行。通过一个名为处理器状态字(PSW)的特殊功能寄存器(SFR),可以选择寄存器组。PSW是一个8位的SFR,其中每个位都可以编程。7使用PSW.3和PSW.4选择寄存器行,这两个位被称为寄存器行选择位,因为它们被用来选择寄存器行。下面的图片显示了PSW寄存器和具有状态的寄存器银行选择位。

因此,在注册直接寻址模式下,数据从寄存器传输到累加器(基于选择哪个寄存器库)。

看看下面的图片。

所以我们看到MOV A, R4的操作码是EC。操作码存储在程序内存地址0202中,当它被执行时,控制直接到相应寄存器组的R4(在PSW中选择)。如果选择了#0寄存器组,那么来自#0寄存器组R4的数据将被移动到累加器中。(这里是2F存储在04h)。04h是寄存器银行#0的R4的地址。在本例中,数据的移动(2F)以粗体线显示。现在请看虚线。这里2F从数据存储位置0C H被转移到累加器。现在理解0C H是寄存器组#1的寄存器4 (R4)的地址位置。程序员通常会对注册银行的选择感到困惑。还要记住,注册银行#0和注册银行#1(甚至其他银行)的R4中的数据是不一样的。因此,错误的登记库选择将导致不希望的输出。

另请注意,上面的指令为1字节,需要1个周期以完成执行。这意味着使用寄存器直接寻址模式可以保存程序内存。

注册间接寻址模式

因此,在这种寻址模式下,寄存器操作数中给出了数据的地址(传输到传输源数据)。

mov a,@ r0

这里,R0内的值被认为是一个地址,其将要传送到累加器的数据。

例子:如果R0持有值20H,并且我们有一个数据2FH存储在地址20H,那么值2FH将在执行这条指令后被转移到累加器。知道了?请参阅下面的图片。

所以操作码mov a,@ r0是e6h。假设选择了寄存器库#0。因此,寄存器库#0的R0保持数据20h。程序控制移动到20H,在其中定位数据2FH并将2FH传输到累加器。

这是单个字节指令和程序计数器增量1并移动到程序存储器的0203。

笔记:仅允许R0和R1形成寄存器间接寻址指令。换句话说,程序员可以使用@ r0或@ r1来制作任何指令。允许所有注册银行。

索引寻址模式

好吧,让我们先看到两个例子。

@A+DPTR和@A+PC

其中DPTR是数据指针,PC是程序计数器(两者都是16位寄存器)。让我们参加第一个例子。

MOVC A,@ A + DPTR

你现在的第一印象是什么?源操作数是@ A + DPTR,我们知道我们将从此位置获取源数据(传输)。它只是添加了DPTR的内容,目前的累加器内容。此添加将导致新数据作为源数据的地址(传输)。然后将该地址处的数据传输到累加器。看看下面的图片。

该指令的操作码是93H。DPTR的值为01FE, 01位于DPH(高8位),FE位于DPL(低8位)。累加器现在的值是02H。一个16位的加法被执行,现在01FE H+02 H的结果是0200 H,任何数据在0200 H将被转移到累加器。累加器中先前的值(02H)将被来自0200H的新数据替换。累加器中的新数据显示在虚线框中

这是一个1字节的指令执行需要2个周期。你从中推断出什么?与先前的指令(全部为1个周期),此指令所需的执行时间很高。

另一个例子MOVC A,@ A + PC与上述示例相同的方式。唯一的区别是,而不是将DPTR添加到累加器,这里的数据内部数据库(PC)内部添加累加器以获得目标地址。

我希望你现在有明确的削减了解8051寻址模式。如果您有任何疑问或需要任何额外的澄清,请发布您的意见。我会回答他们。

作者

41.注释

  1. Pratiksha.

    在索引寻址模式中,我们正在添加DPTR(即16位)的内容,其中ACC的内容(其为8位),结果存储在ACC中,这将是16位。16位如何存储在8位ACC中?

  2. kalpana

    先生,
    在直接寻址模式下#不使用您在您的纸条中也提到了同样的信息
    注意:与立即模式不同,我们在直接寻址模式下没有使用“#”。如果我们使用过'#',则数据值04h将被传输到累加器而不是0f 1FH。

    您在指令执行示例中使用相同
    SP请澄清相同。

  3. naimishvaniya

    主席先生是否有任何指令可以在程序ROM中编写数据如Movc @ DPTR,a

  4. 穆罕默德

    极好的文章!非常清楚的说明8051寻址模式!

  5. Vishnu Dinesh Nair.

    关于寻址模式的内容对我非常有用。非常感谢

  6. Manohar.

    告诉我关于长而简短的索引

  7. 凯蒂尔

    及时,亲戚,绝对和长期寻址怎么样?

  8. Raj Jariwala.

    你能帮我解决索引寻址模式吗?
    如果我们在地址0300H中获取数据,则最终ANS在0300H存储?

  9. enis krasniqi.

    嗨,你能帮我解决这个问题吗?

    org 100h.
    MOV, # 01 h
    RLC一
    公司A.
    MOVC, @A + PC
    LJMP 2330 h
    DB 00h,10h,20h,30h,40h,50h,60h,70h
    a)ater movc,a = 00
    b)a的内容不要改变
    c)在偏离movc之后,a = 10h
    d)在Movc之后,下一个指令将是ljmp 2330h
    e) MOVC后,A = 23 h
    如果这个答案是正确的,请紧急帮助我
    真诚的enis Krasniqi.

  10. dinesh devireveddy.

    我成功完成了我的研讨会在寻址模式上的内容,给出了关于寻址模式的内容,这对我来说非常有用.. !!!!再次谢谢

  11. 点菜

    我试图理解索引寻址模式,但不能,你能简要解释

  12. Gayathri.

    先生,我不明白索引寻址模式。你能简单解释一下吗

  13. kavindra朋友

    告诉m精确执行间接添加模式,。

  14. kavindra朋友

    通过间接寻址模式告诉m执行,。。,。,

  15. kavita

    请先生告诉我8051的缩醛地址模式

  16. Shefali.

    在指令中的索引寻址模式
    MOVC A,@ A + PC
    c的意思是im movc?

    • 吉恩

      如您可以检查,Movc指令用于将字节从代码存储器移动到累加器。因此,C在MOVC中代表代码。

  17. har

    不错的工作谢谢

  18. Raghavendra

    如何选择寄存器组寄存器直接寻址模式

  19. 纳米

    这是卓越的..你已经更完美地解释了数字中小企业的人......所以更新鲜能够容易理解

  20. eLA.

    程序员可以在8051中弥补新的寻址模式吗?

  21. 阿卡什

    很好的解释

  22. Gaurav.

    可以用每个步骤的解释,为Arssy添加arp

  23. sandeep

    为什么我们应该使用DPTR / PC添加累加器?有没有具体的原因?(在指令MOVC A,@ A + DPTR和MOVC A,@ A + PC)......累加器在这条指令中发挥了什么作用?

    • 穆罕默德·沙夫司司钦

      是的,它将节省时间和此寻址模式广泛用于访问查找表

  24. Ajay.

    好的工作先生,,,,
    你非常......

  25. 唐娜

    我犯了一个错误,而不是立即*

  26. 唐娜

    及时,亲戚,绝对和长期寻址怎么样?
    谢谢,

  27. 巴拉莱斯瓦里

    注册直接寻址模式并寄存器间接寻址模式是类似的。什么是差异?

    • 乔乔

      @Balalogeshwari -他们完全不同。寄存器间接寻址模式可以与C和c++中的“指针”概念相比较。
      考虑mov a,@ r0

      这里,R0内的值被认为是一个地址,其将要传送到累加器的数据。
      如果寄存器R0保持地址20H,并且我们具有在地址20H处存储的数据2F H,则在执行该指令之后,值2FH将被转移到累加器。知道了?

      • 巴拉莱斯瓦里

        ya.谢谢你

  28. Harsha.

    介绍cmos,nmos,pmos&bicmos之间的差异

  29. Mugheer Sheraz.

    一个好的木头

  30. 小指

    我不理解索引addresing模式。IE。它对记忆的执行回来。?......而这里没有相对的addresing模式

  31. 贾斯汀c das.

    先生,我们一次只能用一个,用4个注册银行有什么用?

  32. 贾斯汀c das.

    主席先生,累加器是1字节内存如何在其中移动0200,如上所述在Movc A,@ A + DPTR中

  33. akshara

    主席先生,请发布CMOS和555计时器的文章

Baidu