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:

Inlineassembler funktioniert merkwürdig

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 24.07.2011, 10:18    Titel: Inlineassembler funktioniert merkwürdig Antworten mit Zitat

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. neutral
Weiß jemand Abhilfe?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 24.07.2011, 10:48    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 24.07.2011, 11:07    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 24.07.2011, 11:18    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 24.07.2011, 11:22    Titel: Antworten mit Zitat

Wenn ich ein identisches Programm mit int 10h als nasm-Assemblercode kompiliere, funktioniert es.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 24.07.2011, 12:05    Titel: Antworten mit Zitat

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. neutral

Viele Grüße!
Sebastian
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1856
Wohnort: D59192

BeitragVerfasst am: 24.07.2011, 19:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
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