 |
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: 4568 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: 4568 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: 5956 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 _________________
Der Markt regelt das! | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1873 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.
|
|