Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
darkinsanity aka sts

Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 25.05.2009, 21:57 Titel: Pointer erniedrigen |
|
|
Hi,
hört sich gemein an, ist aber harmlos
Mein Problem ist folgendes:
Ich schreibe einen Kernel in FreeBASIC, und da muss ich Register auf den Stack legen (für Multitasking).
In dem Tutorial auf http://code.google.com/p/onyxkernel/wiki/SoftwareMultitasking wird das vermindern des Pointers auf den Stack so gemacht:
Schön und gut, aber geht so was auch in FreeBASIC?
Bisher mache ich das mit Stackwechsel, "push" und dem Inline-Assembler. Nicht gerade schön, und auch fehleranfällig.
Ich hoffe mal ihr wisst da was  _________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 25.05.2009, 22:37 Titel: |
|
|
stack = stack - 1
*stack=0 _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 26.05.2009, 21:29 Titel: |
|
|
oder: Code: | Dim As UInteger Ptr stack
...
...
'stack steht hier auf der letzen Adresse des Stackbereichs
stack = stack - 15 'stack um 60 Byte zurück
' Expand down stack
' processor data
stack[14] = &h202 ' EFLAGS
stack[13] = &h08 ' CS
stack[12] = thread ' EIP
' pusha
stack[11] = 0 ' EDI
stack[10] = 0 ' ESI
stack[9] = 0 ' EBP
stack[8] = 0 ' NULL
stack[7] = 0 ' EBX
stack[6] = 0 ' EDX
stack[5] = 0 ' ECX
stack[4] = 0 ' EAX
' data segments
stack[3] = &h10 ' DS
stack[2] = &h10 ' ES
stack[1] = &h10 ' FS
stack[0] = &h10 ' GS
... |
EDIT\ Code berichtigt
stack[14] - stack[0] _________________ 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 28.05.2009, 16:15, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
darkinsanity aka sts

Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 27.05.2009, 12:15 Titel: |
|
|
mit "asm cli" ?
Kannst dir meinen Kernel auch mal ansehen: http://sourceforge.net/projects/frostkernel _________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 28.05.2009, 22:29 Titel: |
|
|
Mit welcher Intention bist du denn diesen Kernel angegangen?
Möglichst alles in Basic-Syntax schreiben?
oder "egal der fbc muss es kompilieren können"?
Viele der Subs könnte man durch Makros ersetzen, die Sprünge vermeiden würden, oder auch einige Basic-Zeilen durch Asm wesentlich kürzen.
Z.B.
Code: | sub Paging_activate
'// we activate paging by enabling the last bit of cr0.
dim cr0reg as UINTEGER '// variable needed to modify the value of cr0
ASM
mov eax, cr0 '// get the value of cr0 into eax
mov [cr0reg], eax '// get the value of eax into the variable
END ASM
cr0reg = BITSET(cr0reg, 31) '// set the last bit of the variable
ASM
mov eax, [cr0reg] '// get the new value of the variable into eax
mov cr0, eax '// get the new value of eax into cr0
END ASM
end sub | durch
Code: | sub Paging_activate
' we activate paging by enabling the last bit of cr0.
ASM
mov eax, cr0 ' get the value of cr0 into eax
bts eax, 31 ' set bit 31
'or eax, &H80000000
mov cr0, eax ' get the new value of eax into cr0
END ASM
end sub |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
darkinsanity aka sts

Anmeldungsdatum: 01.11.2006 Beiträge: 456
|
Verfasst am: 29.05.2009, 20:34 Titel: |
|
|
In der neuesten Version hab ich das auch anders gelöst, die Version auf sourceforge konnte ich noch nicht updaten. Aber die aktuelle Version liegt hier: http://darkinsanity.netne.net/nerdpole/FROST_V0.3.1a.zip
Ziel meines Kernels ist, möglichst alles in FreeBASIC zu schreiben, allerdings benutze ich für manche Sachen (besonders wenn es zeitkritisch ist) Assembler.
Mein erster Kernel war komplett in Assembler geschrieben, aber das wurde mir zu kompliziert und unübersichtlich. C mag ich nicht, also hab ich mich entschlossen meinen Kernel in FreeBASIC zu schreiben.
Spätere Treiber (floppy ist in Arbeit) werde ich auch in FreeBASIC schreiben, als Dateiformat nutze ich ELF. _________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak |
|
Nach oben |
|
 |
|