8051架构提供了两种保存值以便以后使用的好方法:寄存器组(register bank)和堆栈(stack)。
通用寄存器实际上存在于RAM中。RAM的前32个字节被使用。默认情况下,使用的是前8个字节。然而,这可以更改为第二个8个字节、第三个8个字节或第四个8个字节。使用哪组由PSW寄存器的RS1和RS0位确定。这些位可以使用SETB和CLR指令更改。SETB“设置”一个位(为1),CLR“清除”一个位(将其设置为0)。例如,
SETB RS1
MOV R0, #1
将切换到第三个寄存器组,并将第一个寄存器设置为1。
练习7:
将所有四个寄存器组中的R5设置为立即值255。
; Bank 0 (RS1=0, RS0=0)
CLR RS0 ; Clear RS0
CLR RS1 ; Clear RS1
MOV R5, #0FFH ; Set R5 in Bank 0 to 255
; Bank 1 (RS1=0, RS0=1)
SETB RS0 ; Set RS0
CLR RS1 ; Clear RS1
MOV R5, #0FFH ; Set R5 in Bank 1 to 255
; Bank 2 (RS1=1, RS0=0)
CLR RS0 ; Clear RS0
SETB RS1 ; Set RS1
MOV R5, #0FFH ; Set R5 in Bank 2 to 255
; Bank 3 (RS1=1, RS0=1)
SETB RS0 ; Set RS0
SETB RS1 ; Set RS1
MOV R5, #0FFH ; Set R5 in Bank 3 to 255
了解寄存器组:
组 0:PSW = 00H(RS1=0,RS0=0)
组 1:PSW = 08H(RS1=0,RS0=1)
组 2:PSW = 10H(RS1=1,RS0=0)
组 3:PSW = 18H(RS1=1,RS0=1)
每个组都有自己的 R5,我们将它们全部设置为 255(0xFF)。
执行后,所有四个组中的 R5 都将包含 0xFF,即使根据当前 PSW 设置我们一次只能看到一个组。

运行结果:RAM中每个方框对应一组寄存器地址R0-R7
堆栈(Stack)也在RAM中实现。堆栈是一种FIFO(先进先出)结构。默认情况下,堆栈中的第一个项目将在地址8处。当前位置由SP(堆栈指针)寄存器确定。SP总是比堆栈中的当前位置少1。可以通过使用MOV指令设置其值来移动堆栈。这只会影响堆栈指针,而不是堆栈上当前存储的所有项目—所以要小心。有两个指令用于操作堆栈:PUSH和POP。PUSH将内容推入堆栈,POP从堆栈中取出内容。例如,
MOV 0H, #5
PUSH 0H
MOV 0H, #8
POP 0H
将立即值5放入内存地址0,然后将其值(5)推入堆栈。然后对内存地址0执行其他操作(在本例中将立即值8放在那里),然后通过从堆栈中弹出并放回该地址来恢复内存地址0的值。本质上,堆栈非常适合保存稍后恢复内存中的值。PUSH和POP只能与内存地址一起使用,不能与寄存器一起使用。
让我们一行行来执行:
1、将5存入内存地址0:

2、将内存0位置储存的数值(5)推入堆栈(默认储存在RAM的第8位上,堆栈指针SP值为0x08)。

3、将数值8储存在内存0位置

4、将内存0位置的数值8弹出,恢复到5,堆栈指针SP值恢复为0x07。

练习8:
在内存地址6中存储任何值,将其值保存在堆栈上。用新值替换内存地址6中的值。从堆栈中恢复内存地址6的值。
MOV 6, #25H ; Store 25H at memory address 6
PUSH 6 ; Save value from address 6 to stack
MOV 6, #77H ; Replace with new value 77H at address 6
POP 6 ; Restore original value from stack back to address 6