Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Blatt 9 Aufgabe 5
Hi,
ich frage mich bei der 5a), ob wir auch immer den alten Wert des %ebp mit auf den Stack speichern sollen.
Tendiere mal zu ja, wollte aber mal nachfragen. Und wenn dem so ist, einfach die alte Adresse auf den Stack pushen? Oder reicht es wenn man old %ebp in den Stack schreibt?
Gruß
Der Basepointer ist auf x86 ein reines Konzept des Programms. Die CPU hat damit nichts zu tun. Wenn es keine Instruktionen gibt, die den [m]%ebp[/m] auf den Stack pushen, dann passiert da auch nichts.
Beim [m]call[/m] wird nur die Rücksprungadresse auf den Stack gepushed und an die angegebene Adresse gesprungen. Mehr passiert da nicht.
Wenn man sich bei sowas nicht sicher ist, einfach mal den Code in nem Debugger ausführen.
$ cat calls.s
a:
call b
push $0x42
call c
add $0x4, %esp
ret
b:
ret
c:
ret
main:
call a
push $0x43
call c
add $0x4, %esp
mov $0x0, %eax
ret
.globl _start
_start:
jmp main
Assemblieren:
$ as --32 -o calls.o calls.s
Linken:
$ ld -m elf_i386 calls.o
Und dann mit gdb ausführen und testen:
$ gdb ./a.out
[...]
(gdb) b _start
Breakpoint 1 at 0x804807b
(gdb) set disassemble-next-line yes
(gdb) r
Starting program: /home/rudis/a.out
Breakpoint 1, 0x0804807b in _start ()
=> 0x0804807b <_start+0>: eb e9 jmp 0x8048066 <main>
(gdb) si
0x08048066 in main ()
=> 0x08048066 <main+0>: e8 e9 ff ff ff call 0x8048054 <a>
(gdb)
0x08048054 in a ()
=> 0x08048054 <a+0>: e8 0b 00 00 00 call 0x8048064 <b>
(gdb) x/10x $esp
0xffffd8fc: 0x0804806b 0x00000001 0xffffda93 0x00000000
0xffffd90c: 0xffffdaa5 0xffffdac3 0xffffdada 0xffffdaed
0xffffd91c: 0xffffdb09 0xffffdb24
Damit kann man sich dann bequem den Stack anschauen und etwas experimentieren.
Die Stackadressen passen nicht, für die Aufgabe muss man sich das also noch selbst überlegen. Aber es hilft wenn man sich nicht sicher ist was passiert.
dem ist nichts mehr hinzuzuügen. Daumen hoch.
Vielen dank rudis