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:

Problem mit call interrupt

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
zwergnase



Anmeldungsdatum: 03.01.2006
Beiträge: 26
Wohnort: Frankfurt am Main

BeitragVerfasst am: 25.07.2006, 14:45    Titel: Problem mit call interrupt Antworten mit Zitat

Hallo Leute. Probiere gerade mit call interrupt rum. Beschäftige mich gerade mit den vom BIOS zur Verfügung gestellten Tastaturfunktionen. Da klappt auch alles ganz gut. Nur hängt es bei mir am folgenden Schritten:

1. Angabe der HEX Zahlen
Da solche Zugriffe typisch für Assembler sinf findet man auch eigentilich nur Assembler Anleitungen. Dort wird eine HEX-Zahl wie folgt angegeben. 016h. Das kann ich aber nicht bei qbasic verwenden. Bei InReg,AX = 016h gibt er mir einen Fehler aus. Wie muss ich das in qbasic eingeben?

2. AH und AL auslesen
AH und AL sind ja teile von AX. Ich bekomme aber nur AX als ausgabe bei CALL INTERRUPT welches als INTEGER definiert ist.
Ich brauche aber den Wert von AH und AL. Wie komm ich an diese ran?

Martin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
A.K.



Anmeldungsdatum: 02.05.2005
Beiträge: 467
Wohnort: HH

BeitragVerfasst am: 25.07.2006, 14:53    Titel: Antworten mit Zitat

HI,

zu 1:
eine Hexzahl in QB gibt man mit einem vorangestelltem &H an.
Wenn du also zum Beispiel den INT 16h aufrufen willst sieht das so aus: &H16

zu 2:
Code:

AL = reg.ax AND &HFF    (oder AND 255, is das Gleiche)
AH = reg.ax \ 256          (das \ gibt eine Division ohne Rest an)

Andersrum: reg.ax = (AH*256)+AL



Wenn du AH berechnest nach der obigen Methode kann es passieren das du eine negative Zahl erhälst. Das liegt daran das Integer-Zahlen in QB Vorzeichenbehaftet sind.
Als zusätzliche Abfrage kannst du deswegen noch das hier einbauen:
Code:

AH = reg.ax \ 256
IF AH <0 THEN AH = AH + 128


MFG A.K.
_________________

http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU*
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
zwergnase



Anmeldungsdatum: 03.01.2006
Beiträge: 26
Wohnort: Frankfurt am Main

BeitragVerfasst am: 25.07.2006, 15:10    Titel: FUNZT! Aber wie? Antworten mit Zitat

Hey super, danke für die schnelle Antwort A.K. Habs gleich ausprobiert. Es funderbar.
Die Rechnungen versteh ich aber nicht so ganz. Wenn du noch Zeit und Lust hast würd ich mich über eine Erklärung sehr freuen. verlegen
Echt Geil! happy Mit diesem Wissen stehen ja so gut wie alle Türen offen. Kennst du oder jemand anderes vieleicht eine gute Seite auf der die ganzen Interrupts vom BIOS und DOS aufgelistet sind?
Danke

Martin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
A.K.



Anmeldungsdatum: 02.05.2005
Beiträge: 467
Wohnort: HH

BeitragVerfasst am: 25.07.2006, 15:34    Titel: Antworten mit Zitat

HI,

also wenn du englisch kannst dann wäre das hier was für dich:
http://www.scs.cmu.edu/afs/cs.cmu.edu/user/ralf/pub/WWW/files.html
Das ist Ralph Browns Interruptliste und listet wirklich alle INT's auf mit deren Funktionen.
Einfach PART A-F herunterladen, entpacken und anschauen.


So, nochmal zur Berechnung der Register:

Ein ganz normales CPU-Register besteht aus 16BIT und kann Werte von 0-65535 annehmen.
So ein Register ist auch AX.
Dieses Register selber wird in zwei 8BIT-Register unterteilt.
Die unteren 8 Bit werden als Register AL (AX_Low) bezeichnet und die oberen 8 Bit als Register AH (AX_High).
Diese Teilregister können, da sie 8 Bit besitzen, Werte on 0-255 darstellen.
So.
Und das einzige was wir mit der oberen Rechnung tun, ist die "Herausfilterung" der jeweiligen Bit's.
Code:
AL = reg.ax AND &HFF    (oder AND 255, is das Gleiche)

Ist nichts anderes als das wir qb jetzt sagen das wir von reg.ax nur die unteren 8 Bit's haben wollen. AND selber ist eine Bitüberprüfung.

Code:
AH = reg.ax \ 256

Ist nichts anderes als das wir qb jetzt sagen das wir von reg.ax nur die oberen 8 Bit's haben wollen. Durch die Division werden die oberen 8 Bits quasi "nach rechts geschoben" und stehen nun an der Stelle der unteren 8 Bits und ergeben einen sinnvollen Wert.

Die Bitverknüpfung selber zu erklären würde jetzt hier aber den Rahmen sprengen. Empfehlung dazu: Sich am besten mal das Binärzahlensystem anschauen. Und dann mit AND, OR, XOR, NOR etc. rumspielen. Da lernt man das am schnellsten.


MFG A.K.
_________________

http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU*
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 25.07.2006, 22:14    Titel: Antworten mit Zitat

Zur AX in AH + AL-Zerhackproblematik: Ich habe teilweise auch schon den Weg über Strings genommen unter Zuhilfsnahme der Typen-Castingfunktionen MKI$() und CVI(). Sieht dann ungefähr wie folgt aus:
Code:
ax% = CVI(CHR$(al%) + CHR$(ah%))
ah% = ASC(RIGHT$(MKI$(ax%), 1))
al% = ASC(LEFT$(MKI$(ax%), 1))

Leider besitzt QB kein SHL und SHR (Bit-Shift-Operatoren), sonst könnte man das Ganze effizienter programmieren.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail 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 -> Allgemeine Fragen zu QBasic. 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