2016-12-08 10 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 

Так что мне нужно, чтобы увидеть, что на стеке.

Вот моя догадка о том, где все (ниже текст стека)

My Attempt 2.0

+0

Вам нужно прочитать инструкцию о том, что делает 'enter'. Подсказка: он не выталкивает два операнда в стек. Кроме того, 'ESP' всегда будет указывать на то, что известно как _top стека_, которое на вашем рисунке фактически находится внизу. – Jester

+0

@Jester Я должен был сказать, что в этом стеке он растет снизу вверх, поэтому сначала в конце. Я прочитал ввод, создав фрейм стека, и оставил уничтожить этот стек. Я просто не совсем понимаю это. Больше всякой помощи было бы здорово. Спасибо за ваш комментарий. – tay1392

+0

Если ваш стек растет снизу вверх, то это, конечно, еще хуже. Первое, что ставится на стек, - 42, поэтому по этой логике должно быть внизу. PS: вы можете сделать один шаг кода в отладчике и посмотреть, что происходит с каждой инструкцией;) – Jester

ответ

1

Стек будет выглядеть следующим образом:

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

Конечно, Вы можете увидеть это в отладчик:

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 это сегмент стека, он задан ОС, он не указывает нигде, но имеет базовый адрес 0 и не изменяется.

Обратите внимание, что enter x, 0 эквивалентно:

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

Спасибо тонну @jester. Это действительно помогает. – tay1392