Entwickler-Ecke

Algorithmen, Optimierung und Assembler - [ASM] Error: Invalid combination of opcode and operands (D5)


maps - Do 11.05.06 00:24
Titel: [ASM] Error: Invalid combination of opcode and operands (D5)
Hallo.

Ich benutze in meinem jetzigen Schulprojekt eine Unit, die regen Gebrauch der Inline Assembler Fähigkeiten des Compilers übt.

Wenn ich mein Projekt samt Unit in Borland Delphi 7 kompiliere kommt es zu keinen Problemen.

In meiner Schule wird jedoch Delphi 5 benutzt und das weigert sich vehement die Unit zu übersetzen.

Ich bekomme die Fehlermeldung "Invalid combination of opcode and operands".

Betroffen sind solche Instruktionen:
"mov [eax-048h], 37026193h"
"call [ecx-064h]"
"movzx ebp, [ebp+00Ah]"

Ist es möglich jene Unit kompatibel zu Delphi 5 zu machen?

Falls nicht, ist es möglich die Unit mit Delphi 7 zu kompilieren und die erzeugte DCU in Delphi 5 zu verwenden?


Danke.


Allesquarks - Do 11.05.06 01:36

Hab selber auch nur Delphi 7. Daher rate ich mal, weil bei mir in Assembler die meisten Fehler wegen fehlender Größenangaben kommen, dass zumindest bei den "movxx"-Befehlen, vielleicht ein dword ptr abhilfe schafft.

Schwedisch ist für mich nur movzx ebp, [pointer];
Dachte das wäre nur auf ein register anwendbar. Nun ja wenn ich so spät am Abend nicht falsch liege heißt der Befehl mov with zero extension, was dann aber auf nen datentyp anderer Größe angewendet werden sollte, denn anders wäre es redundant => word ptr => was zur nächsten Frage führt: ist das auch auf nen Byte anwendbar, denn dann gäbe es ja ne Mehrdeutigkeit. Nun ja einfach mal ausprobieren. Wird schon schiefgehen :wink:


BenBE - Do 11.05.06 14:35

user profile iconmaps hat folgendes geschrieben:
Betroffen sind solche Instruktionen:
"mov [eax-048h], 37026193h"
"call [ecx-064h]"
"movzx ebp, [ebp+00Ah]"

Alle von Dir angesprochenen Befehle sind laut ASM unvollständig. Für die ersten beiden musst Du ein DWORD PTR ergänzen, für die dritte Anweisung bräuchte ich einmal den Kontext, da sowohl BYTE PTR als auch WORD PTR sinnvoll passen würden.

Beim Inline-Assembler von Delphi sollte man sich immer angewöhnen die gemeinte Größe der Operanden explizit mit anzugeben, auch wenn dies oftmals unnötig ist.


maps - So 14.05.06 12:26

Vielen Dank!

Alles funktioniert nun.