Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 27.07.2011, 22:02 Titel: Assembler-2000 Compiler |
|
|
Assembler-2000 ist ein Windows/Linux-Compiler für Assemblerquellcode.
Anders als normale Compiler wie NASM oder FASM kann Assembler-2000 nicht wirklich auf CPU-Register zugreifen sondern benutzt sogenannte "virtuelle Register und Speicherzellen". Ebenso kann es weder auf BIOS- oder Betriebssysteminterrupts zugreifen, sondern nur auf die eines "virtuellen" BIOS und eines "virtuellen" Betriebssystems. Das hat nicht nur Nachteile, sondern auch den Vorteil, dass man den Code nicht für Windows oder Linux umschreiben muss. Mit dem Befehlssatz dieses Compilers und den beliegenden Funktionen kann man jedes Programm schreiben, welches auch mit herkömmlichen Hochsprachen erreichbar ist. Es beherrscht bedingte Sprünge, welche mit den If-Abfragen von Hochsprachen zu vergleichen sind. Ebenso sind Prozeduren(vergleichbar mit den SUBs von FreeBasic) möglich. Über die Funktionen des virtuellen BIOS sind das Einstellen des Bildschirmmoduses und Grafikausgabe möglich.
Dem Compiler liegen 3 PDFs bei, in welchen die Befehle, die Funktionsweise der bedingten Sprünge und die Funktionen des BIOS und des Betriebssystems erklärt werden.
Außerdem liegen 4 Beispielcodes dabei. Ein Beispiel für das Rechnen mit Assembler, bedingte Sprünge, Grafikausgabe und natürlich ein Hello World-Programm, welches übrigens so ausschaut:
Code: | .data
1
hello Hello World
.code
mov ax,%hello
call print
mov ah,01h
int 42h
func print
mov ah,02h
int 42h
ret |
Wer den Spaß als Scriptsprache nutzen will(was ich sogar vorhabe ), kann die beigelegte "Interpreter.bas" nutzen. Das Ganze steht unter der WTFPL, also macht damit was ihr wollt. Wer den Compiler nutzen will, braucht auch den fbc, da der Assemblercode in FreeBasic-Code übersetzt wird.
Download |
|
Nach oben |
|
|
Sannaj
Anmeldungsdatum: 19.12.2010 Beiträge: 35
|
Verfasst am: 30.07.2011, 01:10 Titel: |
|
|
Auch wenn mir der Sinn des Programms nicht einleuchtet halt ich die Idee und die Umsetzung doch für gar nicht so schlecht.
Worauf ich dich aber hinweisen möchte:
1. Du definierst die 8-bit Register (al, bl, cl, dl, ah, bh, ch, dh) als extra Register des "Special"-Types. Sie müssten aber die lbyte/hbyte-Versionen von ax, bx, cx, dx darstellen. Dein int 42h würde in Realität niemals funktionieren.
2. Neben ax, bx, cx und dx gibts auch noch: si , di, sp, bp, sowie cs, ds, ss, es.
3. Unter Linux und Windows arbeitete man üblicherweise mit den 32 bit erweiterten Register eaxm ebx, ecx, edx, esi, edi, esp, ebp.
4. Warum muss man Strings und Funktionen den Spezialbehandeln? Eine reine Labeladdressierung währe getreuer am Orginal und leistungsfähiger.
5. Du könnest #ifdef __FB_WIN32__ benutzen. Dann brauchst du keine zwei Quellcodedateien. |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 30.07.2011, 11:20 Titel: |
|
|
Zitat: | Du definierst die 8-bit Register (al, bl, cl, dl, ah, bh, ch, dh) als extra Register des "Special"-Types. Sie müssten aber die lbyte/hbyte-Versionen von ax, bx, cx, dx darstellen. |
War aber schwer sie als Ibyte/hbyte von ax,bx ... darzustellen.
Zitat: | Neben ax, bx, cx und dx gibts auch noch: si , di, sp, bp, sowie cs,ds ss, es. | Richtig, es gibt auch nicht nur fehlende Register in meinem Compiler/Interpreter, sondern gibt es auch weder Stackbefehle noch gibt es Flags(Zero, Carry ...)
Wird eventuell in einer nächsten Version erscheinen.
Zitat: | Unter Linux und Windows arbeitet man üblicherweise mit den 32 bit erweiterten Register eaxm ebx, ecx, edx, esi, edi, esp, ebp. |
Heißt es nicht eax?
Hm, meist habe ich unter DOS mit Assembler gearbeitet, werde ich aber in der nächsten Version berücksichtigen.
Zitat: | Warum muss man Strings und Funktionen den Spezialbehandeln? |
Funktionen werden spezial behandelt?
Zitat: | Du könnest #ifdef __FB_WIN32__ benutzen. Dann brauchst du keine zwei Quellcodedateien. |
Okay |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 30.07.2011, 16:31 Titel: |
|
|
Westbeam hat Folgendes geschrieben: | Zitat: | Du definierst die 8-bit Register (al, bl, cl, dl, ah, bh, ch, dh) als extra Register des "Special"-Types. Sie müssten aber die lbyte/hbyte-Versionen von ax, bx, cx, dx darstellen. |
War aber schwer sie als Ibyte/hbyte von ax,bx ... darzustellen. |
zum Lesen: lbyte = shortwert AND 255 : hbyte = shortwert SHR 8
zum Schreiben kannst du was mit AND-Verknüpfung bauen.
Möglicherweise bietet sich da ein PROPERTY zum Lesen und Schreiben an. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 30.07.2011, 18:54 Titel: |
|
|
UNION wäre wohl wesentlich praktischer für die Register. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 30.07.2011, 19:21 Titel: |
|
|
An UNION habe ich auch schon gedacht, kenne es aber zu wenig, um mich zu trauen es vorzuschlagen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 30.07.2011, 19:35 Titel: |
|
|
Uuh, ein Profi der nicht weiß was ein Union ist.
Nein Spaß.
-> Ich muss selbst erstmal nachschauen was ein Union ist. |
|
Nach oben |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 30.07.2011, 19:50 Titel: |
|
|
das problem beim union (in C/c++ jedenfalls) ist halt, dass die meisten compiler unvorhersehbare padding-bytes einfügen. das heißt, eine struct { char al; char ah; } ist nicht 2 bytes lang, sondern 8, weil nach jedem char drei paddingbytes landen.
und wenn du das jetzt per union über nen short int (also einen 16bittigen) legst, "greift ah ins leere" _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
|
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 30.07.2011, 20:03 Titel: |
|
|
Code: | Type ASMREGISTER
Union
e_x As Integer
Type
_x1 As Short
_x2 As Short
End Type
Type
_l1 As Byte
_h1 As Byte
_l2 As Byte
_h2 As Byte
End Type
End Union
End Type
|
e_x ist ein integer
_x1 ist das loword von e_x
_x2 ist das hiword von e_x
_l1 ist das loword von _x1
_h1 ist das hiword von _x1
_l2 ist das loword von _x2
_h2 ist das hiword von _x2
da gibt es bei mir keine probleme mit paddingbytes |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 30.07.2011, 20:07 Titel: |
|
|
Flo: Bei FreeBasic gibts dazu FIELD = 1, bei C++ auch Sprachkonstrukte womit du das padding nicht dem "zufall" überlässt.
//edit:
Was macht die 5-Zeichen-Festlegung bei Bezeichnern für einen Sinn?
Für die Dokumentation muss ich dich loben - Doku is ja normalerweise nicht so des Programmiers liebste Sache... _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 30.07.2011, 21:03 Titel: |
|
|
Ich bin zu doof herauszufinden wie man es so einbaut, dass es nicht 5, sondern mehr oder weniger Zeichen sein können. |
|
Nach oben |
|
|
Sannaj
Anmeldungsdatum: 19.12.2010 Beiträge: 35
|
Verfasst am: 31.07.2011, 21:49 Titel: |
|
|
Jo, die Doku ist wirklich lobenswert, die Leute vom Vala Compiler sollen sich mal ne Scheibe abschneiden.
Zu den Registern.
Das ganze lässt sich glaub ich mit:
Code: | union genRegister
e as integer
x as short
type field = 1
l as byte
h as byte
end type
end union
|
lösen. Es geht aber mehr darum, das du das in deiner int 42h ABI korregiert. Sonst gibts irgentwann böse Überraschungen. |
|
Nach oben |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 31.07.2011, 21:55 Titel: |
|
|
Naja mit LaTeX kann man so eine Doku aber noch viel schneller schreiben + sie sieht besser aus + man schlägt sich nicht mit OOo oder Word rum + Layout+Aussehen ist komplett zentralisierbar
fakeedit: Im Prinzip ist LaTeX ja so eine Art Papier-CMS |
|
Nach oben |
|
|
Sannaj
Anmeldungsdatum: 19.12.2010 Beiträge: 35
|
Verfasst am: 31.07.2011, 22:51 Titel: |
|
|
LaTeX ist aber kompliziert. Außerdem schlag ich mich nicht mit (Word oder OOo herum, weil ich LO nutze )
Zu der Sache mit den Labelname. Leg einfach fest, welche Zeichen in einem Bezeichner enthalten sein dürfen. Taucht ein anderes Zeichen auf ist der Bezeichner zu Ende. |
|
Nach oben |
|
|
MilkFreeze
Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 01.08.2011, 00:21 Titel: |
|
|
Dein Interpreter / Compiler lädt fast dazu ein sich mal mit assembler zu befassen. Bisher hab ich das immer gemieden.
Die Doku sieht gut aus, der code ebenfalls, auch wenn da etwas mehr kommentare angebracht wären.
Hast du vor noch einen echten Compiler daraus zu bauen? Momentan ist das ja eher ein Code-Emitter, der assembler in Freebasic umwandelt und dann mit dem FBC compiliert. Das wirkt etwas absurd, wenn man das mal so betrachtet:
ASM -> Freebasic -> ASM -> Objectcode -> Binary.
Und wenn der FBC noch den C-Emitter nutzt sieht das noch abstruser aus:
ASM -> FreeBASIC -> C -> ASM -> Objectcode -> Binary
Wobei ich mir vorstellen kann, dass ein Compiler der ASM in ne Binary umwandelt nicht unbedingt einfach zu schreiben ist. _________________ Milch ftw |
|
Nach oben |
|
|
Sannaj
Anmeldungsdatum: 19.12.2010 Beiträge: 35
|
Verfasst am: 01.08.2011, 00:40 Titel: |
|
|
Eigentich müsste es gar nicht so schwer sein. Aus deinem Assemblercompiler einen echten Makroassembler zu machen.
Die meisten Anweisungen kannst du übernehmen. Du musst lediglich: Die fblib und die fbgfxlib linken lassen und die "Interupts" in entsprechende Funktionsaufrufe umschreiben. Eventuell kannst du dir auch eine eigene Laufzeitbibilotek bauen. Die String und Functionen müsstest du noch in Label umschreiben und (für gas) noch ein ".intelsyntax nopräfix" oben anfügen. Das wars auch schon. |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 01.08.2011, 11:53 Titel: |
|
|
Vielleicht wäre es noch einfacher, dass ganze einfach in C-Code zu "übersetzen" und dann das ganze mit dem gcc zu compilieren, der ja auf jedem Linuxsystem schon vorhanden ist, sodass man sich nicht den fbc noch extra runter laden muss.
Macht es der FreeBasic-Compiler nicht anders? |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 01.08.2011, 12:38 Titel: |
|
|
Ob du jetzt einen C-Compiler oder den FreeBASIC-Compiler brauchst, darauf kommt es wohl nicht so sehr an. Wenn dann solltest du andere Compiler vollständig vermeiden sodass dein Programm direkt lauffähige Programme auswirft.
FreeBASIC compiliert wie MilkFreeze beschrieben hat (du musst natürlich den ersten Schritt weglassen). Mit -gen gas erzeugt er direkt ASM, mit -gen gcc erzeugt er C-Code (aber nicht unbedingt menschenlesbar). |
|
Nach oben |
|
|
Westbeam
Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 01.08.2011, 13:45 Titel: |
|
|
Hm, aber ich glaube einen "echten" Compiler zu schreiben ist wirklich sehr kompliziert. Außerdem muss er ja unter Windows und Linux anders aussehen. Ich denke das ist wirklich sehr viel Arbeit. |
|
Nach oben |
|
|
MilkFreeze
Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 01.08.2011, 16:04 Titel: |
|
|
Westbeam hat Folgendes geschrieben: | Hm, aber ich glaube einen "echten" Compiler zu schreiben ist wirklich sehr kompliziert. Außerdem muss er ja unter Windows und Linux anders aussehen. Ich denke das ist wirklich sehr viel Arbeit. |
Hätte aber den Vorteil das du keinen anderen Compiler voraussetzen musst. Aber Kompliziert dürfte das schon sein. Ich hab keine Ahnung wie man sowas machen könnte... _________________ Milch ftw |
|
Nach oben |
|
|
|