Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
nonatz92
Anmeldungsdatum: 28.07.2009 Beiträge: 12
|
Verfasst am: 30.07.2009, 08:23 Titel: int 0x1a funktioniert nicht |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 30.07.2009, 16:39 Titel: |
|
|
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 |
|
|
nonatz92
Anmeldungsdatum: 28.07.2009 Beiträge: 12
|
Verfasst am: 31.07.2009, 11:59 Titel: |
|
|
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 |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 31.07.2009, 12:44 Titel: |
|
|
Nimm dir doch mal an, was volta gesagt hat.
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 |
|
|
nonatz92
Anmeldungsdatum: 28.07.2009 Beiträge: 12
|
Verfasst am: 02.08.2009, 09:10 Titel: |
|
|
achso...das kann es sein, danke.
würde das denn dann mit der DOS-Freebasic-Version gehen? |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
|
nonatz92
Anmeldungsdatum: 28.07.2009 Beiträge: 12
|
Verfasst am: 03.08.2009, 17:00 Titel: |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 04.08.2009, 17:46 Titel: |
|
|
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 |
|
|
nonatz92
Anmeldungsdatum: 28.07.2009 Beiträge: 12
|
Verfasst am: 04.08.2009, 20:34 Titel: |
|
|
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 |
|
|
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 04.08.2009, 21:29 Titel: |
|
|
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 |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 04.08.2009, 21:41 Titel: |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 04.08.2009, 22:27 Titel: |
|
|
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
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 |
|
|
nonatz92
Anmeldungsdatum: 28.07.2009 Beiträge: 12
|
Verfasst am: 04.08.2009, 23:16 Titel: |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1874 Wohnort: D59192
|
Verfasst am: 04.08.2009, 23:24 Titel: |
|
|
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 _________________ 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 |
|
|
nonatz92
Anmeldungsdatum: 28.07.2009 Beiträge: 12
|
Verfasst am: 04.08.2009, 23:30 Titel: |
|
|
danke, das ging ja schnell |
|
Nach oben |
|
|
nonatz92
Anmeldungsdatum: 28.07.2009 Beiträge: 12
|
Verfasst am: 05.08.2009, 09:09 Titel: |
|
|
weil int 0x1a nichts auf dem bildschirm ausgibt |
|
Nach oben |
|
|
|