2016-12-08 6 views
0

ここで何が起こっているのか、スタックの内容、ESP、EBP、SSレジスタのどこにここに書かれているコードのところで。 ここだから私はスタック上に何があるか確認する必要が私のコードアセンブリ - スタック、プロシージャ、ESP、EBP、SS - 理解してください

include \masm32\include\masm32rt.inc 
.data? 
    value DWORD ? 
.code 
start: 
    push 42 
    push 5 
    call xyz 
    mov value, EAX 
    print str$(value) 
    exit 
xyz: 
    enter 4, 0 
    ; HERE 
    leave 
    ret 8 
end start 

です。

42 
5 
return address 
previous ebp pushed by "enter"; new ebp points here 
4 uninitialized bytes due to "enter"; esp points here 

あなたはもちろんでこれを見ることができます:

ここで私の最高の推測では、すべてが、スタックは次のようになります(テキストスタック下にある)

My Attempt 2.0

+0

あなたは 'enter'が何をするかについてのマニュアルを読む必要があります。enter x, 0はと等価であること

は注意してください。ヒント:2つのオペランドをスタックにプッシュしません。また、 'ESP'は常に、stack_の_topとして知られているものを指しています。これは、実際には下図のようになります。 – Jester

+0

@Jester私は、このスタックでは底から上に向かって成長していると言っていたはずです。私はEnterを読んでスタックフレームを作成し、そのスタックフレームを破壊したままにします。私はそれをかなり理解していないだけです。これ以上の助けがあれば素晴らしいだろう。ご意見ありがとうございます。 – tay1392

+0

スタックがボトムアップから成長する場合は、さらに悪化します。スタックに置かれる最初のものは42です、そのロジックによって、底にあるはずです。 PS:デバッガでコードをシングルステップ実行して、各命令で何が起こるかを確認できます;) – Jester

答えて

1

ある場合にようですデバッガ:

6  push 42 
(gdb) s 
start() at test.s:7 
7  push 5 
(gdb) 
start() at test.s:8 
8  call xyz 
(gdb) p/x $eip+5 
$5 = 0x80483e5   # This is the return address (call is 5 bytes) 
(gdb) p/x $ebp 
$6 = 0xffffda78  # This is the ebp in the caller 
(gdb) s 
xyz() at test.s:11 
11  enter 4, 0 
(gdb) 
12  leave 
(gdb) p/x $ebp 
$7 = 0xffffd9ec  # This is the current ebp 
(gdb) p/x $esp 
$8 = 0xffffd9e8  # This is esp 
(gdb) x/x $esp 
0xffffd9e8: 0x0804841b # Top of stack, 4 garbage bytes, esp points here 
(gdb) x 
0xffffd9ec: 0xffffda78 # Saved ebp, current ebp points here 
(gdb) x 
0xffffd9f0: 0x080483e5 # Return address 
(gdb) x 
0xffffd9f4: 0x00000005 # argument "5" 
(gdb) x 
0xffffd9f8: 0x0000002a # argument "42" 

SSスタックセグメントで、OSによってプリセットされていますが、どこでもポイントしませんが、ベースアドレスは0で変更されません。

push ebp 
mov ebp, esp 
sub esp, x 
+0

ありがとうございます@jester。これは本当に役立ちます。 – tay1392

関連する問題