处理器 8051 定义了一些指令来寻址单个位以清除为 0、设置为 1 或测试该值,如果该位被设置或清除,则在条件分支之后绕过以下代码。
这些指令非常有效,仅使用 2 个字节。第一个字节定义指令,第二个字节是操作数,用于标识要使用的位,总共 256 位。
前 128 位引用 16 个 SFR 字节(地址 0x80 的位 0 至 7 用于 P0,位 8 至 15 用于 SFR 的地址 0x88 用于 P1,等等,直到位 120 至 127 用于 SFR 0xF8)。
接下来的 128 位,如上面 Hans Pasant 所述,引用 0x20 和 0x2F 之间的 16 字节内部 RAM。
8051实际上读取整个字节,测试,设置或清除指定位并将所有8位写回同一位置(测试除外)。除了高效之外,这些指令也不会修改任何寄存器,例如 R0 到 R7、累加器等。
C 编译器可以轻松接受超过 128 个“__bit”变量,并用大多数人描述的经典二进制掩码操作替换上面提到的高效汇编代码。但是,Keil 编译器实现的最简单的解决方案是在使用超过 128 位变量时声明错误。
有一些 DSP 和图形处理器可以处理指定的位数。这在编写高效的压缩算法、一些绘图例程等时非常有用。例如,德州仪器 (TI) 的 TMS34010 可以为每个存储器访问定义两组使用不同位数的寄存器。例如,循环可以使用第一组中的寄存器一次读取 3 位,并使用第二组中的寄存器写入 11 位。在内部,内存控制器仍在读取 16 位,并回写 16 位,并且仅修改每个 16 位字内的指定位数。所有的内存操作都在引用一个位,而不是一个字。例如,程序计数器在执行每条指令时增加 16。如果低位不为零,硬件将创建异常,
The inventors of the C language predicted that one day there could be some processor which could be bit addressable. They explained that the current restriction of reading/writing an entire word when using the bit structures (as described by Ixe013) could be lifted in the future. Unfortunately, the bit addressable processors did not gain much attention in the software world.