Hi!
I denke daß das ist sehr dumm Frage, aber...
Kann man in QBasic ASM einsetzen?
Ich will die Function in ASM schreiben und zum QBasic geben.
Ist das möglich?
-----------------------------------------------------------------------------------------
Rußland
ASM mit QBasic...
Moderatoren: crack, Krüsty, Marwin
- Marwin
- Moderator
- Beiträge: 307
- Registriert: Donnerstag 8. Mai 2003, 21:19
- Wohnort: Seelow, Deutschland
- Kontaktdaten:
Nein, mit QBasic geht das nicht, aber mit
QuickBasic.
Dabei gibt es gleich mehrere Möglichkeiten, ich habe aber bisher nur eine
verwendet, und zwar [span style=color:blue]CALL ABSOLUTE[/span].
Dies ist das Beispiel aus der QuickBasic-Hilfe:
Der Assemblercode ist im Hex-Format in den DATA-Zeilen angegeben. Dieser
Code ermittelt, ob ein math. Koprozessor im PC installiert ist. Bevor der
Code aber ausgeführt werden kann muss dieser zum Beispiel wie hier in einem
Datenfeld gespeichert werden. Danach kann der Assemblercode mit
[span style=color:blue]CALL ABSOLUTE[/span] ausgeführt werden.
Diese Möglichkeit habe ich in den Programmen KillMe, Motorama und
Anamorphosen 2.0 verwendet um die Mausposition und den Status der
Maus-Buttons abzufragen.
Eine andere bessere Möglichkeit sind die Funktionen
[span style=color:blue]CALL[/span] und [span style=color:blue]CALLS[/span]. Dazu muss vorher
der Assemblercode allerdings mit einem Assembler compiliert werden (zum
Beispiel mit MASM oder TASM). Danach kann man die OBJ-Datei beim
Compilieren des Basic-Programms einbinden. Oder man erstellt eine
Bibliothek (*.LIB) und verwendet diese mit dem Basic-Programm.
Aber mit dieser Möglichkeit habe ich mich nie beschäftigt, daher kann ich
dazu auch nichts näheres sagen.
Marwin
QuickBasic.
Dabei gibt es gleich mehrere Möglichkeiten, ich habe aber bisher nur eine
verwendet, und zwar [span style=color:blue]CALL ABSOLUTE[/span].
Dies ist das Beispiel aus der QuickBasic-Hilfe:
Code: Alles auswählen
CONST nASMBYTES = 14
DEFINT A-Z
DIM AsmProg(1 TO (nASMBYTES / 2))
AsmBytes:
DATA &H55 : PUSH BP Speichere Basiszeiger.
DATA &H8B, &HEC : MOV BP,SP Hole unseren eigenen.
DATA &HCD, &H11 : INT 11H F?hre ROM-BIOS-Aufruf durch.
DATA &H8B, &H5E, &H06 : MOV BX,[BP+6] Hole Argument-Adresse.
DATA &H89, &H07 : MOV [BX],AX Speichere Liste in Argument.
DATA &H5D : POP BP Stelle Basiszeiger wieder her.
DATA &HCA, &H02, &H00 : RET 2 Hole Argument vom Stapel, und
f?hre
langen R?cksprung aus.
P = VARPTR(AsmProg(1))
DEF SEG = VARSEG(AsmProg(1)) Wechsle das Segment.
RESTORE AsmBytes
FOR I = 0 TO nASMBYTES - 1
READ J
POKE (P + I), J
NEXT I
CALL ABSOLUTE(X%, VARPTR(AsmProg(1)))
DEF SEG vorheriges Segment wiederherstellen
CoProcessor = X% AND &H2
IF CoProcessor = 2 THEN
PRINT "Mathematischer Koprozessor vorhanden."
ELSE
PRINT "Kein mathematischer Koprozessor vorhanden."
END IF
ENDCode ermittelt, ob ein math. Koprozessor im PC installiert ist. Bevor der
Code aber ausgeführt werden kann muss dieser zum Beispiel wie hier in einem
Datenfeld gespeichert werden. Danach kann der Assemblercode mit
[span style=color:blue]CALL ABSOLUTE[/span] ausgeführt werden.
Diese Möglichkeit habe ich in den Programmen KillMe, Motorama und
Anamorphosen 2.0 verwendet um die Mausposition und den Status der
Maus-Buttons abzufragen.
Eine andere bessere Möglichkeit sind die Funktionen
[span style=color:blue]CALL[/span] und [span style=color:blue]CALLS[/span]. Dazu muss vorher
der Assemblercode allerdings mit einem Assembler compiliert werden (zum
Beispiel mit MASM oder TASM). Danach kann man die OBJ-Datei beim
Compilieren des Basic-Programms einbinden. Oder man erstellt eine
Bibliothek (*.LIB) und verwendet diese mit dem Basic-Programm.
Aber mit dieser Möglichkeit habe ich mich nie beschäftigt, daher kann ich
dazu auch nichts näheres sagen.
Marwin
- Marwin
- Moderator
- Beiträge: 307
- Registriert: Donnerstag 8. Mai 2003, 21:19
- Wohnort: Seelow, Deutschland
- Kontaktdaten:
Ab der Version 2.0 wird QBasic nicht mehr Qbasic sondern QuickBasic genannt, die Version 7.1 besitzt wieder einen anderen Namen: "QuickBasic Extended".
Das hat etwas damit zu tun, dass der Leistungsumfang der einzelnen Versionen erweitert wurde, daher hat man sich bei Microsoft dann wohl auch entschieden, unterschiedliche Namen zu verwenden.
Ich habe eine ganze Weile herumprobiert und habe es nun geschafft Assembler mit QuickBasic zu benutzen.
Entpacke das Archiv in deinen QuickBasic-Ordner, und kopiere danach TASM.EXE und TLINK.EXE in den selben Ordner. Dann kannst du die Datei compile.bat ausführen.
Das Basic-Programm übergibt der Assembler-Routine den ASCII-Wert eines Zeichens, dieses wird dann von der Assembler-Routine dargestellt. Aber ich weiß leider noch nicht, wie man Werte an das Basic-Programm zurückgibt.
Marwin