2017-04-11 6 views
1

私はちょうど面白いことに気付きました、そして私はより良い理解を得ることを試みています。 私はIrvine WriteString呼び出しを使用しようとしました。アセンブリx86 Irvine WriteStringバイトとDword

がNULLで終わる文字列を書くWriteStringメソッド


入力:文字列へのDXポイントが

INCLUDE Irvine32.inc 

.data 
    fizz  BYTE "Fizz", 0 

...

MOV EDX, OFFSET fizz 
CALL WriteString 
CALL CrLf 

を相殺し、完全に私はちょうどdocumentationのように、私の窓に "フィズ" を見ることができます動作します。

私が代わりにBYTE

fizz  DWORD "Fizz", 0 

DWORDを使用しようとした場合しかし、私は、プロンプトウィンドウに "zziF" を参照してくださいするつもりです。 私が知る限り、唯一の違いはバイト単位のサイズ(8ビットと32ビット)です。 私は本当に逆の順序を理解していません。何が起こっていますか?

すべての回答に感謝します!

答えて

1

あなたの質問は「Irvine」または「WriteString」とはまったく関係ありません。

短い答えは何を見ていることは、あなたがリトルエンディアンあるIntel x86アーキテクチャ上でプログラミングしている、とあなたには、いくつかによって書かれたアセンブラを使用しているという事実の直接的な結果であるということです古いハッカー。

長い答えが続きます。

あなたは、アセンブリ言語を扱っているなら、あなたがウィキペディアや他のどこかでそれを見ることで、およそエンディアンを知ることですが、一言で言えば、それはバイトがに連続したメモリ位置に格納されている方法を定義するすべてを学ぶ必要がありますバイトより大きい量を形成する。

  • ビッグエンディアン、および
  • リトルエンディアン:エンディアンの2種類があります。

リトルエンディアンは、バイトより大きい量では、最下位( "ロー")バイトが最初に格納され、その後に連続してより重要なバイトが格納されることを意味します。その結果、DWORDでは、最下位(「低」)の語が最初に格納され、最上位(「高」)の語が続く。これは、高いバイトが最初に格納されるビッグエンディアンの反対です。ビッグエンディアンは直感的であると思うかもしれません。なぜなら、人間が数字をどのように表現しているかに一番近い桁が最も左の桁で、それ以下の数字はそれ以下であるからです。数字の重要性は左から右に、または右から左に並べるべきであるという数字の性質については何もありません。それどころか、リトルエンディアンにはハードウェアのメリットがあります。これはIntelがx86アーキテクチャに選択したものです。

しかし、私は逃げます。

だから、ここで何が起こっているかである。

あなたがスマートにしようとしている、とあなたは文字列リテラルを使用してDWORDの値を指定できるようにするために使用されているアセンブラ。 DWORDには、文字列ではなく32ビットの数字が含まれているはずですが、汚れたハッキン​​グに対応しようとしているため、これは無意味です。それは完全に恣意的です。なぜなら、そのようなクォークを実装できる方法がたくさんあるからです。彼らはただ一つの方法を選んだだけです。彼らが一番気に入ったものと思います。

これは明らかに、文字列リテラルを取り、それをDWORDを構成する4文字のグループとみなしているようです。もちろん、DWORDをメモリに保存するときは、インテルアーキテクチャに適したリトルエンディアン形式で保存します。つまり、「Fizz」ではなく「zziF」を取得します。この "zziF"はアセンブラによってプログラムに焼き付けられ、 "WriteString"関数はそれを見ているように出力することを理解することが重要です。文字列を出力する他の関数を使用していた場合も同様です。関数の失敗ではありません。

+0

ありがとうございました! さて、私は既に "FizzBu​​zz"をDWORDとして保存しようとしましたが、 "大きすぎる定数"のサイズのためにビルドエラーが発生しました。 サイズの制限についてはまだ分かりません。 しかし、私はエンディアンについて学んでいましたが、このようなことを引き起こす可能性はありますが、私は決してありません。 基本的には、DWORDの代わりにByteを使用すると、BYTEとして4つの文字チャンクがあり、ちょうどうまくいくと期待通りに動作する小さなエンディアンになります。 –

+1

はい、個々のバイトでエンディアンの問題は発生しません。 "大きすぎる定数"に関しては、明らかにアセンブラはDWORDに収まる文字列リテラルを期待しているので、4文字が限界です。コンマに続くゼロは、別の4バイトを占める別のDWORDとしてエンコードされます。楽しみのために、あなたはQWORDをサポートしているアセンブラを見てみることができます。 'zzuBzziF'を取得する必要があります。 –

+0

ありがとう、あなたは私をたくさん助けました!私たちの研究の例では、私はQWORDも見ていないし、まあ私は今日何か新しいことを学んだだけです。ありがとう!今私はzzuBzziFで遊ぶことができます!:) - –