Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Bin ohne Header kompilieren?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 11.01.2013, 21:28    Titel: Bin ohne Header kompilieren? Antworten mit Zitat

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. grinsen

Nachtrag.. ich kann mir die Antwort schon denken, der FB Windowskompiler wird wohl Windowsprogramme kompilieren. zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 11.01.2013, 21:33    Titel: Antworten mit Zitat

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. verwundert 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. grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 11.01.2013, 22:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 11.01.2013, 23:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 11.01.2013, 23:22    Titel: Antworten mit Zitat

Zitat:
Beides ergibt den Pointer auf die Funktion. Das kann man dann auch schön nutzen


Ohja lächeln 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 lächeln

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 grinsen Ich wills gar nicht sagen -> Kernel. Jap, Kernel in Basic.. Soll man von halten was man will lächeln 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 peinlich
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 11.01.2013, 23:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 12.01.2013, 00:06    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 12.01.2013, 00:59    Titel: Antworten mit Zitat

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 lächeln

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 lächeln

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 grinsen 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
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 12.01.2013, 04:01    Titel: Antworten mit Zitat

Puuuh 2:41 neutral

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 durchgeknallt

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 12.01.2013, 04:05    Titel: Antworten mit Zitat

hier mal ein primitiver kernel in fb
http://www.freebasic-portal.de/porticula/kernelbas-679.html


mfg
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 12.01.2013, 04:45    Titel: Antworten mit Zitat

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. lächeln

Also als Download bekommt man die als fbporticula679.bas, war etwas verwirrend aber nicht schlimm ich mecker nicht happy

http://s7.directupload.net/images/130112/sppvem5u.png

^^mal ein lustiger Fehlalarm grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1837
Wohnort: [JN58JR]

BeitragVerfasst am: 12.01.2013, 05:01    Titel: Antworten mit Zitat

-Ttext setzt die text" section ... siehe http://pic.dhe.ibm.com/infocenter/aix/v6r1/topic/com.ibm.aix.cmds/doc/aixcmds3/ld.htm

wo der winpe header her kommt, kann ich dir jetzt nicht sagen. ich vermute aber mal stark, das dies von deinem linker mit dran gepackt wird.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
darkinsanity
aka sts


Anmeldungsdatum: 01.11.2006
Beiträge: 456

BeitragVerfasst am: 13.01.2013, 07:28    Titel: Antworten mit Zitat

storky hat Folgendes geschrieben:
buildFROST.sh

Argh, nimm doch nicht die alte Version, die ist grottig zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 15.01.2013, 16:08    Titel: Antworten mit Zitat

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:
Code:
mov si, 1200h


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. lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 15.01.2013, 16:46    Titel: Antworten mit Zitat

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 grinsen Hm wie bekomm ich das ganze nun auf 32 Bit?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 15.01.2013, 23:36    Titel: Antworten mit Zitat

Vergesst das haltlose Gerede, ich hab zu wenig Ahnung einfach neutral 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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz