Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - chris12

Seiten: 1 2 [3] 4 5 ... 7
41
Lowlevel-Coding / Re:C-Kernel ohne Multiboot
« am: 22. May 2011, 12:39 »
Dein Fehler liegt darin, dass, wenn du den code so verwendest, ohne anderen code meine ich, du gcc 32 bit code erstellen lässt, du aber beim starten noch im 16 bit, so genannten real mode, modus bist.
das heißt für dich jetzt, du musst einen bootloader schreiben, der in den protected mode springt (32 bit modus) und dann deine c funktion aufruft (von einem kernel würde ich noch nicht sprechen, aber das ist haarspalterei).
besonders würde ich dir die tutorial reihe aus der wiki empfehlen, da wir auch erklärt, wie du einen c-kernel aufsetzt. ich glaube sogar, dass es auch drinsteht, wie du einen c-kernel ohne grub erstellst.

mfg
chris
42
So, da es einige Assembler Fans hier gibt und auch einige kreative Köpfe, möchte ich mal einen Versuch starten:
Assembler-Poesie :D

Es ist ganz einfach! Man nehme ein Gedicht, wahlweise schreibe man es selbst, und versuche es in Assembler auszudrücken.
Es muss natürlich nicht assemblierbar sein, es muss nur wie Assembler aussehen. Also ganz einfach, oder doch nicht?
Wie dem auch sei. Ich hab mich mal dran versucht - bin zwar nicht der beste, wenn es um Gedichte geht, aber ich fand die Idee neckisch.

kleine tipps (hehe wirklich klein ^^):
xore -> xor if equal/true
adde -> add if equal/true
in Anlehnung an den x86 Intelsyntax

mov dir, ich

cmp du, 0
xore ich, ich
test mich, #frage
adde ich, du


Für alle zur Erklärung

Ich zu dir

Wenn du nicht wärst,
Wär' ich nicht.
D'rum frag ich mich,
Warum sind wir nicht zusammen?

Ich sag ja, nicht das beste, aber mal sehen, was ihr so schreibt. Seht es als Herausforderung ;)
43
Offtopic / Re:Eigene CPU
« am: 27. November 2010, 17:11 »
zu der 32 bit cpu: sie kann leider der ram nur mit einem 24 bit adressbus ansprechen, da logisim meint: "Neh du brauchst nicht mehr als 16.777.215 32bit zellen speicher ...."
Nimm einfach mehrere RAM Bausteine ein Verteiler und einen Demuxer denn du dann mit denn sel Anschluss des RAM verbindest.
kann ich machen, nur müsste ich dann den source code bzw das binäre programm entsprechend aufteilen und dazu hatte ich noch keine lust sowas einzubauen ^^
aber eine gute idee, danke
44
Offtopic / Re:Eigene CPU
« am: 26. November 2010, 18:55 »
die 16bit cpu ist ganz einfach die, mit der ich am liebsten arbeite. bisher war sie, die am flüssigsten ausgeführt wurde, kann sich aber auch geändert haben. leider ist sie auch die, die am neusten ist, an ihr habe ich immer wieder kleine updates durchgeführt, die bei den anderen fehlen.
zu der 32 bit cpu: sie kann leider der ram nur mit einem 24 bit adressbus ansprechen, da logisim meint: "Neh du brauchst nicht mehr als 16.777.215 32bit zellen speicher ...."
45
Offtopic / Re:Eigene CPU
« am: 26. November 2010, 18:38 »
mal sehen, was man mit 16bit alles machen kann ^^
46
Offtopic / Re:Eigene CPU
« am: 26. November 2010, 18:25 »
das mit der sechsten CPU, dürfte hinhauen. leider funktionieren nur die letzten 3 nach meiner Zufriedenheit ^^
Das mit der eigenen Plattform, ist gar keine so verkehrte Idee, Buscontroller, Interruptcontroller, etc. könnte man ja mit dem bestand aufbauen, aber ob da Logisim noch mit macht? ^^
naja, ich werd mal sehen was ich machen werde, nen Buscontroller bräuchte ich eh.
leider muss sehr viel Code bei der Laufzeit verändert werden und ob das eine so gute Grundlage ist, weiß ich nicht. Aber man könnte ja eine CPU auf einer CPU errichten, des dürfte einige Probleme lösen, aber ob das ganze dann noch hinhaut. Naja ich werd mal sehen was die Zeit bringt.
bis dahin
mfg
47
Offtopic / Re:Eigene CPU
« am: 25. November 2010, 22:31 »
So jetzt möchte ich mich mal wieder melden und das thema aus der versenkung holen.
Ich hab ein wenig weiter gearbeitet und dabei sind gleich 3 cpu raus gekommen.
die drei cpu bauen alle auf einem ähnlichem ISA. der einzige unterschied zwischen allen ist, dass die erste, die 1408, eine 8bit CPU ist, die zweite, 1416, eine 16bit und die letzte eine 32bit cpu ist (ratet wie ihre bezeichnung ist ;) )
Zu allen dreien gibt es nur EINEN assembler! sie alle haben eine identischen syntax und so sind nur die ausgespuckten bitweiten unterschiedlich.
zum aufwand: der dataparser war am komplexesten, dafür aber auch am kleinsten.
anzahl der dateien: 9
 parser.cs (parst mathematische ausdrücke; 326 Zeilen)
 1408.cs (generiert code für die 1408; 487)
 1416.cs (513)
 1432.cs (511)
 bin code.cs (sollte binärcode erstellen und in eine datei schreiben, unfertig; 17)
 emu code.cs (erstellt ein emulator ram image, es gibt einen 140A emu, der teilkompatibel zur 1408 ist; 19)
 logisim code.cs (erstellt code für logisim, der dann einfach in ein ram modul gelesen werden kann; 19)
 preprocessor.cs (der preprozessor, auf den ich besonders stolz bin, er kann macros definieren, konstanten, definitions abfragen machen, nachrichten, warnungen und errors ausgeben, die der benutzer definiert und andere dateien einbinden; 317)
 Program.cs (und schließlich die hauptdatei, sie enthält alles übrige, globale variablen, userinterface und den dataparser, 514)
gesamtzahl der zeilen: alles in allem nur 2723 zeilen

und damit ihr auch seht, wie denn der qellcode dann aussieht hier noch ein kleines beispiel
%ifndef 1416
%error "Runs only on the 1416! simply Define the key '1416'."
%endif
%ifdef 1416
%warning "Make sure you assemble for the 1416!"
%define $zero r15
%define si r14
%define outr r13
%define $one r12
ld outr, 0x8000
ld $zero, 0
ld $one, 1

ld si, string
l:
mov r0, outr
sm si, $+2
lm r1, 0
cmp r1, $zero
je end
add r0, r1
out r0
out $zero
add si, $one
j l
end:
hlt

string: db "Hallo Welt!", 0
%endif
das der code gibt auf der 1416 "Hallo Welt!" aus, wenn der bildschirm sachgerecht an den outport angeschlossen ist.
achja zum hinweis:
ld -> LoaD nach(reg), was(konst)
lm -> LoadMemory nach(reg), von(konst)
sm -> StoreMemory von(reg), nach(konst)
out -> Output von(reg) auf dem 16bit outport
j -> vgl. jmp
48
OS-Design / Re: Kernelmodule,wie?
« am: 18. June 2010, 18:02 »
wenn du ein datei system hast, und progs ausführen kannst ist das denke ich mal recht einfach
1. Datei/Programm/treiber/Modul/wie-auch-immer auffinden
2. in den kernelspace laden und einstigspunkte irgendwo speichern
3. ggf berechtigungen setzen
4. funktion aufrufen
mfg
49
Softwareentwicklung / Re: Ubuntu: .IMG erkzeugen
« am: 12. May 2010, 16:52 »
cd - ROM kann man aber nicht wieder beschreiben ...
50
Lowlevel-Coding / Re: Problem mit Diskettentreiber
« am: 11. May 2010, 21:12 »
ich nehme mal an, dass du schon sowas wie printf() hast, oder?
dann kannst du ja an wichtigen stellen zB printf("!"); einfügen um zu sehen wo er hängt ;) so mach ich das meißt
ich würde hinter der aktivierung des dma channel einen einfügen, und hinter den seek_traks bzw hinter motor_on();
du könntest auch verschiedene zeichen verwenden, oder auch status messages.
mfg
51
Lowlevel-Coding / Re: Problem mit Diskettentreiber
« am: 11. May 2010, 20:57 »
mal ne kleine frage: was funzt denn an dem treiber nicht?
weil wenn ich das wüsste könnte ich aus dem code lernen ;)
52
Lowlevel-Coding / Re: kontrolliert zurück in den 16bit-Modus
« am: 16. April 2010, 19:00 »
dann bist du aber nicht im protected mode, sonder im realmode. wie es kommt, dass dein 32 bitcode trotzdem funzt weiß ch nicht. auf jeden fall bist du, so denke ich mal, solange nicht im pmode, solange du noch die bios ints nutzen kannst
53
Offtopic / Re: Eigene CPU
« am: 10. April 2010, 10:49 »
dann nimm doch http://inst.eecs.berkeley.edu/~cs61c/sp06/projs/04/logisim-ucb-2.jar da kann man "Software Gates" benutzen, die kann man in c coden, man braucht nur gcc auf dem computer installiert haben. als template kannst du http://inst.eecs.berkeley.edu/~cs61c/sp06/projs/04/template.c nemen
54
Offtopic / Re: Eigene CPU
« am: 07. April 2010, 15:34 »
das programm nennt sich logisim http://ozark.hendrix.edu/~burch/logisim/
damit kann man diese schönen bildchen erstellen und auch gleich simulieren, ob das auch funktioniert
55
Offtopic / Re: Eigene CPU
« am: 07. April 2010, 13:12 »
so da ihr hier viel diskutiert habt, wollte ich mal anfragen, ob schon was bei rausgekommen ist, also ob ihr schon ein konzept habt, oder ob ihr euch immernoch mit den ganzen einzelhein rumschlagen müsst?

ich hab schon was zu stande gebracht: ist zwar nur 8 bit aber immerhin

auf dem bild hat die CPU ein byte (0Fh) aus speicherstelle 04h ausgelesen, und es dann auf dem Outport ausgegeben

so sieht die cpu in diesem zustand aus
56
Das Wiki / Re: Bootloader: 2.Sektor laden
« am: 05. April 2010, 19:21 »
der booloader wird an die stelle 0:07c00 geladen, soweit ist es richtig. die adressierung wird im folgenden maße angegeben: segement:offsett. das bedeutet, dass du deine daten in segment 0 an offsett 07c00h+512dez laden. dann sollte es auch mit der addresse hinhauen.
mfg
chris
57
Offtopic / Re: Anregungen für IRC
« am: 21. March 2010, 12:57 »
giebs sowas nicht schon? http://irc.tyndur.org/stats.php
58
Offtopic / Re: Eigene CPU
« am: 20. March 2010, 21:46 »
also wenn ich schätzen sollte hast du so ca 4000 zeilen in deinem assembler ...
59
Offtopic / Re: Eigene CPU
« am: 20. March 2010, 18:11 »
Zitat von: erik.vikinger
Das passt irgendwie nicht zusammen, sollte es nicht "r1 = r2 + r3" heißen?
ist eigentlich egal. zudem noch ist es nicht im assembler implementiert, da können die operanden immernoch vertauscht werden ;)

zum selbstmodifizierenden code:
es war kein design ziel, sondern ist eine notwendigkeit aufgrund der einfachheit ;)

zu den assemblern:
kpuasm: nur 281 zeilen (könnten aber reduziert werden)
kpuIIasm: 564 zeilen in 3 dateien (könnten auch reduziert werden)
xasm: 842 zeilen (werden noch mehr werden)

zu den befehlen:
ich mach das über eine böse variante, über string split und dann mit regex vergleichen, da ich da noch nichts vom ordentlichen compilerbau/assemblerbau gehört hab.
wenn man jetzt folgenden xasm code hat
data 0x10000000, :hallo ;mov r0, :hallo
data 0x10020000, $+3 ;mov r2, $+3 )
jmp :start           ;            ) call :start
jmp $-1
start:
data 0x20310000    ;mov r1, [r0]
data 0x01110000, 0  ;out 0, r1
data 0x30100000, 1 ;add r0, 1
cmp r1, 0
jne :start
jmp r2  ;ret
hallo:
data "Hallo, Welt!",10,13, 0
wird zuerst folgender objekt code in stage 1 generiert
10000000 :hallo
10020000 $+3
40100000 :start
40100000 $-1
start:
20310000
01110000 00000000
30100000 00000001
00210000 00000000
42100000 :start
40020000
hallo:
00000048 00000061 0000006C 0000006C 0000006F 0000002C 00000020 00000057 00000065 0000006C 00000074 00000021 0000000A 0000000D 00000000
dann werden die labels eingelesen und in einer KeyValue liste abgespeichert zusammen mit ihren adressen, bei bedarf noch der org wert drauf addiert, und danach werden die labels mit ihrer adresse ersetzt.
dann hat man diesen code 10000000 00000212
10020000 00000206
40100000 00000208
40100000 00000206
20310000
01110000 00000000
30100000 00000001
00210000 00000000
42100000 00000208
40020000
00000048 00000061 0000006C 0000006C 0000006F 0000002C 00000020 00000057 00000065 0000006C 00000074 00000021 0000000A 0000000D 00000000
der wirt dann einfach in die entsprechenden hexwerte umgewandelt und in die ausgabe datei geschreiben.

zum aufwand:
je komplexer die cpu bzw deren befehlssatz, desto komplexer der assembler. und xasm ist immernoch nicht fertig.

ich hoffe ich hab deine fragen damit beantwortet
60
Offtopic / Re: Eigene CPU
« am: 20. March 2010, 11:32 »
meine cpus sind mehr oder minder sehr simpel
die erste hab ich in logisim entwickelt und konnte ganze 16Byte Ram und 256Byte Rom ansprechen. im Rom lag der einfachheit halber der programcode und im ram wurde linear das ergebnis der aluoperation abgelegt. allerdings konnte man keine daten aus dem ram lesen, aber ich war schon happy, dass es überhaupt irgendwie funktioniert hat. die cpu, kpu mit namen, war eine 4bit cpu mit einem 16bit breiten befehlssatz. die 4bit für daten resultierten daraus, dass alle operationen in diesen 16bit einzeln untergebracht wurden, da ich noch nichts vom decodieren gehört hatte.
ein befehl war also so aufgebaut:
x x x x x x x x x x x x x x x x
| | | | | | | | | | | | | | | |
 -   - - -   -   -   -   - - -
 |     |     |   |   |     |
Addr  Addr  Alu   Reg     Data
 OP         OP   CB  CA
 
das bedeutet ein
mov r1, 4 wurde zu 0000000000100100
und leider musste aus irgenteinem grund nach jeder aluop ein null word kommen, da sonst falsche ergebnisse in den ram geschrieben werden.
btw hatte kpu auch keinerlei jmp operationen, nicht mal einen einfachen sprung, obwohl es vorgesehen war. sie hatte 3 register r0, r1 und r2, die alle allzweck waren

die weiterentwicklung war KPU Mk 2, oder einfach KPUII. diese sollte schon besser sein. sie hatte zwar immernoch die 16bit instructionen, aber konnte schon 8bit daten verarbeiten.
eine instruction war also so aufgebaut:
x x x x x x x x x x x x x x x x
| | | | | | | | | | | | | | | |
Enable   - - -   - - - - - - -
| | | |    |           |
J A  R     OP         Data
m L  e
p U  g
    | |
Write Read
aus einem mov r1, 4 wurde jetzt 0010000100000100
kpuII wurde in logisim die wirklich fertiggestellt, aber dafür hab ich meinen ersten emulator in c# geschrieben KPUIIEMU ;)
kpuII hatte 16 allzweckregister. jump operationen wie
jmp
je
jne
ja
jb
und konnte auf den ram und den rom dierekt zugreifen, zwar nur mit festwerten, aber immerhin. der programmcode lag immernoch im rom. alletdings hatte diese cpu schon einen screen port und einen keyboard port, die allerdings nie in logisim sorichtig funktioniert haben. aber dafür waren die befehle read (register) und disp (festwert | ram:[(adresse)] | rom:[(adresse)] | register) vorgesehen.

meine nächste cpu, die ich erst auf dem papier und dann in logisim umsetzen wollte, war die 140A, eine richtige multibyte 8bit cpu. daten und code lagen im ram und sogut wie alle operationen sind multibyte bishin zu 3 byte. diese cpu ist in logisim nie sorichtig fertig geworden, da ich mit probleme mit den multibyte instruktionen hatte.
die 140A hatte einen 8bit breiten adressbus und konnte somit 256byte an ram ansprechen. sie hatte 4 allzweckregister, einen ip und ein flagregister.
die instruktionen waren so aufgebaut
xxxx | xxxx | OP
-----|------|---------
0000 | 0000 | HLT
0001 | 00 # | r# = <IP+1>
0001 | 0100 | [<IP+1>] = <IP+2>
0001 | 10 # | r# = [<IP+1>]
0001 | 11 # | [<IP+1>] = r#
-----|------|---------
0111 | #1#2 | cmp r#1, r#2
0110 | 00 # | cmp r#, <IP+1>
0110 | 01 # | cmp r#, [<IP+1>]
-----|------|---------
0011 | 0000 | jmp <IP+1>
0011 | 0001 | je <IP+1>
0011 | 0010 | jne <IP+1>
0011 | 0011 | ja <IP+1>
0011 | 0100 | jb <IP+1>
0011 | 0101 | jna <IP+1>
0011 | 0110 | jnb <IP+1>
-----|------|---------
1000 | #1#2 | r#1 = r#1 + r#2
1001 | #1#2 | r#1 = r#1 - r#2
1010 | #1#2 | r#1 = r#1 * r#2
1011 | #1#2 | r#1 = r#1 / r#2
1100 | #1#2 | r#1 = r#1 & r#2
1101 | #1#2 | r#1 = r#1 | r#2
1110 | 00 # | r# = ~r#
1111 | #1#2 | r#1 = r#1 XOR r#2
wie man erkennen kann recht simpel.
flags gab es nur 3 stück: das gleichheitflag, größerflag und kleiner flag.
aus mov r0, 0xF0 wird also 00010000 11110000
einige kleinigkeiten, wie zum beispiel adressierung über register, müssen über kleinere hacks gemacht werden. wodurch dann selbstmodifizierender code entsteht.

die letzte cpu und die auch größte in meinen projekt umfang ist die XCPU, warum die so heißt weiß ich leider auch nicht.
diese cpu arbeitet mit sicherheit nicht mehr nach dem RISC prinziep sondern eher im gegenteil. sie hat einen 32 bit adressbus kann mit 32bit daten umgehen und eine ram speicherzelle hat 32 bit. somit kann diese cpu 137438953472 bit insgesamt ansprechen was  16 GB ergeben. leider kann der emulator nur ein zwanzigstel, also ca 0.8 GB, davon bereit stellen, da meine maschiene nicht mehr hergibt.
es giebt 16 register, die allzweck benutzt werden könnten, aber vom assembler für call oder stack operationen genutzt werden. die cpu beherscht diese nähmlich nicht und, desshalb habe ich diese hacks gleich in den assembler eingebaut.
die cpu kann teoretisch 2^32 in und out ports haben allerdings werden vom emulator vorerst nur 0-2 unterstützt. flags gibts 32 aber nur 4 existieren, die drei der 140A und das zero flag. interrupt, die es bei den anderen nicht gab, sollen auch implementiert werden, allerdings muss ich mir darüber nochmal gedanken machen.

zum assembler:
ich hab fast für jede meiner cpus eien eigenen assembler, in c#, geschrieben, außer für die 140A. die syntax ist für alle dem intelsyntax der x86 ähnlich, nur die register heißen anders r0-r(2, 3 oder 15 bzw 9). also mov (ziel), (quelle). bei der xcpu werden allerdings auch operationen wie add r1, r2, r3 möglich sein (r3 = r1 + r2).
der assembler für die xcpu ist noch nicht ganz fertig, aber es gibt schon labels, jmp, data anweisung, org anweisung, times anweisung und die $ anweisung.

wenn noch fragen sind beantworte ich die gerne
btw wenn ich in den rechnungen(bit -> GB) einen fehler hab korrigiert mich bitte
Seiten: 1 2 [3] 4 5 ... 7

Einloggen