如何一次使用8051的所有寄存器组?
How to use all register banks of 8051 at a single time?
我知道我们可以使用 PSW.4
和 PSW.3
一次为 8051 设置一个活动的银行,但是是否可以通过某种方式或技巧实现对所有银行的选择一次?
您至少不能在指令中直接寻址寄存器名称。这是因为 8051 指令被设计为使用单个字节或一个字节加一个立即数进行编码。该字节包含操作码和寄存器编号的 3 位。因此你只能在指令
中编码8个寄存器
虽然寄存器放在通用内存区域,因此您可以随时使用内存访问指令访问它们。当然,这限制了您可以使用不同银行中的寄存器执行的操作。例如,您可以使用 MOV R3, 05h
将 bank 0 中的 R5 移动到当前 R3,因为 bank 0 位于地址范围 00h-07h
8 general-purpose registers R0–R7 may be accessed with instructions 1 byte shorter than others. They are mapped to IRAM between 0x00 and 0x1F. Only 8 bytes of that range are used at any given time, determined by the two bank select bits in the PSW.
Banking is a simple way to increase the total addressable memory with a limited address range。这里英特尔用它来寻址 32 个 3 位寄存器,当然你一次只能访问其中的 8 个。但是有些指令对寄存器进行编码的位数更少,您只能指定 R0 或 R1,如 MOV @R0/1,#data
另见
- Intel MCS-51's Instruction set
- 8051 Instruction Set
- Why 8051 don't have R0 to R32
我知道我们可以使用 PSW.4
和 PSW.3
一次为 8051 设置一个活动的银行,但是是否可以通过某种方式或技巧实现对所有银行的选择一次?
您至少不能在指令中直接寻址寄存器名称。这是因为 8051 指令被设计为使用单个字节或一个字节加一个立即数进行编码。该字节包含操作码和寄存器编号的 3 位。因此你只能在指令
中编码8个寄存器虽然寄存器放在通用内存区域,因此您可以随时使用内存访问指令访问它们。当然,这限制了您可以使用不同银行中的寄存器执行的操作。例如,您可以使用 MOV R3, 05h
将 bank 0 中的 R5 移动到当前 R3,因为 bank 0 位于地址范围 00h-07h
8 general-purpose registers R0–R7 may be accessed with instructions 1 byte shorter than others. They are mapped to IRAM between 0x00 and 0x1F. Only 8 bytes of that range are used at any given time, determined by the two bank select bits in the PSW.
Banking is a simple way to increase the total addressable memory with a limited address range。这里英特尔用它来寻址 32 个 3 位寄存器,当然你一次只能访问其中的 8 个。但是有些指令对寄存器进行编码的位数更少,您只能指定 R0 或 R1,如 MOV @R0/1,#data
另见
- Intel MCS-51's Instruction set
- 8051 Instruction Set
- Why 8051 don't have R0 to R32