Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
zwergnase
Anmeldungsdatum: 03.01.2006 Beiträge: 26 Wohnort: Frankfurt am Main
|
Verfasst am: 25.07.2006, 14:45 Titel: Problem mit call interrupt |
|
|
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 |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 25.07.2006, 14:53 Titel: |
|
|
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 |
|
 |
zwergnase
Anmeldungsdatum: 03.01.2006 Beiträge: 26 Wohnort: Frankfurt am Main
|
Verfasst am: 25.07.2006, 15:10 Titel: FUNZT! Aber wie? |
|
|
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.
Echt Geil! 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 |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 25.07.2006, 15:34 Titel: |
|
|
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.
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 |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 25.07.2006, 22:14 Titel: |
|
|
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 |
|
 |
|