8051单片机中的寄存器库和堆栈内存分配

通用寄存器的集合(R0-R7)称为寄存器库,接受一个字节的数据。银行寄存器是其中的一部分内嵌的RAM内存微控制器,它用于存储程序指令。每个微控制器由各种存储体组成,每个银行寄存器都包含一个唯一的地址,用于识别存储位置。

在8051登记银行

在8051登记银行
在8051登记银行

8051单片机由四个寄存器银行组成,如Bank0,Bank1,Bank2,Bank3,由PSW(程序状态字)注册选择。这些寄存器库存在于8051微控制器的内部RAM存储器中,并且用于在编程微控制器时处理数据。


登记银行切换

默认情况下,8051微控制器有寄存器库0供电;并且,通过使用程序状态字(PSW),我们可以切换到其他银行。PSW的两个位用于在寄存器库之间切换。这两个位被位寻址指令SETB和CLR访问。

根据PSW可能的RS1和RS0组合,相应改变寄存器bank,即当RS1和RS0为0时,选择bank 0。同样,根据RS1和RS0的值选择Bank1、2和3。

8051微控制器中的堆栈内存分配

栈是随机访问内存(RAM)的一个区域,它被临时分配用来保存变量的所有参数。堆栈还负责提醒调用函数的顺序,以便正确返回该函数。每当函数被调用时,与它相关的参数和局部变量都会被添加到堆栈(PUSH)中。当函数返回时,参数和变量从堆栈中移除(“POP”)。这就是为什么程序的堆栈大小在程序运行时不断变化。


用于访问堆栈的寄存器称为堆栈指针寄存器。堆栈指针是一个用来指向堆栈的小寄存器。当我们把某样东西压入堆栈内存时,堆栈指针会增加。

8051微控制器中的堆栈内存分配
8051微控制器中的堆栈内存分配

例子

当8051单片机上电时,堆栈指针包含值默认为07,如图所示。如果我们执行' PUSH '操作,栈指针地址将增加并移到另一个寄存器。为了避免这个问题,在启动程序之前,我们必须给堆栈指针分配一个不同的地址位置。

推动操作

“推送”用于从任何寄存器中获取值,并在堆栈指针的起始地址中存储,即使用“推送”操作。而且,对于下一个'push',它递增+1,并将值存储在堆栈指针的下一个地址中,即01h。

栈推操作
栈推操作

推送操作方式(先进先出)

示例:在汇编语言中WAP进行推送操作

0000H.
mov 08h,#21h
MOV 09 h, # 56 h
推00h
按01h
结束

流行运营

它用于将值从堆栈指针的最大地址从堆栈指针放置到任何其他寄存器的地址。如果我们再次使用此“流行音乐”,那么它将减少1,并且存储在任何寄存器中的值都是“POP”。

栈中弹出操作
栈中弹出操作

POP操作意味着“先进先出”。

000h.
MOV 00 h, # 12 h
mov 01h,#32h
流行1跳频
流行0呃
结束

8051微控制器的寄存器

如果我们执行任何操作,无论是加法还是减去,那么这些操作都无法直接在存储器中执行,因此,通过使用寄存器来执行。有不同类型的寄存器在8051单片机

这些寄存器根据其操作分为两种类型:

•通用寄存器

•特殊功能寄存器

通用寄存器

正如我们之前讨论的那样,在本文中讨论的那样,有四个不同的银行寄存器,每个银行都有8个可寻址的8位寄存器,并且只有一次只访问一个银行寄存器。但是,通过在标志登记簿中更改银行寄存器的号码,我们可以访问其他银行寄存器,这些银行寄存器在此论文上讨论过8051中的中断概念

特殊功能寄存器

包括累加器,寄存器B,数据指针,PCON,PSW等的特殊功能寄存器在制造期间使用地址80h至FFH设计了预定目的,并且该区域不能用于数据或节目存储目的。这些寄存器可以通过位地址和字节地址寄存器实现。

特殊函数寄存器的类型

8051由四个与输入/输出相关的特殊函数寄存器组成,其中共有32条I/O线。特殊函数寄存器控制从I/O行读取的值,特殊函数寄存器控制8051的操作。辅助的特殊功能寄存器并不是直接连接到8051上的,但是,事实上,没有这些寄存器,8051就不能正常运行。下面将解释8051的寄存器集。

8051单片机的寄存器集

在寄存器中设置一个固定的常量值被称为寄存器集。这些值在使用指令集的寄存器中设置。8051遵循CISC指令,使用“哈佛”架构。的CISC是复杂指令集计算的缩写。8051微控制器中的不同类型的指令包括:

  1. 算术指令
  2. 条件指令
  3. 呼叫和跳转指令
  4. 循环指令
  5. 逻辑指令
  6. 黄金的指令

1.算术指令

算术指令执行若干基本操作,例如:

  • 除了
  • 减法
  • 乘法
  • 部门
8051微控制器中的算术指令
8051微控制器中的算术指令

例子:

添加:

Org 0000 h
MOV R0, #03H //移动值3是寄存器R0//
MOV A,#05H //在累加器A //中移动值5
使用0添加一个,00h //累加器值'5'并存储在累加器上//
结束

湾减法:

Org 0000 h
MOV R0, #03H //移动值3是寄存器R0//
MOV A,#05H //在累加器A //中移动值5
SUBB A,03H // A = 5-3最终值为2存储在累加器A //中
结束

C.乘法:

Org 0000 h
MOV R0, #03H //移动值3是寄存器R0//
MOV A,#05H //在累加器A //中移动值5
MUL A, 03H // A=5*3最终值为15,存储在累加器A //
结束

D.司:

Org 0000 h
MOV R0, #03H //移动值3是寄存器R0//
mov a,#15h //在累加器A //中移动值5
DIV A, 03H // A=15/3 final value is 5 stored in the Accumulator A //
结束

2.条件指令

CPU可以根据条件来执行指令,检查单位状态或字节状态称为条件指令,例如:

检查位可寻址寄存器中的单位状态

jb-跳跃如果下面

JNB-如果没有上述话

检查携带位状态

如果携带标志,则跳过

JNC-跳如果没有携带

检查累加器状态0或1

JZ-如果零旗帜跳跃

如果不为零,则跳跃

这是关于寄存器设置在8051单片机和他们的堆栈内存分配。我们希望这篇文章能够给您提供一些关于这个主题的基本见解,以及每个主题附带的一些非常有趣的程序。你也可以写信给我们寻求任何帮助编码微控制器还有关于微控制器的最新项目

一个评论

  1. esaie toingar. 说:

    你好Elprocus团队,
    我非常喜欢你的伟大工作和解释微控制器。我有一个项目,我寻求你的帮助。我的项目包括在寄存器控制器中注册时间。
    (这个项目你有什么办法帮忙吗?)
    多谢。
    esaie toingar.

添加评论