| 
				
					|  | Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
 |  
 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |  
		| Autor | Nachricht |  
		| storky 
 
  
 Anmeldungsdatum: 06.01.2013
 Beiträge: 68
 
 
 | 
			
				|  Verfasst am: 11.01.2013, 20:28    Titel: Bin ohne Header kompilieren? |   |  
				| 
 |  
				| Abend, 
 wieder mal eine Frage... diesmal vielleicht etwas ungewöhnlich. Also, ist es möglich mit FB ein Programm in *.bin zu kompilieren. Also ohne jegliche Header nur das reine, binäre Programm?
 
 Obwohl ich in dem Fall eh viel mit ASM / End ASM mache, möchte ich stellenweiße nicht auf Hochsprache verzichten. In Assembler komm ich zu schnell durcheinander durch fehlende Abstraktion.
   
 Nachtrag.. ich kann mir die Antwort schon denken, der FB Windowskompiler wird wohl Windowsprogramme kompilieren.
  |  |  
		| Nach oben |  |  
		|  |  
		| storky 
 
  
 Anmeldungsdatum: 06.01.2013
 Beiträge: 68
 
 
 | 
			
				|  Verfasst am: 11.01.2013, 20:33    Titel: |   |  
				| 
 |  
				| Und diese Funktionalität in den Source zu bringen, kann ich mit meinem Wissen auch vergessen. 
 Notfalls tut es auch ein Tutoriallink wie man C zu reinem Code kompiliert. Wobei mir auffällt dass eigentlich jede externe Funktion ein Import von irgendwas ist, fragt sich dann welchen Funktionsumfang ich am Ende hab der Assembler vorraus ist.
  Vllt lehn ich mich auch nur zu weit ausm Fenster, ich zwing mich zur Zeit immer tiefer zu gehen. Seit dem mein ein Platinen Rechner läuft, will ich dies, dann das und jenes.  |  |  
		| Nach oben |  |  
		|  |  
		| storky 
 
  
 Anmeldungsdatum: 06.01.2013
 Beiträge: 68
 
 
 | 
			
				|  Verfasst am: 11.01.2013, 21:27    Titel: |   |  
				| 
 |  
				| Hab mir auch ein paar Gedanken dazu gemacht... 
  	  | Code: |  	  | Function main() As Integer
 Asm
 mov eax, [main]
 mov [Function], eax
 End Asm
 'weiterer Code^^ Dumproutine wird dann im Debugger rausgeschmissen
 End Function
 
 Dim p As Any Ptr
 p = main()
 Print p            '<- Meiner Interpreation nach, der Funktionsanfang als Addresse
 'Print Peek(p)  '<- Absturz beim Auslesen
 
 | 
 
 Eine Funktion die Ihren eigenen Inhalt Dumpt^^ Bekomm eine Zahl zurück und gehe mal davon aus, dass es die Functions addresse ist. Wobei dann ja alle Addressen vom folgenden Code noch relativ wären?!
 |  |  
		| Nach oben |  |  
		|  |  
		| MOD Fleißiger Referenzredakteur
 
  
 Anmeldungsdatum: 10.09.2007
 Beiträge: 1003
 
 
 | 
			
				|  Verfasst am: 11.01.2013, 22:00    Titel: |   |  
				| 
 |  
				| Ich weiß nicht genau was du willst, aber ich versuche es mal. 
 Der FreeBASIC Compiler setzt FB Code in ASM um und den gibt er weiter an den Linker etc. die dann die ausführbare Datei für die jeweilige Plattform generieren. Der Compiler erzeugt dabei eine temporäre Datei die er gleich wieder löscht. Wenn du beim Compilieren -R angibst, wird er die ASM Datei nicht mehr löschen. Damit kannst du dann weiterarbeiten.
 
 An die Adresse einer Funktion kommst du übrigens sehr einfach:
 
  	  | Code: |  	  | Function foo() As Integer Return 1
 End Function
 
 Print ProcPtr(foo)
 Print @foo
 Sleep
 | 
 
 Beides ergibt den Pointer auf die Funktion. Das kann man dann auch schön nutzen:
 
  	  | Code: |  	  | Function foo() As Integer Return 1
 End Function
 
 Dim As Function () As Integer bar = @foo
 
 Print foo()
 Print bar()
 Sleep
 | 
 |  |  
		| Nach oben |  |  
		|  |  
		| storky 
 
  
 Anmeldungsdatum: 06.01.2013
 Beiträge: 68
 
 
 | 
			
				|  Verfasst am: 11.01.2013, 22:22    Titel: |   |  
				| 
 |  
				|  	  | Zitat: |  	  | Beides ergibt den Pointer auf die Funktion. Das kann man dann auch schön nutzen | 
 
 Ohja
  Genau das wollte ich erreichen und dann nach dem ich die Länge der Function rausgefunden habe, das ganze Ding auf die Festplatte speichern. ABER  	  | Zitat: |  	  | Wenn du beim Compilieren -R angibst, wird er die ASM Datei nicht mehr löschen. Damit kannst du dann weiterarbeiten. | 
 klingt mir doch vernünftiger. Erreichen möchte ich ca.:
 
  	  | Code: |  	  | nasm –f bin –o programm.bin programm.asm | 
 Nun ich weiß nicht inwiefern dann das erzeugte Programm "Abhängikeitsfrei" ist. Ich gehe mal davon aus, dass gewisse Funktionen immer geincludet werden da man zb "print" sofort verwenden kann.
 
 Edit: -R funktioniert! Da dran kann ich ja mit nasm weiterarbeiten
   
 
  	  | Code: |  	  | call _fb_Init@12 .Lt_0002:
 push 1
 push offset _MAIN@0
 push 0
 call _fb_PrintUInt@12
 push -1
 call _fb_Sleep@4
 .Lt_0003:
 push 0
 call _fb_End@4
 | 
 
 ^^Nunja, hm mal sehen.
 Sinn des Ganzen, ich möchte aus gewissen Gründen für ein Projekt völlig "Plattformunabhängig" sein
  Ich wills gar nicht sagen -> Kernel. Jap, Kernel in Basic.. Soll man von halten was man will  Ich hab bloß keine Lust jede Schlaufe in nem Register hochzählen zu lassen und mir das ganze Zeug zu merken unm am Ende doch 3 Tage zu debuggen. 
 Ich meine, wenn ich auf alle Funktionen verzichte außer Logikoperationen, Speicherverwaltung und Schlaufen.. Bekomme ich ja Quasi ein Assembler Basic? Hoff mal, dass ich mich hier gerade nicht lächerlich mache
  |  |  
		| Nach oben |  |  
		|  |  
		| MOD Fleißiger Referenzredakteur
 
  
 Anmeldungsdatum: 10.09.2007
 Beiträge: 1003
 
 
 | 
			
				|  Verfasst am: 11.01.2013, 22:45    Titel: |   |  
				| 
 |  
				| Wenn es dir darum geht darfst du dir erstmal eine Runtime Library erstellen, du kannst nicht einfach normale FB-Anweisungen nutzen. Sowas gibt es schon, vielleicht kannst du davon etwas lernen: FROST Kernel |  |  
		| Nach oben |  |  
		|  |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 | 
			
				|  Verfasst am: 11.01.2013, 23:06    Titel: |   |  
				| 
 |  
				| @storky ... kernel in freebasic ist alles andere als abwägig. gibt schon in FBP 2 oder 3 davon. 
 
 MfG
 TPM
 _________________
 [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
 |  |  
		| Nach oben |  |  
		|  |  
		| storky 
 
  
 Anmeldungsdatum: 06.01.2013
 Beiträge: 68
 
 
 | 
			
				|  Verfasst am: 11.01.2013, 23:59    Titel: |   |  
				| 
 |  
				| Hmm ok, danke für den Link. Hab es mir mal angesehen, zum Kompilieren komm ich gerade nicht, müsste erstmal meine Backtrack Festplatte anhängen und dann noch Grub besorgen. Hab gerade keine VM mit Linux   
 buildFROST.sh:
 
  	  | Zitat: |  	  | #!/bin/bash echo "compiling kernel..."
 fbc -r main.bas
 echo ".global fb_ctor__main" >main2.asm
 cat main.asm >>main2.asm
 rm main.asm
 cat main2.asm >main.asm
 rm main2.asm
 as -o main.o main.asm
 
 echo "compiling Multiboot-Header part..."
 fbc -c mb.bas
 
 echo "linking kernel..."
 ld -Ttext=0x100000 mb.o main.o -melf_i386 -o frost.krn
 echo "done."
 | 
 
 Soweit ich das verstehe, wird auch nur der Output des Original FB Compilers genommen, hängt ".global fb_ctor__main" an.. Wozu auch immer? Und linkt das ganze
   
 Ich habe mal einen kleinen Test gestartet:
 
  	  | Code: |  	  | Dim a As Integer
 Dim b As Byte
 While a < 10
 a+=1
 Poke @b, 100
 Wend
 | 
 
 Wird zu:
 
 
  	  | Code: |  	  | .section .text .balign 16
 
 .globl _main
 _main:
 push ebp
 mov ebp, esp
 and esp, 0xFFFFFFF0
 sub esp, 12
 mov dword ptr [ebp-4], 0
 call ___main
 push 0
 push dword ptr [ebp+12]
 push dword ptr [ebp+8]
 call _fb_Init@12
 .Lt_0002:
 mov dword ptr [ebp-8], 0
 mov byte ptr [ebp-12], 0
 .Lt_0004:
 cmp dword ptr [ebp-8], 10
 jge .Lt_0005
 inc dword ptr [ebp-8]
 mov byte ptr [ebp-12], 100
 jmp .Lt_0004
 .Lt_0005:
 .Lt_0003:
 push 0
 call _fb_End@4
 mov eax, dword ptr [ebp-4]
 mov esp, ebp
 pop ebp
 ret
 | 
 
 call _fb_Init@12 und call _fb_End@4 drüfte das einzigste Problem darrstellen, der Rest funktionier schonmal wie erwartet. Ok hätte dann wenig Funktionalität. Aber Variablen Deklarieren, Incrementieren und Schlaufe zb... geht schonmal.
 Btw.. Hab jedoch "versucht!" nach Art der Bash zu kompilieren (kann mir nicht sicher sein das cat hinbekommen zu haben) und das ganze schonmal nach 512Bytes in einer Vhd einzufügen
  Dachte kann die ja später um den Bootloader erweitern -> Vhd Kaputt.. Das Format scheint nicht das 1:1 Abbild einer HDD zu sein, wäre ja auch zu einfach. 
 Edit:
 mb -> Multibootheader.. ist das doch integreiert? Dann würde ich es nochmal versuchen und brauch ne Möglichkeit das Ding direkt auf den Anfang eines Datenträgers zu schieben.. (virtueller Datenträger)
 |  |  
		| Nach oben |  |  
		|  |  
		| storky 
 
  
 Anmeldungsdatum: 06.01.2013
 Beiträge: 68
 
 
 | 
			
				|  Verfasst am: 12.01.2013, 03:01    Titel: |   |  
				| 
 |  
				| Puuuh 2:41   
 Ich habs gepackt einen "Bootloader" zu basteln. Ok, nicht wirklich mit FB, da ich nur ASM/END ASM verwende.
 
 Der Trick ist ("_fb_ctor__main:") ist die Erste Sub, die ja auch existiert wenn man sie verwendet. Bei mir heißt die "_fb_ctor__bootloader:"
 
 Das ist der Quellcode:
 
  	  | Code: |  	  | asm
 org 0x7C           'Programm startet bei 7C
 schreiben:
 mov al, 1           '1 in al for ascii smiley
 mov ah, 0x0E     'operation byte ausgeben
 mov bx, 0x0007
 Int 0x10             'BIOS Interupt auslösen
 jmp schreiben     'na was wohl?
 END ASM
 | 
 
 FBC-r Gibt mir folgenden Assembler aus:
 
 
  	  | Code: |  	  | .intel_syntax noprefix 
 #bootloader.bas' compilation started at 02:49:57 (FreeBASIC 0.24.0)
 
 .section .text
 .balign 16
 _fb_ctor__bootloader:
 push ebx
 push esi
 push edi
 .Lt_0002:
 org 0x7C
 schreiben:
 mov al, 1
 mov ah, 0x0E
 mov bx, 0x0007
 Int 0x10
 jmp schreiben
 .Lt_0003:
 pop edi
 pop esi
 pop ebx
 ret
 #bootloader.bas' compilation took 0.0001547574296196785 secs
 
 .section .ctors
 .int _fb_ctor__bootloader
 | 
 
 Das Problem ist alles bis ".Lt_0002:" darf nicht sein! Dannach läuft es durch nasm, daraus habe ich ein 720Kb Image erzeugt, dass als Byte 510 - 512,  0x55 0xAA hat... Dieses Diskettenimage in Virtual PC gemountet und hier das Ergebnis:
 
 
   
 Ein Smiley-anzeige OS
   
 So nun 2 Probleme, 1.) hatte das nicht viel mit Freebasic zu tun, Notepad hätte es auch getan und ich werd mal sehen ob ich das mit den Subs lösen kann und 2.) Kernel?!
 
 Aber es scheint zu werden, hatte Anfangs bedenken da ich noch nie so nah an ner x86er Maschine rumgespielt hab.
 |  |  
		| Nach oben |  |  
		|  |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 |  |  
		| Nach oben |  |  
		|  |  
		| storky 
 
  
 Anmeldungsdatum: 06.01.2013
 Beiträge: 68
 
 
 | 
			
				|  Verfasst am: 12.01.2013, 03:45    Titel: |   |  
				| 
 |  
				| Danke! Werde gleich mal versuchen das zu kombinieren. Bzw. bin schon dabei. Zuerst kam das hier: 
 C:\Freebasic\compiler\bin\win32>ld -Ttext=0x100000 kernel.o -o kernel
 kernel.o:fake:(.text+0x4b1): undefined reference to `fb_ctor__kernel'
 
 das würde nur funktionieren wenn die *.bas Datei "kernel" hieße und dann nur mit "_fb_ctor__kernel", habs einfach umgeschrieben und dabei verstanden wie man die "main" Sub zur verfügung stellen kann ohne die vorm Linken zu löschen.
   
 Also als Download bekommt man die als fbporticula679.bas, war etwas verwirrend aber nicht schlimm ich mecker nicht
   
 http://s7.directupload.net/images/130112/sppvem5u.png
 
 ^^mal ein lustiger Fehlalarm
   
 Mal 2 Fragen, was macht ld -Ttext=0x100000 ? Und an dem Kernel ist jetzt ein Win PE Header dran, kann ich den einfach wegpatchen und vom "Bootloader" an die richtige Stelle springen?
 |  |  
		| Nach oben |  |  
		|  |  
		| ThePuppetMaster 
 
  
 Anmeldungsdatum: 18.02.2007
 Beiträge: 1839
 Wohnort: [JN58JR]
 
 |  |  
		| Nach oben |  |  
		|  |  
		| darkinsanity aka sts
 
  
 Anmeldungsdatum: 01.11.2006
 Beiträge: 456
 
 
 | 
			
				|  Verfasst am: 13.01.2013, 06:28    Titel: |   |  
				| 
 |  
				|  	  | storky hat Folgendes geschrieben: |  	  | buildFROST.sh | 
 Argh, nimm doch nicht die alte Version, die ist grottig
   Bei FROST V2 (im git-repo) hab ich das alles bedeutend schöner gelöst. V2 bekommt auch gerade mehrere Patches für Multitasking und Paging, wenns gut läuft werd ich demnächst irgendwann einen vernünftigen Init-Prozess ausführen können.
 _________________
 Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
 |  |  
		| Nach oben |  |  
		|  |  
		| storky 
 
  
 Anmeldungsdatum: 06.01.2013
 Beiträge: 68
 
 
 | 
			
				|  Verfasst am: 15.01.2013, 15:08    Titel: |   |  
				| 
 |  
				| Habe es immer noch nicht hinbekommen und lerne erstmal alles von Grund auf (Assemblerkenntnisse erweitern). 
 Ich habe es geschafft mit einem Bootloader nun meinen selbst geschriebenen ASM "Kernel" zu booten, aber hänge seit gestern schon an einem Problem. Oder ist weniger ein Kernel als ansatzweiße eine Shell.
 
 
  	  | Code: |  	  | [ORG 1000h] [BITS 32]
 
 SECTION .data
 upMsg db "StorkOS 1 is up on this mashine.", 0
 sdMsg db "Shutdown :(", 0
 erMsg db "Error", 0
 times 512-($-$$) db 0
 
 section   .text
 global _start
 global newline
 global mainloop
 global reset
 
 jmp _start
 
 _start:
 mov si, [upMsg]      <- hier
 lodsb
 mov ah, 0Eh
 int 10h
 xor al, al
 jnz _start                <- bis hier, funktioniert nicht.
 jmp newline
 
 outPut:
 lodsb
 mov ah, 0Eh
 int 10h
 xor al, al
 jnz outPut
 ret
 
 mainloop:
 mov al, 0
 mov ah, 00h      ;Tastendruck?
 int 16h
 xor al, 0
 jz mainloop      ;keine Taste gedrückt
 mov ah, 0Eh      ;Taste anzeigen
 int 10h
 xor al, 13      ;Entertaste gedrückt!
 jz  newline
 jmp mainloop
 
 newline:
 mov ah, 0Eh      ;Newline - Befehl
 mov al, 10
 int 10h         ;Zeilenumbruch
 mov ah, 0Eh
 mov al, 35
 int 10h         ;Raute
 jmp mainloop
 
 reset:             ;CPU RESET
 db 0Eah
 dw 0000h
 dw 0FFFFh
 jmp reset
 
 
 times 512-($-$$) db 0
 | 
 
 Ich habe folgende Probleme, Calls funktionieren nicht. Er hängt meist nach dem retn oder es passiert nix. Und wie oben markiert^^ an der Stelle gibt er die Variable nicht aus. Generell gibt er Variablen nicht aus, zusammen mit den Calls frag ich mich ob die Addressierung am Ende richtig ist.
 Hab das schon manuell gemacht (bei 0x1000 liegt das Programm, bei 512 dezimal beginnt die Datensektion.. hab das auch im HexEditor geprüft, macht 0x1200)
 
 Dann ebend:
 
 
 Aber das macht nur die Zeichen groß, mit "esi" kommt ein leeres Zeichen.
 Wenn das funktionieren würde, möchte ich das ganze gerne als Sub umschreiben.
 Ich verwende NASM übrigens.
  |  |  
		| Nach oben |  |  
		|  |  
		| storky 
 
  
 Anmeldungsdatum: 06.01.2013
 Beiträge: 68
 
 
 | 
			
				|  Verfasst am: 15.01.2013, 15:46    Titel: |   |  
				| 
 |  
				| Habs hinbekommen, im Realmode und ohne org Angabe gehts :/ 
  	  | Code: |  	  | ;[ORG 1000h] [BITS 16]
 | 
 
 Soll aber nicht der gewünschte Zustand sein.
 Und selbst im Realmode ist der Offset dez 512 und nicht 0x1200, ich weiß nicht warum, dass es unter 32 Bit ein Fehler war kann ich mir jetzt denken
  Hm wie bekomm ich das ganze nun auf 32 Bit? |  |  
		| Nach oben |  |  
		|  |  
		| storky 
 
  
 Anmeldungsdatum: 06.01.2013
 Beiträge: 68
 
 
 | 
			
				|  Verfasst am: 15.01.2013, 22:36    Titel: |   |  
				| 
 |  
				| Vergesst das haltlose Gerede, ich hab zu wenig Ahnung einfach  Ich muss noch viel lernen. Aber ich habs jetzt geschafft den Kernel von ThePuppetMaster zu booten! Hab mich doch mal durchgerungen Grub in ner Dosbox laufen zu lassen und hab die richtige ld.exe gefunden die auch non PE linken kann. 
 So mal gucken was jetzt so damit geht *Freude*
 |  |  
		| Nach oben |  |  
		|  |  
		|  |  
  
	| 
 
 | Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten.
 Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
 Du kannst deine Beiträge in diesem Forum nicht löschen.
 Du kannst an Umfragen in diesem Forum nicht mitmachen.
 
 |  |