Seite 1 von 4
WinAPI in Assembler
Verfasst: 16.05.2005 20:29
von AndyX
Hallo,
mich beschäftigt mal wieder n Problem. Also ich möchte ne Art "Compiler" schreiben, und zwar code ich einen meiner Interpreter so um, dass er ASM Code erzeugt, und diesen lasse ich dann von FASM zu einer EXE compilieren.
So weit, so gut. Jetzt stellt sich mir nur das Problem, dass ich eine Console öffnen will. Ich kenne den WinAPI-Befehl "AllocConsole()". Jetzt hab ich also versucht:
Tja, es funzt nicht.

Gibt Fehler.
EDIT: Mann, vllt sollte ich auch mal in den AsmOutput guggen.

*gehirn hat ausgesetzt*
EDIT2: Habe raus gefunden, dass man da anscheinend nur ein _ vorsetzen muss bei den API Functions. Habs nämlich auch noch bei Sleep ausprobiert und es ging...

Naja WinAPI und Assembler war mir schon immer ein wenig voraus
Greetz,
AndyX
PS: Das soll kein größeres Projekt werden, nur um meine ASM-Kentnisse zu erweitern

Verfasst: 16.05.2005 23:06
von AndyX
So. Weiteres Problem.
Habe nun mal zum Testen ein Version gemacht und mal einen ASM Code generieren lassen. Wenn ich das jetzt dann an z.B. FASM schicke, oder an Inline ASM, sagt er mir:
---------------------------
jaPBe - Compiler Fehler
---------------------------
Line 3 - '_AllocConsole' is not a valid operator
---------------------------
OK
---------------------------
Hier ist der generierte ASM Code:
Code: Alles auswählen
;====>> ASM Code generated by C^^
extrn _AllocConsole
extrn _Beep
extrn _ExitProcess
extrn _FreeConsole
extrn _Sleep
section '.text' code readable executable
CMP dword[v_nme],dword[v_nmd]
PUSH dword 1000
PUSH dword 200
CALL _Beep
ADD dword[v_nme],dword[v_nmd]
SUB dword[v_nme],dword[v_nmd]
MOV eax,dword[v_nme]
IMUL dword[v_nmd]
ADD eax,edx
MOV dword[v_nme],eax
MOV ebx,dword[v_nme]
MOV eax,ebx
MOV ebx,dword[v_nmd]
CDQ
IDIV ebx
MOV ebx, eax
MOV dword[v_nme],ebx
CALL _AllocConsole
PUSH 2000
CALL _Sleep
section '.data' data readable writeable
nme: dd 324
nmd: dd 454
Hier noch der Code vorher, also den den der ""Compiler"" übersetzt.
Code: Alles auswählen
variable nme 324
variable nmd 454
vergleiche nme nmd
beep 200 1000
plus nme nmd
minus nme nmd
multi nme nmd
divid nme nmd
öffne
warte 2000
Wahrscheinlich hab ich beim ASM Übersetzen Mist gebaut

Wenn ihr den Source des ""Compilers"" braucht, sagts mir.
Hoffe ihr könnt euch draus nen Reim machen.
Greetz,
AndyX
Verfasst: 17.05.2005 00:10
von traumatic
format MS COFF ?
Verfasst: 17.05.2005 11:02
von AndyX
THX jetzt sollte es gehen.

Muss aber noch genau testen.
Danke nochmal
Greetz,
AndyX
Verfasst: 17.05.2005 11:57
von AndyX
So ich habe jetzt folgenden Code: (nochmals überarbeitet

)
Code: Alles auswählen
;====>> ASM Code generated by C^^
format MS COFF
extrn _AllocConsole
extrn _Beep
extrn _ExitProcess
extrn _FreeConsole
extrn _Sleep
section '.text' code readable executable
MOV eax,dword 324
MOV dword[v_nme],eax
MOV eax,dword 454
MOV dword[v_nmd],eax
MOV eax,dword[v_nme]
CMP eax,dword[v_nmd]
PUSH dword 1000
PUSH dword 200
CALL _Beep
MOV eax,dword[v_nmd]
ADD dword[v_nme],eax
MOV eax,dword[v_nmd]
SUB dword[v_nme],eax
MOV eax,dword[v_nme]
IMUL dword[v_nmd]
ADD eax,edx
MOV dword[v_nme],eax
MOV ebx,dword[v_nme]
MOV eax,ebx
MOV ebx,dword[v_nmd]
CDQ
IDIV ebx
MOV ebx, eax
MOV dword[v_nme],ebx
CALL _AllocConsole
PUSH 2000
CALL _Sleep
section '.data' Data readable writeable
v_nme rd 1
v_nmd rd 1
Diesen hab ich jetzt an FASM geschickt. Gut, der hat mir ne OBJ Datei zurückgeschickt.
Was soll ich jetzt mit der OBJ anfangen?
Greetz,
AndyX
Verfasst: 17.05.2005 11:58
von MVXA
Natürlich linken ^^. Versuchs mal mit Pelles Linker. der ist auch bei PB dabei.
Verfasst: 17.05.2005 12:04
von AndyX
Ja linken, da hätt ich auch selber draufkommen können

Das ist die polink.exe, oder? Naja, ich habs versucht die Object draufzuziehen, geht nich. Vllt braucht das irgendwelche Zusatz-Parameter?!
EDIT: Da öffnet sich immer ganz schnell ein Konsolenfenster wenn ich das versuche zu linken. Hab mal n Screenshot gemacht und da steht:
polink.exe hat geschrieben:POLINK: error: Unresolved external symbol '_Beep'.
POLINK: error: Unresolved external symbol '_AllocConsole'.
usw...
Hm ich glaube die wolln mich verarschen.
Greetz,
AndyX
Verfasst: 17.05.2005 12:36
von MVXA
Du musst natürlich auch die Kernel32.lib angeben. Woher soll der Linker sonst wissen wo diese externen Funktionen liegen?
Verfasst: 17.05.2005 12:54
von traumatic
Ohne Dir zu Nahe treten zu wollen:
Meinst Du nicht, Dein Projekt ist so 5-6 Hochhäuser zu groß für Dich?
Dein Enthusiasmus in allen Ehren, aber mal im Ernst, wie soll man einen
Compiler schreiben können, wenn man nicht einmal die Grundprinzipien
kennt?
Durfte ich das schreiben?
Verfasst: 17.05.2005 13:02
von AndyX
Siehe mein ersten Post:
Das mach ich nur, um meine Assembler-Kentnisse zu erweitern. Das soll nix großes werden. Darf man jetzt nicht mal mehr aus Spaß irgendwas witziges proggen?
EDIT: Außerdem soll das kein Compiler werden. Es soll ein ANFÜHRUNGSZEICHEN"Compiler"ANFÜHRUNGSZEICHEN werden.
Greetz,
AndyX