| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen | 
	
	
		| Autor | Nachricht | 
	
		| Westbeam 
 
  
 Anmeldungsdatum: 22.12.2009
 Beiträge: 760
 
 
 | 
			
				|  Verfasst am: 27.07.2011, 21: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, 00: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, 10: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.
 
 
 Richtig, es gibt auch nicht nur fehlende Register in meinem Compiler/Interpreter, sondern gibt es auch weder Stackbefehle noch gibt es Flags(Zero, Carry ...) 	  | Zitat: |  	  | Neben ax, bx, cx und dx gibts auch noch: si , di, sp, bp, sowie cs,ds ss, es. | 
   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: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 30.07.2011, 15: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, 17:54    Titel: |   |  
				| 
 |  
				| UNION wäre wohl wesentlich praktischer für die Register. |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4711
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 30.07.2011, 18: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, 18: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, 18: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, 19: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: 958
 Wohnort: Austria
 
 | 
			
				|  Verfasst am: 30.07.2011, 19: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, 20: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, 20: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, 20: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, 21: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: 31.07.2011, 23: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: 31.07.2011, 23: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, 10: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, 11: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, 12: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, 15: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 |  | 
	
		|  | 
	
		|  |