2016-12-08 2 views
0

J'ai de la difficulté à comprendre ce qui se passe ici, en ce qui concerne ce qui se trouve sur la pile, et où les registres ESP, EBP et SS pointent vers au point dans le code qui dit ICI. Voici mon codeAssemblage - Pile, Procédures, ESP, EBP, SS - Aidez-moi à comprendre

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 

donc je dois voir ce qui est sur la pile.

Voici ma meilleure estimation que l'endroit où tout est (ci-dessous est une pile de texte)

My Attempt 2.0

+0

Vous devez lire le manuel sur ce que le 'enter' fait. Astuce: il ne pousse pas les deux opérandes sur la pile. En outre, 'ESP' pointera toujours vers ce qui est connu sous le nom de _top de stack_, qui dans votre dessin est en réalité en bas. – Jester

+0

@Jester J'aurais dû dire que dans cette pile, il pousse de bas en haut, donc d'abord en dernier. Je lis entrer crée un cadre de pile, et quitte détruit ce cadre de pile. Je ne comprends tout simplement pas. Toute aide supplémentaire serait géniale. Merci pour votre commentaire. – tay1392

+0

Si votre pile se développe de bas en haut, c'est encore pire bien sûr. La première chose mise sur la pile est 42, donc par cette logique qui devrait être au fond. PS: vous pouvez faire un pas du code dans un débogueur et voir ce qui se passe à chaque instruction;) – Jester

Répondre

1

La pile ressemblera:

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

Vous pouvez bien sûr voir cela dans un débogueur:

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 est le segment de pile, il est prédéfini par le système d'exploitation, il ne pointe nulle part mais a l'adresse de base 0 et n'est pas modifié.

Notez que enter x, 0 équivaut à:

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

Merci une tonne @jester. Cela aide vraiment. – tay1392