Seite 1 von 1

ASM Parameter und Rücksprung

Verfasst: 07.09.2005 16:54
von Norbie
Hi.
Ich versuche mich gerade in die Welt von ASM einzuarbeiten.
Um mir die Arbeit zu erleichtern, erarbeite ich mir FUnktionen und will die Standartform für Parameter nutzen: eine Beispielfunktion sieht nun so aus:

Code: Alles auswählen

show:
                push eax
                push ebx
                push ecx
                push edx

                mov eax, [esp+20] ;Meinen übergebenen Parameter holen

                push eax
                jmp show_datenende
                show_daten dd 0
                show_datenende:
                call len
                mov ebx, eax
                pop eax
                invoke WriteConsole, [console_output], eax, ebx, show_daten, 0

                pop edx
                pop ecx
                pop ebx
                pop eax
                add esp,8 ;Die letzen 2 sachen auf dem stack "Löschen", den Parameter und die Rücksprungadresse
jmp dword [ebp-4] ; hier müsste eigentlich die Rücksprungadresse stehen

Leider stürtzt das Programm mit einer schutzverletzung ab....

Re: ASM Parameter und Rücksprung

Verfasst: 07.09.2005 19:36
von Eric
Norbie hat geschrieben:

Code: Alles auswählen

add esp,8 ;Die letzen 2 sachen auf dem stack "Löschen", den Parameter und die Rücksprungadresse
jmp dword [ebp-4] ; hier müsste eigentlich die Rücksprungadresse stehen

Leider stürtzt das Programm mit einer schutzverletzung ab....
Ich habs nur mal kurz überflogen, aber einmal ließe sich das ganz gut durch

Code: Alles auswählen

ret 8
ersetzen

Verfasst: 07.09.2005 21:01
von Helle
Register EBP muss als allererstes (direkt nach show:) mit MOV EBP,ESP gesetzt werden. Sonst zeigt die Rücksprungadresse sonstwohin.

Gruss
Helle

Verfasst: 08.09.2005 07:20
von Norbie
dann würde ich ja ebp verändern ohne es rückgängig machen zu können! Die Sache mit dem ret 8 scheind gut zu funktioniren.

Noch eine andere Frage. Wenn ich zwei Parameter über den Stack übergeben habe muss ich wohl ret 12 benutzen oder?

Verfasst: 08.09.2005 09:08
von Eric
Normalerweise belegt im PMode jeder Parameter 4 Byte auf dem Stack.
D.h., dass du für jeden Parameter den Wert um 4 erhöhen musst.
Norbie hat geschrieben:dann würde ich ja ebp verändern ohne es rückgängig machen zu können!
Normalerweise schreibt man auch

Code: Alles auswählen

push ebp
mov ebp,esp
sub esp,irgendwas ;für lokale Variablen
...
mov esp,ebp
pop ebp
ret

Verfasst: 08.09.2005 16:37
von Deeem2031
Normalerweise schreibt man auch

Code: Alles auswählen

  push ebp
  mov ebp,esp
  sub esp,irgendwas ;für lokale Variablen
  ...
  leave
ret
;)

Verfasst: 08.09.2005 16:41
von Eric
Ich hatte aber mal gelesen, dass leave langsamer sein soll:
Therefore, you may use the instruction for the standard procedure exit code if you have an 80286 or later microprocessor. On an 80386 or earlier processor, the leave instruction is shorter and faster than the equivalent move and pop sequence. However, the leave instruction is slower on 80486 and later processors.
:wink:

Verfasst: 08.09.2005 16:45
von Deeem2031
Na wenn das so ist dann hat Microsoft mit ihren dlls wieder scheiße gebaut, alle Procs in der kernel32.dll sind nämlich so aufgebaut.