ASM Parameter und Rücksprung

Fragen zu allen anderen Programmiersprachen.
Norbie
Beiträge: 134
Registriert: 29.08.2004 12:45
Wohnort: Chemnitz
Kontaktdaten:

ASM Parameter und Rücksprung

Beitrag 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....
http://www.nevu.de/ Künstliche Intelligenz, die letzte Herausforderung!
Benutzeravatar
Eric
Beiträge: 303
Registriert: 05.09.2004 09:50
Wohnort: Göttingen

Re: ASM Parameter und Rücksprung

Beitrag 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
El_Choni_work: cant't you just spit the binary data to sqlite, as you would spit a hamster into a microwave oven?
* Fangles falls off the chair laughing
Bild
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

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

Gruss
Helle
Norbie
Beiträge: 134
Registriert: 29.08.2004 12:45
Wohnort: Chemnitz
Kontaktdaten:

Beitrag 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?
http://www.nevu.de/ Künstliche Intelligenz, die letzte Herausforderung!
Benutzeravatar
Eric
Beiträge: 303
Registriert: 05.09.2004 09:50
Wohnort: Göttingen

Beitrag 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
El_Choni_work: cant't you just spit the binary data to sqlite, as you would spit a hamster into a microwave oven?
* Fangles falls off the chair laughing
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Normalerweise schreibt man auch

Code: Alles auswählen

  push ebp
  mov ebp,esp
  sub esp,irgendwas ;für lokale Variablen
  ...
  leave
ret
;)
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Eric
Beiträge: 303
Registriert: 05.09.2004 09:50
Wohnort: Göttingen

Beitrag 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:
El_Choni_work: cant't you just spit the binary data to sqlite, as you would spit a hamster into a microwave oven?
* Fangles falls off the chair laughing
Bild
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Antworten