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:

int 0x1a funktioniert nicht

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
nonatz92



Anmeldungsdatum: 28.07.2009
Beiträge: 12

BeitragVerfasst am: 30.07.2009, 08:23    Titel: int 0x1a funktioniert nicht Antworten mit Zitat

Ich habe vor in Freebasic eine Subroutine zu schreiben, die die Geschwindigkeit misst, mit der das Programm ausgeführt wird. Hierbei möchte ich Inline-Assembler verwenden, da ich bei Assembler einfach ausrechnen kann, wie viel Byte eine Schleife umfasst. Bei folgendem Code-Stück stoße ich auf ein Problem:

asm
mov ah, 0x00
int 0x1a
end asm
sleep

Wenn ich das Programm dann starte, stürzt es ab. Weiß jemand, wie man dieses Problem behben kann?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 30.07.2009, 16:39    Titel: Antworten mit Zitat

Siehe:
http://www.freebasic-portal.de/index.php?s=reftopic&id=434
(letzter Abschnitt)
Kritische Assembleranweisungen
Je nach Betriebssystem oder Prozessortyp sind einige Assembleranweisungen nicht anwendbar. Im günstigsten Fall werden sie ignoriert oder mit einem Systemerror angezeigt, aber auch ein Systemcrash ist möglich.
Diese kritischen Assembleranweisungen für jedes Betriebssystem oder unterschiedliche Prozessortypen im Einzelfall aufzulisten ist zu kompliziert.
Wer in Assembler arbeiten möchte sollte die Einschränkungen der Hardware und des Betriebssystems, für das er schreiben möchte, kennen.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nonatz92



Anmeldungsdatum: 28.07.2009
Beiträge: 12

BeitragVerfasst am: 31.07.2009, 11:59    Titel: Antworten mit Zitat

Das Problem ist ja nicht, dass das ganze prinzipiell nicht funktioniert, int 0x1a is ein ganz normaler bios-interrupt und wenn ich den assembler-code zum Beispiel in nasm kompiliere funktioniert er wie er soll, nur wenn ich ihn per inline-assembler in freebasic einfüge stürzt das programm ab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 31.07.2009, 12:44    Titel: Antworten mit Zitat

Nimm dir doch mal an, was volta gesagt hat. zwinkern
Außerdem gibst du dir die Antwort schon selbst. Du willst einen (16-Bit-)-BIOS-Interrupt in einem 32-Bit-Programm verwenden. Windows arbeitet im Protected (32) bzw. Long (64) Mode, ohne Kopfstand kannst du da keinen BIOS-Interrupt aufrufen.
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nonatz92



Anmeldungsdatum: 28.07.2009
Beiträge: 12

BeitragVerfasst am: 02.08.2009, 09:10    Titel: Antworten mit Zitat

achso...das kann es sein, danke.

würde das denn dann mit der DOS-Freebasic-Version gehen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 02.08.2009, 09:49    Titel: Antworten mit Zitat

Du willst also gemäss

http://www.ctyme.com/intr/rb-2271.htm

die aktuelle Zeit holen? Das würde ich an Deiner Stelle mit TIME$ und TIMER wesentlich einfacher lösen!
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
nonatz92



Anmeldungsdatum: 28.07.2009
Beiträge: 12

BeitragVerfasst am: 03.08.2009, 17:00    Titel: Antworten mit Zitat

das Problem liegt darin, dass ich eigentlich nicht die Zeit brauche, sondern die Geschwindigkeit, mit der das Programm ausgeführt wird, und die brauche ich ziehlich präzise
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 04.08.2009, 17:46    Titel: Antworten mit Zitat

Hier ist eine Version für FreeBASIC unter Windows:
http://www.freebasic-portal.de/index.php?s=tutorials&id=26&seite=1

Eine absolute Präzision ist aber unter keinem Multitasking-Betriebssystem zu erreichen und kann von einem zum anderen Prozessortyp überraschende Unterschiede zeigen.
Diese Art die Anzahl der Takte (Zeit), für eine Befehlsausführung, zu ermitteln beruht darauf viele Versuche zu starten und die kürzeste gemessene Zeit als Ausführungszeit zu bestimmen.
Also eine statistische Auswertung, die dann mit der Realität (mehr oder) weniger zu tun hat.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nonatz92



Anmeldungsdatum: 28.07.2009
Beiträge: 12

BeitragVerfasst am: 04.08.2009, 20:34    Titel: Antworten mit Zitat

ich glaube ich werde hier von grund auf falsch verstanden:

ich brauche eine zahl, wieviel byte code der prozessor für das programm pro sekunde verarbeitet, nicht wieviele freebasic-befehle, da die sehr wahrscheinlich unterschiedliche bytelängen haben und das ganze nachzurechnen viel zu aufwendig wäre.

Deshalb möchte ich assembler verwenden,da man hier die bytezahl relativ einfach herausfinden kann, dafür wiederum brauche ich int 0x1a, das die real-time-clock ausliest und da dies nicht in der windows-version funktioniert, wollte ich wissen ob es in der DOS-Version möglich ist, int 0x1a zu verwenden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PMedia



Anmeldungsdatum: 14.08.2006
Beiträge: 2847

BeitragVerfasst am: 04.08.2009, 21:29    Titel: Antworten mit Zitat

Das geht nicht. Das hängt vom Befehl ab, und vom Prozessor. Man rechnet hier in Zyklen.
Moderne Architekturen sind teilweise sogar schon superskalar. Dies bedeutet, dass mehrere Befehle in einem Taktzyklus verarbeitet werden können.

Wenn du das trotzdem unbedingt messen magst, empfehle ich dir in C und Inline Assembly zu programmieren, und zwar auf Betriebssystemebene im Ring 0, http://sandpile.org und http://lowlevel.brainsware.org/wiki/index.php/Hauptseite dürften weiterhelfen.
ThePuppetMaster hat aber auch schon vorgeführt dass es mit FB prinzipell möglich ist, im LowLevel zu schreiben.

Aber generell wüsst ich gern für was für eine Art von Applikation du das tun magst...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 04.08.2009, 21:41    Titel: Antworten mit Zitat

Als Ergänzung zu PMedia: Bei modernen Architekturen kommt zusätzlich noch das Thema CPU-Cache ins Spiel, welches ein taktzyklusgenaues Timing praktisch unmöglich macht.

@nonatz92:
Wenn Du so ein taktzyklengenaues Timing haben möchtest, besorgst Du Dir lieber im EBay einen alten Commodore 64, denn im dortigen 6502/6510-8-Bit-Assembler hatten die Befehle noch exakt berechenbare Ausführzeiten, d.h. die zur Ausführung benötigte Anzahl Taktzyklen war damals noch für jede Instruktion bekannt.

Auch ein ganz alter Intel 8088-IBM XT-Rechner unter reinem MS-DOS arbeitete noch ohne CPU-Cache, so dass dort ebenfalls ein deterministisches Zeitverhalten bei der Ausführung vorhanden war. Aber spätestens ab 386er aufwärts wurden Cache-Speicher eingeführt, womit das zeitliche Verhalten nicht mehr so exakt bestimmbar ist.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 04.08.2009, 22:27    Titel: Antworten mit Zitat

nonatz92 hat Folgendes geschrieben:
ich glaube ich werde hier von grund auf falsch verstanden
absolut nicht!
nonatz92 hat Folgendes geschrieben:
das Problem liegt darin, dass ich eigentlich nicht die Zeit brauche, sondern die Geschwindigkeit, mit der das Programm ausgeführt wird
hättest dir den Link oben doch mal ansehen sollen.
Die Anzahl Takte die ein Proz für die Ausführung des Programms braucht sagt etwas über die Geschwindigkeit,
nonatz92 hat Folgendes geschrieben:
ich brauche eine zahl, wieviel byte code der prozessor für das programm pro sekunde verarbeitet, nicht wieviele freebasic-befehle, da die sehr wahrscheinlich unterschiedliche bytelängen haben und das ganze nachzurechnen viel zu aufwendig wäre.
Deshalb möchte ich assembler verwenden,da man hier die bytezahl relativ einfach herausfinden kann
nicht die Anzahl an Bytes pro Sek Kopf schütteln

Nach dieser Aussage fehlen dir doch noch einige Grundlagen.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nonatz92



Anmeldungsdatum: 28.07.2009
Beiträge: 12

BeitragVerfasst am: 04.08.2009, 23:16    Titel: Antworten mit Zitat

Erst einmal Danke für die antworten.

das ganze ding muss nicht auf einen Taktzyklus genau sein...ich möchte es benutzen, um servo-motoren anzusprechen, daher müsste eine toleranz von ca 1/20 milisekunde oder so schon möglich sein (ich weiß nicht genau was als Toleranz bei Servos angemessen ist, aber meine servos werden mit 1.3-1.7 milisekunden angesprochen, daher denke ich 1/20 milisekunde is ok), allerdings hätte ich es schon gern so genau wie möglich.

Und noch einmal zurück zu meiner anderen Frage:

Weiß jemand, ob die Bios-Interrupts in der DOS-Version funktionieren?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 04.08.2009, 23:24    Titel: Antworten mit Zitat

unter reinem DOS (MSDOS, freeDOS, usw) ja,
unter WinDOS nein (also nicht im DOSFenster)!


EDIT/
unter DOS wird
Code:
asm
  mov ah, 0
  int &h1a
end asm
sleep
diese Prog zwar nicht abstürzen aber auch nur einen leeren Screen zeigen. Ich hoffe du weißt warum?

2.EDIT/
genau zwinkern
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.


Zuletzt bearbeitet von volta am 05.08.2009, 16:38, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nonatz92



Anmeldungsdatum: 28.07.2009
Beiträge: 12

BeitragVerfasst am: 04.08.2009, 23:30    Titel: Antworten mit Zitat

danke, das ging ja schnell
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nonatz92



Anmeldungsdatum: 28.07.2009
Beiträge: 12

BeitragVerfasst am: 05.08.2009, 09:09    Titel: Antworten mit Zitat

weil int 0x1a nichts auf dem bildschirm ausgibt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum 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