このアセンブリプログラミングチュートリアルでは、データには8ビットが使用され、パリティには1ビットが使用され、パリティエラー(ハードウェア障害または電気的妨害による)の検出に使用されることを読みました。
これは本当ですか?
このアセンブリプログラミングチュートリアルでは、データには8ビットが使用され、パリティには1ビットが使用され、パリティエラー(ハードウェア障害または電気的妨害による)の検出に使用されることを読みました。
これは本当ですか?
回答:
データのバイトは8ビットです。OSまたはハードウェアレベルで使用されるデータのバイトごとに、エラーチェック用のビット(パリティビット、またはより高度なエラー検出スキーム)がありますが、データは8ビットです。ビットとパリティビットは通常、ソフトウェアからは見えません。バイトは「8ビットのデータ」を意味するように標準化されています。テキストは、8ビットのデータよりも多くのデータのバイトを格納するための専用のビットがあるかもしれないと言うのは間違っていませんが、これらは通常、バイト自体の一部とは見なされません。テキスト自体はこの事実を示しています。
これは、チュートリアルの次のセクションで確認できます。
Doubleword: a 4-byte (32 bit) data item
4 * 8 = 32の場合、実際にはシステム上で36ビットを占有する可能性がありますが、意図と目的のためには32ビットのみです。
char
、Cで(これがリンクの目的である)メモリの最小のアドレス可能な単位であることに注意してください。これは単にcharと呼ばれますが、C標準ではbyteと同義になっています。
従来、バイトは任意のサイズであり、アドレス可能な最小単位のメモリです。最近、ソフトウェアでは8ビットバイトがほぼ標準化されています。JustAnotherSoulが言ったように、ハードウェアは8ビットのデータよりも多くのビットを保存する場合があります。
FPGAなどのプログラマブルロジックデバイスで作業している場合、その内部メモリは多くの場合9ビットチャンクとしてアドレス可能であり、HDLの作成者として、エラーチェックや大量の格納に9ビットを使用できます。 「バイト」あたりのデータ数。カスタムハードウェア用のメモリチップを購入する場合、通常、8ビットまたは9ビットのアドレス指定可能なユニット(または16 / 18、32 / 36など)を選択できます。その後、9ビットの「バイト」とあなたがそれを持っていることを選択した場合、あなたはその9番目のビットで行います。
そのテキストは非常に貧弱な言葉です。彼はほぼ間違いなくECC (エラー訂正コード) RAM について話している。
ECCラムは通常、9ビットを使用して8ビットの情報を保存します。余分なバイト/ビットは、エラー修正コードを保存するために使用されます。
(どちらの場合も、すべてのバイトがすべてのチップに分散されています。画像はPuget Systems提供)
これはすべて、ハードウェアのユーザーにはまったく見えません。どちらの場合も、このRAMを使用するソフトウェアは1バイトあたり8ビットを認識します。
余談ですが、RAMのエラー修正コードは通常、実際には1バイトあたり1ビットではありません。代わりに、8バイトあたり8ビットです。これには同じスペースオーバーヘッドがありますが、いくつかの追加の利点があります。詳細については、SECEDDを参照してください。
一般的に言えば、短い答えはバイトが8ビットであるということです。これは問題を単純化します(不正確になる場合もあります)が、ほとんどの人(多数のプログラマーを含む)が精通している定義であり、定義はほぼ全員がデフォルトにしています(サイズの異なるバイト数に関係なく) veで作業する必要がありました)。
より具体的には、バイトは、指定されたアーキテクチャの最小のアドレス可能なメモリユニットであり、一般に単一のテキスト文字を保持するのに十分な大きさです。最新のアーキテクチャでは、1バイトは8ビットとして定義されています。ISO / IEC 80000-13は、一般的なコンセンサスと同様に、バイトが8ビットであることも指定しています(たとえば、9ビットバイトについて話している場合、明示的に指定しない限り、多くの問題に直面することを意味します)通常のバイトを意味しないと述べてください)。
ただし、この規則には例外があります。例えば:
sizeof(char)
間接的に述べていchar
ますメモリ内。 これは、8ビットバイトを明示的に必要とする場合よりも移植性を高めるためです。[1バイトのビット数はCHAR_BIT
、Cライブラリヘッダー「limits」(limits.h
C、climits
C ++)でとして指定されます。]
そのため、ほとんどの場合、バイトは通常8ビットになります。そうでない場合は、おそらく 9ビットであり、36ビットワードの一部である場合とそうでない場合があります。
バイトという用語は、コンテキストがないと明確に定義されないことに注意してください。コンピュータアーキテクチャに関する限り、少なくとも最新のアーキテクチャでは、1バイトは8ビットであると想定できます。これは、Cなどのプログラミング言語によって大幅に標準化されました。Cでは、少なくとも 8ビットのバイトが必要でしたが、より大きなバイトの保証はありませんでした。
8ビット(通常は16または32)より大きいアドレス可能なユニットを持つコンピューターがありますが、これらのユニットは通常、バイトではなくマシンワードと呼ばれます。たとえば、32K 32ビットRAMワードのDSPは、32 KBではなく128 KBまたはRAMとしてアドバタイズされます。
通信規格に関しては、物事はそれほど明確に定義されていません。ASCIIは今でも広く使用されており、7ビットバイト(コンピューターの8ビットバイトにうまく収まります)を持っています。UARTトランシーバーは、構成可能なバイトサイズを持つように製造されます(通常、少なくとも6、7〜8ビット/バイトを選択できますが、5と9は前代未聞ではありません)。
通常、バイトは、個別にアドレス指定可能な最小のメモリ空間単位として定義されます。任意のサイズにすることができます。6〜9ビットのバイトサイズのアーキテクチャがありますが、さらに大きい場合もあります。また、アドレス指定可能なユニットがバスのサイズのみであるアーキテクチャもあります。そのようなアーキテクチャでは、単にバイトがないか、バイトがワードと同じサイズであると言えます(特定のケースでは、 32ビット); どちらにしても、間違いなく8ビットではありません。同様に、ビットアドレス指定可能なアーキテクチャがあります。これらのアーキテクチャでは、バイトが単に存在しないと主張することも、バイトが1ビットであると主張することもできます。どちらの方法も賢明な定義ですが、8ビットは間違いです。
多くの主流の汎用アーキテクチャでは、1バイトに8ビットが含まれています。ただし、それは保証されません。メインストリームや汎用CPUから遠く離れるほど、8ビット以外のバイトに遭遇する可能性が高くなります。これは、非常に移植性の高いソフトウェアでさえ、サイズを構成可能にするほどです。たとえば、GCCの古いバージョンにはBITS_PER_BYTE
、特定のアーキテクチャのバイトサイズを構成する(またはそのようなもの)というマクロが含まれていました。NetBSDのいくつかの古いバージョンは、非8ビット/バイトアーキテクチャーで実行することができると信じています。
本当にアドレス指定可能な最小メモリ量ではなく、8ビットの正確な量について話していることを強調したい場合、たとえ多くの新しいRfCで使用されているoctetという用語を使用できます。
CHAR_BIT
(で見つかったがlimits.h
)、私は認識していないよBITS_PER_BYTE
1960年にプログラミングを始めたとき、6ビットバイトの48ビットワードがありました。その名前ではなく、文字と呼ばれていました。その後、75ビットワードと15ビットバイトのGolemコンピューターで作業しました。後に、IBMが360を発表するまで、6ビットバイトが標準でしたが、今日では1バイトは一般にオクテット、つまり8ビットのデータに相当します。一部のハードウェアには、エラー検出および場合によってはエラー修正のための追加ビットがありましたが、これらはソフトウェアからアクセスできませんでした。
1バイトは8ビットです。
遠い過去には、メモリワードとバイトの異なる定義がありました。このあいまいさが広まっている、または今日の生活で一般的であるという示唆は誤りです。
少なくとも1970年代後半以降、1バイトは8ビットでした。フロッピーディスクドライブ、ハードディスクドライブ、PROM / EPROM / EEPROM / Flash EPROMのすべてのデータシートとドキュメントと同様に、ホームコンピューターとPCの大衆は、ドキュメントで8ビット値として1バイトを明確に使用しています。その期間に読んだ/ SRAM / SDRAMメモリチップ。(そして、私は個人的にその期間にわたってそれらの多くを読んでいます。)イーサネットと他のいくつかの通信プロトコルは、オクテットについて話す際に異常であると私には際立っています。
バイトという用語のあいまいさ自体は、まれであいまいなものです。過去30年以上のプログラマ、デザインエンジニア、テストエンジニア、営業担当者、サービスエンジニア、または平均的なパンターの人口は、その言葉をまったく認識していなければ、8ビット値以外のものを意味すると考えている人はほとんどいません。
バイトがメモリチップに格納されている場合や、有線で通信されている場合など、ハードウェアによってバイトが処理される場合、ハードウェアはバイトに冗長データを追加する場合があります。これは、後でハードウェアエラーの検出に役立ち、信頼性の低いデータ(パリティ、チェックサム、CRCなど)を認識して破棄できるようになります。または、データのエラーを修正し、データを復元できる場合があります(ECCなど)。どちらの方法でも、バイトが取得または受信されてさらに処理されると、冗長データは破棄されます。バイトは中央の8ビット値のままであり、冗長データは冗長データのままです。
まず、あなたが参照しているチュートリアルは非常に時代遅れであるようであり、それを述べることなく、x86プロセッサの時代遅れのバージョンに向けられているようですので、そこで読んだ多くのことは他の人に理解されませんWORDが2バイトであると、人々はあなたが何について話しているのか分からないか、非常に古いx86プロセッサに基づいて教えられたことを知り、何を期待すべきかを知るでしょう)。
バイトは、だれかが決定するビット数です。8ビット、9ビット、または16ビットのいずれでも構いません。2016年、ほとんどの場合、1バイトは8ビットになります。安全のために、オクテットという用語を使用できます-オクテットは常に、常に8ビットです。
ここでの本当の混乱は、2つの質問を混乱させることです。1バイトのビット数は?2. 1つのバイトをある場所から別の場所に転送したい場合、または実際の物理的手段を使用してバイトを保存したい場合、どうすればよいですか?2番目の質問は、モデム、ハードドライブ、またはSSDドライブを製造している会社で働いている場合を除き、通常はほとんど関心がありません。実際には、最初の質問に興味があり、2番目の質問には「まあ、誰かがその世話をします」と言うだけです。
言及されたパリティビットは、バイトがメモリに格納され、後でバイトが読み取られたときに、メモリが偶然に変更されたことを検出するのに役立つプリミティブメカニズムです。2ビットが変更されたことが検出されないため、変更が検出されない可能性が高く、変更された8ビットのいずれかを検出する方法がないため、問題から回復できないため、それはあまり得意ではありません、またはパリティビットが変更された場合でも。
パリティビットは、そのプリミティブ形式では実際には使用されません。永続的に保存されるデータは、通常、より複雑な方法で保護されます。たとえば、1024バイトのブロックに32ビット以上のチェックサムを追加することにより、余分なスペースが大幅に少なくなり(この例では12.5%ではなく0.4%)何かが間違っているときに見つけられない可能性が低くなります。
WORD
s について話すとき、「WinAPI」と仮定します。これは、WinAPIの型名の多くが時代遅れですが、下位互換性のために保持されているため、ちょっとあなたの主張を証明します。xP
現代の使用法では、バイトは8ビットのピリオドです(ただし、これまでは他の定義がありました)。一方、データワードは、問題のハードウェアがアトミックユニットとして扱うもので、8ビット、9ビット、10ビット、12ビット、16ビット、20ビット、24ビット、32ビットなどです。長年にわたるシステムには、あらゆる種類の異なるワードサイズがありました。
メモリシステムまたは伝送プロトコルを実装するには、追加ビットを含むエラー検出/訂正を追加することが有益です。前述のように、バイトは8ビットであるため、9ビットのバイトを作成しません。
さまざまなスキームにより、さまざまな方法でエラー検出および/または修正が追加されます。
パリティの一般的な用途は、受信機がエラーの単一ビットを検出できるように、送信ワードに余分なビットを追加することです。
シングルビットのエラー訂正を提供できる方式には、32ビットのデータワードごとに4 ECCビットの追加が含まれます。これはたまたま1バイトあたり1ビットと算術的に等価ですが、そのように動作することはできません。1つの36ビットデータワードは、32ビットデータ空間のシングルビットエラーから回復するのに十分な情報を運ぶことができます。
8ビット。CPUとキーボードの内部では、9ビットと11ビットです。ただし、ユーザーデータは8ビットで表されます。キーボードのキーは、11ビットに分割された歌を送信します。1つの開始ビット、1つの終了ビット、1つのパリティビット、および押されたキーを表す8ビット。