8051模拟器汇编入门(4)寄存器组和堆栈

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