ASM mit QBasic...

Die bekannteste Programmiersprache der Welt

Moderatoren:crack, Marwin, Krüsty

Antworten
Ignat
Alter Hase
Beiträge:80
Registriert:Samstag 2. August 2003, 11:13
Kontaktdaten:

Beitrag von Ignat » Freitag 8. August 2003, 20:17

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
If the ship don't know where to go - it has no fair wind...

Benutzeravatar
Marwin
Moderator
Beiträge:307
Registriert:Donnerstag 8. Mai 2003, 21:19
Wohnort:Seelow, Deutschland
Kontaktdaten:

Beitrag von Marwin » Freitag 8. August 2003, 22:08

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:

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
END
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

Ignat
Alter Hase
Beiträge:80
Registriert:Samstag 2. August 2003, 11:13
Kontaktdaten:

Beitrag von Ignat » Freitag 8. August 2003, 22:31

Das ist sehr verwickelt... (Hex-Format).
I werde nur mit .obj arbeiten...
Aber ist das richtig:
QBasic[]QuickBasic? :)
Warum?
Welche Unterschied?

--------------------------------------------------------------------------------------
Rußland
If the ship don't know where to go - it has no fair wind...

Benutzeravatar
Marwin
Moderator
Beiträge:307
Registriert:Donnerstag 8. Mai 2003, 21:19
Wohnort:Seelow, Deutschland
Kontaktdaten:

Beitrag von Marwin » Samstag 9. August 2003, 18:54

:)
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

Antworten