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:

Assembler-2000 Compiler
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 27.07.2011, 22:02    Titel: Assembler-2000 Compiler Antworten mit Zitat

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 lächeln ), 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
Benutzer-Profile anzeigen Private Nachricht senden
Sannaj



Anmeldungsdatum: 19.12.2010
Beiträge: 35

BeitragVerfasst am: 30.07.2011, 01:10    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 30.07.2011, 11:20    Titel: Antworten mit Zitat

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 ...) zwinkern
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? zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 30.07.2011, 16:31    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 30.07.2011, 18:54    Titel: Antworten mit Zitat

UNION wäre wohl wesentlich praktischer für die Register.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 30.07.2011, 19:21    Titel: Antworten mit Zitat

An UNION habe ich auch schon gedacht, kenne es aber zu wenig, um mich zu trauen es vorzuschlagen. happy
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 30.07.2011, 19:35    Titel: Antworten mit Zitat

Uuh, ein Profi der nicht weiß was ein Union ist. lachen
Nein Spaß. zwinkern

-> Ich muss selbst erstmal nachschauen was ein Union ist.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 30.07.2011, 19:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
XOR



Anmeldungsdatum: 23.07.2010
Beiträge: 161

BeitragVerfasst am: 30.07.2011, 20:03    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 30.07.2011, 20:07    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 30.07.2011, 21:03    Titel: Antworten mit Zitat

Ich bin zu doof herauszufinden wie man es so einbaut, dass es nicht 5, sondern mehr oder weniger Zeichen sein können. traurig
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sannaj



Anmeldungsdatum: 19.12.2010
Beiträge: 35

BeitragVerfasst am: 31.07.2011, 21:49    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 31.07.2011, 21:55    Titel: Antworten mit Zitat

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 happy

fakeedit: Im Prinzip ist LaTeX ja so eine Art Papier-CMS
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sannaj



Anmeldungsdatum: 19.12.2010
Beiträge: 35

BeitragVerfasst am: 31.07.2011, 22:51    Titel: Antworten mit Zitat

LaTeX ist aber kompliziert. Außerdem schlag ich mich nicht mit (Word oder OOo herum, weil ich LO nutze happy)

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



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 01.08.2011, 00:21    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 19.12.2010
Beiträge: 35

BeitragVerfasst am: 01.08.2011, 00:40    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 01.08.2011, 11:53    Titel: Antworten mit Zitat

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. zwinkern
Macht es der FreeBasic-Compiler nicht anders?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 01.08.2011, 12:38    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 01.08.2011, 13:45    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.04.2011
Beiträge: 116

BeitragVerfasst am: 01.08.2011, 16:04    Titel: Antworten mit Zitat

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 grinsen
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 -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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