 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Horst
Anmeldungsdatum: 07.01.2011 Beiträge: 6 Wohnort: Bielefeld
|
Verfasst am: 07.01.2011, 18:53 Titel: Fehlermeldung von FreeBASIC |
|
|
Hallo,
ich benötige für einen 486er-Klone ganz dringend ein kleines Programm zu Einstellung der CPU-Speed.
Da ich keinerlei Entwicklungssoftware mehr habe, habe ich im Intermnet nach einer Lösung gesucht.
Dabei bin ich auf FreeBASIC gestossen und finde es geeignet, weil man Assemblerbefehle direkt einbinden kann.
Ich habe das vom Mainboard-Hersteller Beispielprogramm umgeschrieben und compiliert.
CLS
PRINT "CPU-Takt 100 MHz"
ASM
mov dx, cf8h
mov eax, 800000a0h
out dx, eax
mov dx, cfch
in eax, dx
or eax, 00000007h
out dx, eax
END ASM
PRINT "eingestellt"
END
Zunächst wurden 2 Fehler gemeldet:
Zeile 34, Error: junk '0ah' after expression
Zeile 36. Error: junk 'h' after expression
Habe dann die eine Zeile geändert in
or eax, 7
und es wird nur noch der Fehler in Zeile 34 gemeldet.
Ich benutze die Windows-Version von FreeBASIC unter Windows 2000 Professional mit SP4.
Anschliessend will ich das compilierte Programm auf dem 486er laufen lassen, das wird ja wohl problemlos gehen.
Oder muß ich die DOS-Version von FreeBASIC auf dem 486er benutzen ?
Für ein paar Tipps wäre ich sehr dankbar !
Gruß Horst
Beispiel des Mainboard-Herstellers:
mov dx, cf8h ; PCI-address port set = north bridge offset register 0ah
mov eax, 800000a0h
out dx, eax
mov dx, cfch ; PCI data port read / write
in eax, dx
; if CPU clock is 300 MHz
or eax, 00000001h ; set CPU clock to 150 MHz
or eax, 00000004h ; set CPU clock to 60 MHZ
out dx, eax
speed control register bit 2-0:
000 = divide 1
001 = divide 2
010 = divide 3
...
101 = divide 6
110 = divide 7
111 = divide 8
P.S.: ist mein erster Eintrag im Forum, evtl. formalen Fehler bitte ich zu entschuldigen. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 07.01.2011, 18:57 Titel: |
|
|
Ich habe bisher nie ASM-Code in FB geschrieben, aber die naheliegendste Vermutung wäre, dass der Assembler Hex-Zahlen im C-Format erwartet, also z.B. 0x800000a0 statt 800000a0h. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Horst
Anmeldungsdatum: 07.01.2011 Beiträge: 6 Wohnort: Bielefeld
|
Verfasst am: 07.01.2011, 19:45 Titel: Problem - hoffentlich - gelöst |
|
|
Hexzahlen = &H800000a0, &Hcf8 und &Hcfc
Gruß Horst |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 08.01.2011, 22:12 Titel: |
|
|
Für Assembler-Befehle innerhalb FreeBasic kannst du sowohl das Basic Format ( &H01A ) als auch das C-Format ( 0x01A ) verwenden.
Wenn auf dem Zielrechner, also dem 486er sofern ich dich richtig verstanden habe, nur DOS läuft musst du auch ein DOS-Programm erstellen.
Unter Windows verwendest du dazu entweder die DOS-Version von FreeBasic oder verwendest die Windows-Version von FreeBasic und führst den Compiler mit dem Parameter "-target dos" aus.
Damit letzteres funktioniert musst du allerdings auch die DOS-Version herunterladen und die zum compilieren für DOS nötigen Dateien in den Ordner der Windows FreeBasic Version geben. Dies wäre der Ordner "bin\dos" und "lib\dos".
Je nach Wissensstand empfehle ich letztere Methode nur für Fortgeschrittene Nutzer. Ansonsten reicht erstere Methode völlig.
Weitere eventuell nützliche Hinweise:
- Dein Programm wird höchstwahrscheinlich unter Windows nicht funktionieren, da du die Assembleranweisungen IN und OUT verwendest. Diese sind im Protected Mode unter Windows normalerweise nicht erlaubt. FreeBasic bietet stattdessen selbst zwei Befehle mit selbigem Namen, die diese Beschränkung durch einen eigenen Hardwaretreiber umgeht.
- Da FreeBasic ein 32-Bit Compiler ist können damit erstellte DOS-Programme nur mit einem DOS Extender ausgeführt werden. Hierbei läuft der Prozessor zwar auch im Protected Mode, aber die Assembleranweisungen IN und OUT sind normalerweise erlaubt. Da ich das selbst aber noch nicht ausprobiert hab, bin ich mir in diesem Punkt nicht 100% sicher, ob das wirklich funktioniert.
- Je nachdem was du sonst noch in deinem Programm machen willst wäre es überlegenswert das Programm in reinem Assembler zu programmieren. Wenn du nur den CPU-Takt umschalten willst und der obige Code dafür ausreicht würde ich dies auf jeden Fall empfehlen. Unter DOS könntest du z.B. den Netwide Assembler (NASM) oder den guten alten Turbo Assembler (TASM) verwenden. Weiters würde in deinem Fall, wenn du also das Programm nur unter DOS verwenden willst und das Programm nicht recht groß ist, ein COM Programm ausreichen womit du dich nicht um Segmentierung kümmern müsstest.
________________________
Ich hoffe es waren einige hilfreiche Kommentare dabei.
mfG,
St_W _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
Horst
Anmeldungsdatum: 07.01.2011 Beiträge: 6 Wohnort: Bielefeld
|
Verfasst am: 09.01.2011, 15:11 Titel: Danke ! |
|
|
Jetzt funktioniert es mit der DOS-Version.
Aber doch noch eine Frage:
gibt es im Download-Bereich fertige Prozeduren/Unterprogramme für
dezimal -> binäer
und
dezimal -> hex
wobei der dezimale Eingangswert eine Variable und kein Ausdruck ist und da es sich eigentlich um einen bit-Wert handelt als Dezimalwert negativ interpretiert wird ?
Z.B. &h800000a0
= -2147483488
= 1000 0000 0000 0000 0000 0000 1010 0000
Das neue Mainboard hat "jede Menge" Register, welche bitweise gesetzt/gelöscht werden müssen. Und sicherheitshalber möchte ich das Ergebnis per Rücklesen überprüfen.
Horst |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 09.01.2011, 15:46 Titel: Umrechnen zwischen Stellenwertsystemen |
|
|
Hallo,
FreeBASIC bietet bereits Funktionen, um Zahlen in andere Stellenwertsysteme umzurechnen:
Code: | Dim wert As Integer
wert = &h800000a0
print "Dezimal: " & wert
print "Hexadezimal: " & hex(wert)
print "Binaer: " & bin(wert,32)
print "Octal: " & oct(wert)
print
print "---"
print
dim dualzahl as string
dualzahl = "10101000101001011111"
print dualzahl; " im Dezimalsystem: " & ValInt("&b" & dualzahl)
sleep |
Ansonsten hat der Windows-Taschenrechner aber auch einen "wissenschaftlichen Modus", mit dem man zu Kontrollzwecken z.B. binär->dezimal umrechnen kann.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
Horst
Anmeldungsdatum: 07.01.2011 Beiträge: 6 Wohnort: Bielefeld
|
Verfasst am: 10.01.2011, 00:27 Titel: Nochmals Danke ! |
|
|
Alles bestens ... und nun ist Feierabend
Gruß Horst |
|
Nach oben |
|
 |
|
|
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.
|
|