| Zeile 189: | Zeile 189: | ||
==== Codebeispiel: ==== | ==== Codebeispiel: ==== | ||
Dieser Code gehört in den anderen Init-Code für den APIC / Symmetric Mode. Er stellt den PIT auf den gewünschten Wert für den APIC Timer ein (hier 10ms), lässt die ISR des PITs den nötigen Wert für den Initial Count Value des APIC Timers berechnen und stellt diesen dann zugleich ein. Er setzt voraus, dass in der Variable [apicregs] die Adresse der APIC Register gespeichert ist. | Dieser Code gehört in den anderen Init-Code für den APIC / Symmetric Mode. Er stellt den PIT auf den gewünschten Wert für den APIC Timer ein (hier 10ms), lässt die ISR des PITs den nötigen Wert für den Initial Count Value des APIC Timers berechnen und stellt diesen dann zugleich ein. Er setzt voraus, dass in der Variable [apicregs] die Adresse der APIC Register gespeichert ist. | ||
| − | <asm> mov al,00110110b ;den PIT auf den gewünschten Wert (hier 10ms) einstellen | + | <asm> xor ebp,ebp ;EBP nullen, damit nachher in PIT-ISR erkenbar, wie oft der Timer-Interrupt aufgerufen wurde |
| + | |||
| + | mov al,00110110b ;den PIT auf den gewünschten Wert (hier 10ms) einstellen | ||
out 43h,al | out 43h,al | ||
| Zeile 209: | Zeile 211: | ||
mov DWORD[eax+0x3e0],0xb | mov DWORD[eax+0x3e0],0xb | ||
| − | mov ebp,[eax+ | + | mov ebp,[eax+0x320] ;Zuerst irgendein Register lesen, wegen Bug in manchem APICS |
mov DWORD[eax+0x320],0x20031 | mov DWORD[eax+0x320],0x20031 | ||