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:

Fehlermeldung von FreeBASIC

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



Anmeldungsdatum: 07.01.2011
Beiträge: 6
Wohnort: Bielefeld

BeitragVerfasst am: 07.01.2011, 18:53    Titel: Fehlermeldung von FreeBASIC Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 07.01.2011, 18:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Horst



Anmeldungsdatum: 07.01.2011
Beiträge: 6
Wohnort: Bielefeld

BeitragVerfasst am: 07.01.2011, 19:45    Titel: Problem - hoffentlich - gelöst Antworten mit Zitat

Hexzahlen = &H800000a0, &Hcf8 und &Hcfc

Gruß Horst
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 08.01.2011, 22:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Horst



Anmeldungsdatum: 07.01.2011
Beiträge: 6
Wohnort: Bielefeld

BeitragVerfasst am: 09.01.2011, 15:11    Titel: Danke ! Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 09.01.2011, 15:46    Titel: Umrechnen zwischen Stellenwertsystemen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Horst



Anmeldungsdatum: 07.01.2011
Beiträge: 6
Wohnort: Bielefeld

BeitragVerfasst am: 10.01.2011, 00:27    Titel: Nochmals Danke ! Antworten mit Zitat

Alles bestens ... und nun ist Feierabend zwinkern

Gruß Horst
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 -> Allgemeine Fragen zu FreeBASIC. 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