プロセッサ 8051 は、単一ビットをアドレス指定して 0 にクリアする、1 に設定する、または値をテストし、その後にビットが設定またはクリアされた場合に次のコードをバイパスする条件付き分岐を行ういくつかの命令を定義します。
これらの命令は非常に効率的で、2 バイトしか使用しません。最初のバイトは命令を定義し、2 番目のバイトは合計 256 ビットのうち、使用するビットを識別するオペランドです。
最初の 128 ビットは、16 の SFR バイトを参照しています (P0 のアドレス 0x80 のビット 0 から 7、P1 のアドレス 0x88 の SFR のビット 8 から 15、SFR 0xF8 のビット 120 から 127 まで)。
Hans Pasant が前述したように、次の 128 ビットは、0x20 と 0x2F の間の内部 RAM の 16 バイトを参照しています。
8051 は実際にバイト全体を読み取り、テストし、指定されたビットを設定またはクリアし、すべての 8 ビットを同じ場所に書き戻します (テストを除く)。これらの命令は効率的であるだけでなく、R0 ~ R7、アキュムレータなどのレジスタも変更しません。
C コンパイラは、128 を超える "__bit" 変数を簡単に受け入れ、前述の効率的なアセンブラ コードを、ほとんどの人が説明する従来のバイナリ マスキング操作に置き換えることができます。ただし、Keil コンパイラによって実装される最も簡単な解決策は、128 ビットを超える変数を使用する場合にエラーを宣言することです。
指定された数のビットをアドレス指定できる DSP およびグラフィック プロセッサがいくつかあります。これは、効率的な圧縮アルゴリズムや描画ルーチンなどを作成する場合に非常に役立ちます。たとえば、Texas Instruments の TMS34010 では、メモリ アクセスごとに異なるビット数を使用して 2 つのレジスタ グループを定義できます。ループは、たとえば、最初のグループのレジスタを使用して一度に 3 ビットを読み取り、2 番目のグループのレジスタを使用して 11 ビットを書き込むことができます。内部的には、メモリ コントローラは依然として 16 ビットを読み取り、16 ビットを書き戻し、各 16 ビット ワード内の指定された数のビットのみを変更していました。すべてのメモリ操作は、ワードではなくビットを参照しています。たとえば、プログラム カウンタは、各命令の実行時に 16 ずつインクリメントされます。for 下位ビットがゼロ以外の場合、ハードウェアは例外を作成します。
C 言語の発明者は、いつの日かビットアドレス指定可能なプロセッサが登場するだろうと予測しました。彼らは、ビット構造を使用する場合のワード全体の読み取り/書き込みの現在の制限 (Ixe013 で説明されているように) が将来的に解除される可能性があると説明しました。残念ながら、ビット アドレス指定可能なプロセッサは、ソフトウェアの世界ではあまり注目されませんでした。