Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Assembler ::  byte an Prozedur als Parameter übergeben und dann mit call aufrufen?  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Developer30
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
Beitrag 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? :confused:

Mit freundlichen Grüßen,
Developer30
NNN
Unregistrierter




Beitrag 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
Beitrag 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




Beitrag 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




Beitrag 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
Beitrag 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.

Assembler:
push ax
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




Beitrag 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
Beitrag 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




Beitrag 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
Beitrag 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 :)
c++.de :: Assembler ::  byte an Prozedur als Parameter übergeben und dann mit call aufrufen?  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.