| Autor |
Nachricht |
Developer30
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
|
Developer30 Mitglied
23:08:10 12.04.2012 Titel: |
byte an Prozedur als Parameter übergeben und dann mit call aufrufen? |
Zitieren |
Hallo,
in MASM32 gibt es ja 2 Möglichkeiten Funktionen aufzurufen - call und invoke. Ich habe eine Prozedur:
| Assembler: | | EineProzedur proc sFoo:dword, iSize:dword, iNumber:byte | |
Bevor ich diese mit call aufrufe, muss ich ja die Parameter auf den Stack tun. Bytes kann man aber nicht pushen. Wie kann ich die Parameterübergabe dann korrekt bewerkstelligen?
Mit freundlichen Grüßen,
Developer30 |
|
|
|
 |
NNN
Unregistrierter
|
NNN Unregistrierter
23:31:25 12.04.2012 Titel: |
|
Zitieren |
Du musst das BYTE in ein DWORD packen. Der Assembler kontrolliert bei der Parameteruebergabe, das der Wert
dieses DWORDs im Bereich 0 - 255 (BYTE) liegt. |
|
|
|
 |
Developer30
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
|
Developer30 Mitglied
23:43:22 12.04.2012 Titel: |
|
Zitieren |
muss ich immer ein DWORD übergeben? wenn z.B. jetzt ein WORD habe, könnte ich das ja direkt auf den Stack tun. |
|
|
|
 |
NNN
Unregistrierter
|
NNN Unregistrierter
00:05:41 13.04.2012 Titel: |
|
Zitieren |
Der push Befehl funktioniert in einem 32 Bit Programm nur mit 32 Bit Werten = DWORD. Also WORD in DWORD packen usw.
Wenn Du 16 Bit Programme schreibst, ist das anders - da kann man nur WORD (16 Bit) mit einem push Befehl auf den Stack legen. |
|
|
|
 |
masm
Unregistrierter
|
masm Unregistrierter
00:06:08 13.04.2012 Titel: |
|
Zitieren |
| NNN schrieb: | Der Assembler kontrolliert bei der Parameteruebergabe, das der Wert
dieses DWORDs im Bereich 0 - 255 (BYTE) liegt. |
nein, das tut er nicht.
Aber Achtung: ältere MASM-Versionen haben eine ziemlich berühmten Bug im invoke-macro, bei dem für BYTE-Parameter falschen Code erzeugt wird!
Grundsätzlich ist es besser, nur Parametertypen zu nehmen, die ein Vielfaches von 4 sind. Alles andere als pointer oder entsprechend erweitern. (z.B. mit movzx oder movsx) |
|
|
|
 |
Developer30
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
|
Developer30 Mitglied
00:22:25 13.04.2012 Titel: |
|
Zitieren |
| NNN schrieb: | Der push Befehl funktioniert in einem 32 Bit Programm nur mit 32 Bit Werten = DWORD. Also WORD in DWORD packen usw.
Wenn Du 16 Bit Programme schreibst, ist das anders - da kann man nur WORD (16 Bit) mit einem push Befehl auf den Stack legen. | hm komisch.
funktioniert in meinem 32bit Programm ohne error.
| masm schrieb: | | ältere MASM-Versionen haben eine ziemlich berühmten Bug im invoke-macro, bei dem für BYTE-Parameter falschen Code erzeugt wird! | ich möchte ja call benutzen |
|
|
|
 |
masm
Unregistrierter
|
masm Unregistrierter
00:41:53 13.04.2012 Titel: |
|
Zitieren |
| Developer30 schrieb: | | funktioniert in meinem 32bit Programm ohne error. |
Sollte es auch, ist aber trotzdem schlecht (performance).
Wenn du WinAPI Funktion aufrufen willst, muss das stack algiment (=N*4) stimmen, da es Funktionen gibt, die bei misalignment ein exception auslösen.
Besser ist z.B.:
| Code: | movzx/movsx eax,...
push eax
push arg2
push arg1
call Fnc
;add esp,3*4 ; wenn c-call | | |
|
|
|
 |
Developer30
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
|
Developer30 Mitglied
00:57:26 13.04.2012 Titel: |
|
Zitieren |
in den meisten Fällen kommt man mit DWORD ja hin. Aber wenn ich wie ganz oben ein BYTE habe, dann kann ich das in ein DWORD reinschreiben und das pushen? Und wird es nachher auch als Parameter wieder richtig eingelesen? |
|
|
|
 |
masm
Unregistrierter
|
masm Unregistrierter
01:03:10 13.04.2012 Titel: |
|
Zitieren |
| Developer30 schrieb: | | in den meisten Fällen kommt man mit DWORD ja hin. Aber wenn ich wie ganz oben ein BYTE habe, dann kann ich das in ein DWORD reinschreiben und das pushen? Und wird es nachher auch als Parameter wieder richtig eingelesen? |
ja. Die Parametergröße wird entsprechend dem algiment aufgerundet: wenn du ein BYTE deklarierst, werden trotzdem 4 BYTE für den Parameter reserviert – es wird dann halt nur das niederwertigste BYTE im DWORD verwendet. |
|
|
|
 |
Developer30
Mitglied
Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
|
Developer30 Mitglied
01:08:02 13.04.2012 Titel: |
|
Zitieren |
| masm schrieb: | | es wird dann halt nur das niederwertigste BYTE im DWORD verwendet. | ah ok. danke |
|
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|