4.16 _membitcpybl()、_membitcpybb()、_membitcpyhl()、_membitcpyhb()、_membitcpywl()、_membitcpywb()、_membitmovebl()、_membitmovebb()、_membitmovehl()、_membitmovehb()、_membitmovewl()、_membitmovewb()

標準 C ライブラリの memcpy() 関数および memmove() 関数と同様、これらの非標準 C ライブラリ関数は、ビット境界で整列されたメモリ操作を実行します。

これらは、string.h 内で定義されています。

構文

void _membitcpy[b|h|w][b|l](void *dest, const void *src, intdest_offset, intsrc_offset, size_t nbits);
void _membitmove[b|h|w][b|l](void *dest, const void *src, intdest_offset, intsrc_offset, size_t nbits);

使用法

src が指すアドレスの src_offset ビット後の(負のオフセットの場合は前の)メモリ位置から、 dest が指すアドレスの dest_offset ビット後の(負のオフセットの場合は前の)メモリ位置へ、 nbits によって指定された連続するビット数を、(使用される関数に応じて)コピーまたは移動します。
一連のビットを定義するには、順序の形式が必要です。この順序は、各関数のバリアントで次のように定義されます。
  • 最後から 2 番目の文字が b の関数(_membitcpybl() など)は、バイト指向です。バイト指向関数では、1 バイト内のすべてのビットが、次の 1 バイト内のビットより前に置かれていると見なされます。
  • 最後から 2 番目の文字が h の関数は、ハーフワード指向です。
  • 最後から 2 番目の文字が w の関数は、ワード指向です。
それぞれのバイト、ハーフワード、またはワード内のビット順序は、エンディアン方式によって異なります。最後の文字が b の関数(_membitmovewb() など)は、ビット単位のビッグエンディアンです。つまり、各バイト、ハーフワード、またはワードの最上位ビット(MSB)(存在する場合)がそのワード内の先頭ビットと見なされ、最下位ビット(LSB)が最後のビットと見なされます。最後の文字が l の関数は、ビット単位のリトルエンディアンです。この関数では、LSB が先頭ビット、MSB が最後のビットと見なされます。
memcpy() および memmove() と同様、ビット単位のメモリコピー関数では、コピー元およびコピー先のメモリ領域が重複しないと想定される最も速いタイミングでコピーが実行され、ビット単位のメモリ移動関数では、重複領域内の移動元データがコピーされてから上書きされます。
リトルエンディアンプラットフォームでは、ビット単位のビッグエンディアン関数はそれぞれ動作が異なります。一方、ビット単位のリトルエンディアン関数は同一のビット順序を使用するため、同じ関数を表す同義的なシンボルです。ビッグエンディアンプラットフォームでは、ビット単位のビッグエンディアン関数は事実上すべて同一の関数ですが、ビット単位のリトルエンディアン関数はそれぞれ動作が異なります。
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.