[ASM] Brainfuck-compiler bauen

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Beitrag von DarkSoul »

Habs einfach mal hingeschrieben, das inline-asm im compiler aktiviert, - es läuft nicht... unbekanntes symbol bei CALL :twisted:
Habs auch ohne die mov's versucht, weil der befehl keine parameter hat und weil ich mich dunkel daran erinnere, dass ich irgendein register nicht unter pb benutzen darf. Muss ich ihm da vieleicht noch sagen, dass ich asm verwenden will, oder noch sowas, wie früher 'model tiny' etc. setzen?

Code: Alles auswählen

!MOV eax,0      ;keine Parameter
!MOV ebx,0
!MOV ecx,0
!MOV edx,0
!CALL AllocConsole
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: [ASM] Brainfuck-compiler bauen

Beitrag von ts-soft »

Biedermeier hat geschrieben: und zweitens: gibt es ein assembler, das ich kostenlos in meinen compiler fest einbauen kann, so dass ich nichts externes mehr brauche? :?
http://www.purebasic.fr/english/viewtop ... light=fasm
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Beitrag von DarkSoul »

Sogar mit PB-datei usw. Muss ich die funktionen nicht von hand ausser dll rauspulen :allright:

Hab mir jetzt das hier überlegt:
hab den brainfuck-interpreter, den ich schon mal geschrieben hab, auf komplett api umgeschrieben, so dass keine userlibs mehr beteiligt sind.
Da hab ich ne datasection untergesetzt, wo das brainfuck-programm rein soll.
Das ganze kriegt mein brainfuck-compiler in die datasection
Mein programm wird folgendes tun sollen:

1. Das brainfuck-programm an seine stelle einsetzen
2. den interpeter+brainfuck aus der datasection des bf-compilers nach ASM übersetzen (wird dann trotzen nur interpretiert und die exe ist um den interpreter-programm größer, aber bei brainfuck wohl nicht so schlimm :wink: ) das wird der fummelige und buggige teil, besonders die ganzen if's vom interpreter... aber dafür kann man die funktionsweise einfach ändern, indem man nur den interpreter verändert.
3. Durch den assembler jagen
4. Abspeichern! Fertig!

Lieber wäre mir, das brainfuck direkt zu übersetzen, ohne den interpreter dazwischen, so dass die exe wesentlich kleiner wird, aber das krieg ich glaub ich nicht hin, weil ich mich mit dem interpreter schon so schwer getan habe...

vorrausgesetzt, ich krieg das mit CALL hin!!!

dann wünscht mir mal viel glück :freak:
Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Beitrag von DarkSoul »

andere ASM-Programme ausm forum funktionieren auch nicht in meinem pb. muss ich da wat umstellen??? (außer inline-asm-support, der schon an ist)
Bild
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

1. Um die Console (http://msdn2.microsoft.com/en-us/library/ms681944.aspx) mit WinAPI zu öffnen, geht das folgendermaßen (in PureBasic, sollte man leicht in Assembler umwandeln können):

Code: Alles auswählen

Import "kernel32.lib"
  AllocConsole.b() ;/ PureBasic: OpenConsole()
  FreeConsole.b() ;/ PureBasic: CloseConsole()
  
  ;#STD_ERROR_HANDLE
  ;#STD_INPUT_HANDLE
  ;#STD_OUTPUT_HANDLE
  GetStdHandle(nStdHandle) ;/ Gibt den Console-Handle zurück.
  
  WriteConsoleA.b(hConsoleOutput, *lpBuffer, nNumberOfCharsToWrite, lpNumberOfCharsWritten, lpReserved) ;/ Schreibt in die Console
EndImport

AllocConsole()

Define hConsoleOutput.l = GetStdHandle(#STD_OUTPUT_HANDLE)

Define String$ = "Genauso wie der Befehl Print von PureBasic!"
WriteConsoleA(hConsoleOutput, @String$, Len(String$), 0, #Null)

Delay(1000)

FreeConsole()

End
2. In PureBasic-Lounge gibt es jemand, der nen kleinen Compiler mit PureBasic geschrieben hat. Siehe http://www.purebasic-lounge.de/viewtopi ... t=compiler. Ich kann dir Hilfe bei der Programmierung deines Compilers geben, da ich den Code zum großteil versteht und im moment auch gerade bei der Programmierung eines Mini-Compilers bin.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

AllocConsole.b()
Ist Boolean, also Long! nicht Byte
Ist aber in PB bereits deklariert
Selbst wenn Byte reichen würde, verlangsamt das nur die Ausführung

yust my 2 cents
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Biedermeier hat geschrieben:

Code: Alles auswählen

!MOV eax,0      ;keine Parameter
!MOV ebx,0
!MOV ecx,0
!MOV edx,0
!CALL AllocConsole
Haut mich wenn ich das jetzt falsch sage aber Win-API arbeitet mit StdCall-Konvention. Das heisst die Parameter werden alle in umgekehrter Reihenfolge auf den Stack gepusht. Der Rückgabewert wird in eax geschrieben.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Beitrag von DarkSoul »

Er führt CALL mit nix aus. er sagt immer, dass die funktion zum aufrufen immer nicht definiert ist. stdcall? mit PUSH hab ichs auch schon probiert. Aber ohne alles vorweg gehts auch nicht. eax ist meine ich einfach sozusagen das 'procedurereturn' von den api-befehle.
Bild
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Beitrag von Green Snake »

Du musst bei Call auch eine Adresse angeben, und nicht eine leere Variable ;)

D.h: Fülle die Variable erst mit der entsprechenden adresse zur Funktion.
-.-"
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Beitrag von DarkSoul »

Laut kaero soll ich mit call die api's aufrufen können - hä? adresse? wie jetzt /:-> ich möchte mit ASM das Konsolenfenster öffnen. Also mit reinem Asm, unabhängig von pb, so dass es direkt assembliert wird.
Bild
Antworten