| 
				
					|  | 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 |  
		| Westbeam 
 
  
 Anmeldungsdatum: 22.12.2009
 Beiträge: 760
 
 
 | 
			
				|  Verfasst am: 24.07.2011, 10:18    Titel: Inlineassembler funktioniert merkwürdig |   |  
				| 
 |  
				| Hi 
 Ich möchte mit dem FreeBasic Inlineassembler und int 10h den Bildschirmmodus 12 setzen. Das müsste so gehen:
 
  	  | Code: |  	  | Asm mov ah,00h
 mov al,12h
 int 10h
 End Asm
 Sleep
 | 
 Aber scheinbar darf ich keine "h"'s in den Operatoren haben, aber ohne geht es leider nicht.
   Weiß jemand Abhilfe?
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 24.07.2011, 10:48    Titel: |   |  
				| 
 |  
				| Mit ASM kenne ich mich nicht aus, aber das h steht sicherlich für hexadezimal. Ich könnte mir vorstellen, dass du in FreeBASIC die Dezimalzahlen verwenden musst (also z. B. INT 16) oder die Hexadezimalwerte auf andere Weise deklariert werden (möglicherweise wie im restlichen Code mit &h10?) 
 edit: sieh mal da ... http://www.freebasic-portal.de/tutorials/inlineassembler-in-freebasic-50-s9.html
 _________________
 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: 24.07.2011, 11:07    Titel: |   |  
				| 
 |  
				| Wenn ich es so mache 
  	  | Code: |  	  | Asm mov ah,&h00
 mov al,&h12
 int &h10
 End Asm
 Sleep
 | 
 lässt es sich zwar kompilieren, aber beim ausführen bekomme ich einen "Segmentation fault".
 |  |  
		| Nach oben |  |  
		|  |  
		| nemored 
 
  
 Anmeldungsdatum: 22.02.2007
 Beiträge: 4710
 Wohnort: ~/
 
 | 
			
				|  Verfasst am: 24.07.2011, 11:18    Titel: |   |  
				| 
 |  
				| Macht INT &h10 in deinem System auch das, was da im Wiki steht? Assembler ist sehr systemspezifisch. _________________
 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: 24.07.2011, 11:22    Titel: |   |  
				| 
 |  
				| Wenn ich ein identisches Programm mit int 10h als nasm-Assemblercode kompiliere, funktioniert es. |  |  
		| Nach oben |  |  
		|  |  
		| Sebastian Administrator
 
  
 Anmeldungsdatum: 10.09.2004
 Beiträge: 5969
 Wohnort: Deutschland
 
 | 
			
				|  Verfasst am: 24.07.2011, 12:05    Titel: |   |  
				| 
 |  
				| Hallo, 
 es ist zwar lange her, dass ich mich mal ein bisschen mit x86-Assembler beschäftigt habe, aber das Problem müsste in dem Fall ungefähr Folgendes sein:
 Der Interrupt 10h ist ein BIOS-Interrupt, der sozusagen ein abstraktes "API" für die Grafikausgabe bereitstellt. Das heißt, man muss nicht modellspezifisch die GraKa ansprechen, sondern kann diesen Interrupt Call verwenden.
 Wenn du das in einem Assembler für 16-Bit Real-Mode machst und eine COM-Datei erzeugst, wird die erzeugte Binärdatei unter Windows in der ntvdm, der virtuellen DOS-Maschine unter aktuellen Windows-Versionen, ausgeführt. Darin kann man solche Low-Level-Interrupts benutzen, weil die ntvdm diese primitive DOS-Umgebung "emuliert".
 Wenn du allerdings die 32-Bit-Version von FreeBASIC benutzt und Windows-Anwendungen erzeugst, kannst du darin nicht einfach solche Interrupts benutzen - erst recht nicht, um auf einen gfxlib-Screen zu zeichnen. Der SCREEN, den dir FreeBASIC bereitstellt, ist eine Abstraktion von DirectX bzw. GDI (afair ganz früher mal SDL). Den kann man zwar so einfach benutzen wie in QB, aber es steckt letztlich etwas ganz anderes dahinter. Ich kann mir nicht vorstellen, dass man den ganzen Unterbau von Windows so "umgehen" und mit BIOS-Interrupts irgendwelche Ausgaben auf den Bildschirm zeichnen kann, während Windows läuft. Von daher dürfte es unmöglich sein, mit Interrupts in FB für Windows irgendeine Grafikausgabe herbeizuführen. Es sei denn, FreeBASIC würde zur Compilezeit erkennen, was du da tust und die Interrupt Calls in gfxlib-Befehle umwandeln, aber ich wüsste nicht, dass das möglich wäre.
 Das, was du mit NASM erzeugst, wird also ganz anders ausgeführt, als eine FreeBASIC-EXE und der Grafikbildschirm von FreeBASIC ist mit dem von DOS-Anwendungen technisch auch nicht zu vergleichen.
 Wenn du Grafikausgabe in FB mit Assembler beschleunigen möchtest, wirst du das vermutlich nur dahingehend machen können, dass du mit ASM-Instruktionen die Daten des FB-Grafikpuffers manipulierst, statt den "Dienstweg" über PSET und Co. zu gehen.
 Ein Experte auf dem Gebiet ist übrigens volta, aber der ist hier zur Zeit leider nicht mehr so oft zu sehen.
   
 Viele Grüße!
 Sebastian
 _________________
 
   Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
 |  |  
		| Nach oben |  |  
		|  |  
		| volta 
 
 
 Anmeldungsdatum: 04.05.2005
 Beiträge: 1876
 Wohnort: D59192
 
 | 
			
				|  Verfasst am: 24.07.2011, 19:12    Titel: |   |  
				| 
 |  
				| Hi, wie Sebastian schon geschrieben hat verhält sich MASM anders als InlineAsm in FreeBASIC. Das ist immer noch Basic, der Asm-Teil wird hier eingebettet.
 Wenn du einen Screen über Inline öffnen willst:
 http://www.freebasic-portal.de/befehlsreferenz/stdcall-408.html
 
 
  	  | Code: |  	  | #Include "fbgfx.bi" 
 'SCREEN 18,32
 Asm
 push 0  '5. Parameter optional
 push 0  '4. Parameter optional
 push 0  '3. Parameter optional
 push 32 '2. Parameter Farbbits
 push 18 '1. Parameter Screenmodus
 call _fb_GfxScreen@20
 End Asm
 | 
 
 @Sebastian
 Ja, durch eine Erkrankung war ich nur noch selten online. Ich hoffe das ich in Zukunft häufiger hier mitlesen kann.
 _________________
 Warnung an Choleriker:
 Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
 Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
 |  |  
		| 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.
 
 |  |