あなたの質問は「Irvine」または「WriteString」とはまったく関係ありません。
短い答えは何を見ていることは、あなたがリトルエンディアンあるIntel x86アーキテクチャ上でプログラミングしている、とあなたには、いくつかによって書かれたアセンブラを使用しているという事実の直接的な結果であるということです古いハッカー。
長い答えが続きます。
あなたは、アセンブリ言語を扱っているなら、あなたがウィキペディアや他のどこかでそれを見ることで、およそエンディアンを知ることですが、一言で言えば、それはバイトがに連続したメモリ位置に格納されている方法を定義するすべてを学ぶ必要がありますバイトより大きい量を形成する。
- ビッグエンディアン、および
- リトルエンディアン:エンディアンの2種類があります。
リトルエンディアンは、バイトより大きい量では、最下位( "ロー")バイトが最初に格納され、その後に連続してより重要なバイトが格納されることを意味します。その結果、DWORD
では、最下位(「低」)の語が最初に格納され、最上位(「高」)の語が続く。これは、高いバイトが最初に格納されるビッグエンディアンの反対です。ビッグエンディアンは直感的であると思うかもしれません。なぜなら、人間が数字をどのように表現しているかに一番近い桁が最も左の桁で、それ以下の数字はそれ以下であるからです。数字の重要性は左から右に、または右から左に並べるべきであるという数字の性質については何もありません。それどころか、リトルエンディアンにはハードウェアのメリットがあります。これはIntelがx86アーキテクチャに選択したものです。
しかし、私は逃げます。
だから、ここで何が起こっているかである。
あなたがスマートにしようとしている、とあなたは文字列リテラルを使用してDWORD
の値を指定できるようにするために使用されているアセンブラ。 DWORD
には、文字列ではなく32ビットの数字が含まれているはずですが、汚れたハッキングに対応しようとしているため、これは無意味です。それは完全に恣意的です。なぜなら、そのようなクォークを実装できる方法がたくさんあるからです。彼らはただ一つの方法を選んだだけです。彼らが一番気に入ったものと思います。
これは明らかに、文字列リテラルを取り、それをDWORD
を構成する4文字のグループとみなしているようです。もちろん、DWORD
をメモリに保存するときは、インテルアーキテクチャに適したリトルエンディアン形式で保存します。つまり、「Fizz」ではなく「zziF」を取得します。この "zziF"はアセンブラによってプログラムに焼き付けられ、 "WriteString"関数はそれを見ているように出力することを理解することが重要です。文字列を出力する他の関数を使用していた場合も同様です。関数の失敗ではありません。
ありがとうございました! さて、私は既に "FizzBuzz"をDWORDとして保存しようとしましたが、 "大きすぎる定数"のサイズのためにビルドエラーが発生しました。 サイズの制限についてはまだ分かりません。 しかし、私はエンディアンについて学んでいましたが、このようなことを引き起こす可能性はありますが、私は決してありません。 基本的には、DWORDの代わりにByteを使用すると、BYTEとして4つの文字チャンクがあり、ちょうどうまくいくと期待通りに動作する小さなエンディアンになります。 –
はい、個々のバイトでエンディアンの問題は発生しません。 "大きすぎる定数"に関しては、明らかにアセンブラはDWORDに収まる文字列リテラルを期待しているので、4文字が限界です。コンマに続くゼロは、別の4バイトを占める別のDWORDとしてエンコードされます。楽しみのために、あなたはQWORDをサポートしているアセンブラを見てみることができます。 'zzuBzziF'を取得する必要があります。 –
ありがとう、あなたは私をたくさん助けました!私たちの研究の例では、私はQWORDも見ていないし、まあ私は今日何か新しいことを学んだだけです。ありがとう!今私はzzuBzziFで遊ぶことができます!:) - –