WinAPI in Assembler

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

WinAPI in Assembler

Beitrag 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:
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag 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
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag von traumatic »

format MS COFF ?
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

THX jetzt sollte es gehen. :) Muss aber noch genau testen.

Danke nochmal

Greetz,
AndyX
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag 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
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Natürlich linken ^^. Versuchs mal mit Pelles Linker. der ist auch bei PB dabei.
Bild
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag 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
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Du musst natürlich auch die Kernel32.lib angeben. Woher soll der Linker sonst wissen wo diese externen Funktionen liegen?
Bild
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag 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?
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

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