|
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, 21: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, 21: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, 22: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, 23: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, 23: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, 23: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: 1837 Wohnort: [JN58JR]
|
Verfasst am: 12.01.2013, 00: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: 12.01.2013, 00: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, 04: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: 1837 Wohnort: [JN58JR]
|
|
Nach oben |
|
|
storky
Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 12.01.2013, 04: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: 1837 Wohnort: [JN58JR]
|
|
Nach oben |
|
|
darkinsanity aka sts
Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 13.01.2013, 07: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, 16: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, 16: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, 23: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.
|
|