2011-12-15 3 views
0

に単語を追加します。総会は、私は次のコードを持ってEAX

私が理解できるように、メモリは次のようになります。FE00ABBC

、そのために、次のコマンドが動作するはずです:

mov eax, 0x010000101 
add dword [Var1], eax 

しかし、この1つが働いている:

mov eax, 0x01010001 
add dword [Var1], eax 

なぜ?ありがとう。

+0

エンディアンが正しいことを確認する必要があります。 –

答えて

0

メモリマップが間違っているようです。私はこれを次のように解釈します:

BCAB00FE 
^ ^
|  | 
MSB LSB 

これは、あなたが見る動作を正確に説明するものです。

+1

いいえ、彼の記憶マップは正しいです。 – hirschhornsalz

+0

まあ、実際に彼は自分のメモリマップのローエンドがどこにあるのかを示していませんでした。私はちょうど左下を仮定しました(普通はバイトが左から右に読み込まれます。もう一度見た後、私はあなたが正反対であると思っています。 – hirschhornsalz

+0

@drhirsch:私の前提は、OPが見る動作を説明するという事実によって支持されています。問題は、彼がメモリマップで左から右に読んでいるが、eaxでは右から左に読んでいるということです。 –

1

あなたの問題は、あなたがアーキテクチャのendiannessを考慮しなかったことにあります。

+0

これで問題は解決しません。問題は、3つの変数を間違った順序でメモリに入れてしまうことです。あなたがしたことは、仲介者として 'ebx'を使うことを除いて、まさに彼がしたことです。 –

+0

実際には解決しないため、最後の部分を削除しました。しかし、私は問題は私が述べたようにエンディアンであると思う。 – gusbro

0

achitecureはローエンド、最下位ビットは最も低いメモリアドレスにあります。これは、通常の洋書の書き方の逆です。

メモリはあなたが説明したとおりに見えますが、それがロードされイストとき、一見逆になり:

`FE 00 AB BC` 
low high address 

mov eax, 0x1010001 

01 00 01 01 
low high byte in eax 

あなたが書くために左からそれを書くのであれば、EAXの内容は今01010001です。

アセンブラソースで数値定数を書き込む順序が実際にメモリに格納される順序と異なるため、この問題が発生します。

関連する問題