2012-03-11 5 views
0

私は次のコードを持っている:私は確認したようアセンブリ - ecx = espでの0x80の使い方は?

Doit: mov eax, 4 ; for write system call 
     push Dword, 0x44434241 
     mov ebx, 1 
     mov ecx, esp 
     mov edx, 4 
     int 0x80 
     add esp, 4 
     ret 

を、それは印刷 "ABCD" ですが、なぜですか? - ESP、

すなわちESPはポイントが0x44のにある0x41 0x42 0x43 0x44 ---

低:私はそれを理解されるように、スタックの上に私たちは、次の写真を持っています。 0x80を呼び出すとき。 "DCBA"を印刷する必要があります。私が忘れたのは?

答えて

2

あなたの写真が間違っています。 x86はリトルエンディアンアーキテクチャなので、ESPはプッシュされた値の最下位バイトのアドレス、つまり0x41に等しくなります。 Intel's priceless Architecture Developer's Manualから

:アイテムがスタックにプッシュされている場合

、プロセッサは ESPレジスタをデクリメントし、スタックの新しい最上位にアイテムを書き込みます。

+0

私が理解しているように、私たちはespを押してからプッシュします。つまり、プッシュ命令の開始点はespになり、次のピクチャが得られます:esp-0x41 0x42 0x43 0x44 - (esp beforeプッシュされた)。 –

+1

これはスタック設定とは関係ありません。正しいリトルエンディアンストレージの場合は、値:0x41424344を押してください。 –

+0

@BrettHale:あなたはそうです、私は "Low"と "esp"を間違って示すダイアグラムに対処しようとしていて、明らかに自分自身をプロセスに混乱させました。私はそれを訂正した。 – DCoder

1

これはちょうどendiannessの問題です。スタック上に32ビットの値をプッシュするだけです。アドレスはESPになります。 x86はリトルエンディアンで、最下位バイトを先に格納します。

ESP + 0(0x41)、ESP + 1(0x42)、ESP + 2(0x43)、ESP + 3(0x44)。ただし、バイトの配列としてアクセスすると、をESPで開始し、メモリをインクリメントします。

ありがとうございました無しスタックの使用に間違いがありますが、それはワード/ dword/qwordストレージとバイトアクセスの誤解です。

関連する問題