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:

Code: Alles auswählen

!extrn AllocConsole
!CALL AllocConsole
Tja, es funzt nicht. :cry: Gibt Fehler.

EDIT: Mann, vllt sollte ich auch mal in den AsmOutput guggen. :lol: *gehirn hat ausgesetzt* :D

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 :lol: :mrgreen:

Greetz,
AndyX

PS: Das soll kein größeres Projekt werden, nur um meine ASM-Kentnisse zu erweitern :mrgreen:

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 :mrgreen:
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. :mrgreen: :|

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? :roll:

EDIT: Außerdem soll das kein Compiler werden. Es soll ein ANFÜHRUNGSZEICHEN"Compiler"ANFÜHRUNGSZEICHEN werden.

Greetz,
AndyX