# Assembler - Timer für Betriebssystem in NASM



## Jellysheep (6. März 2010)

Hi, 
ich schreibe grade an einem kleinen BS in Assembler (mit NASM-Code) und möchte dafür einen Timer verwenden. 
Bei meinen bisherigen Suchen kam heraus, dass ich mit *org 0Bh* einen Interrupt festlegen kann, welcher den Timer verwaltet. (Stimmt das?)
Dazu habe ich folgendes programmiert:

```
org 0Bh
jmp timerint
timerint:
;...Code...
```
Aber der Code wird nicht ausgeführt. Woran liegt das?


----------



## Jellysheep (6. März 2010)

Für den Timer muss man doch einen Interrupt-Behandler einrichten. 
Wie funktioniert das?


----------



## Jellysheep (9. März 2010)

Ich stell hier nochmal die Frage, wie man auf einen Interrupt reagieren kann. 
Wie kann man dafür eine eigene Funktion einbauen?


----------



## Jellysheep (11. März 2010)

Ich habe es jetzt dank der Hilfe von SGC-Fireball geschafft! 

Jetzt habe ich aber leider ein weiteres Problem. Ich möchte mit dem INT 1Ah und AH = 0h die Uhrzeit auslesen, jedoch wenn ich mit Bochs das OS starte, ohne dass die Funktion überhaupt ausgeführt wird, kommt diese Fehlermeldung:


> 00014376399e[CPU0 ] prefetch: EIP [00010000] > CS.limit [0000ffff]
> 00014376401e[CPU0 ] prefetch: EIP [00010000] > CS.limit [0000ffff]
> 00014376403e[CPU0 ] prefetch: EIP [00010000] > CS.limit [0000ffff]
> 00014376405e[CPU0 ] prefetch: EIP [00010000] > CS.limit [0000ffff]
> ...


Wie kann ich das verhindern?


----------



## Jellysheep (11. März 2010)

Für alle, die der Code interessiert, poste ich ihn hier mal:

```
register_interrupt:
    push dx
    push es
    xor ax, ax
    mov es, ax
    cli
    mov word [es:1ch*4], _int0x1c  ; Pointer auf den Handler
    mov [es:1ch*4+2], cs           ; Pointer auf CS
    sti
    pop es
    pop dx
    ret

_int0x1c:
    _int0x1c_ser0x01:       ; funktion 0x01
        cli                           ;Interrupts ausschalten
        mov si, Meldung

    _int0x1c_ser0x01_start:
         lodsb                   ; nächstes Byte laden
         or  al, al              ; 0-Byte?
         mov ah, 0x0E            ; BIOS Teletype
         mov bh, 0x00            ; Page 0
         mov bl, 0x07            ; Text-Attribute
         int 0x10                ; BIOS-Call
         jmp _int0x1c_ser0x01_start
    _int0x1c_ser0x01_end:
        sti
        jmp _int0x1c_end

    _int0x1c_end:
        iret

;Zur Registrierung der Interrupt-Routine: 
call register_interrupt
```



Die Ausgabe ist zwar unsinnig (erst der Text, dann nur noch "S ", beim Kopieren aus Bochs dann plötzlich "Sÿ"), aber wichtig ist ja, dass das unabhängig vom eigentlichen Code läuft. Der Inhalt des Interrupt Handlers ist ja dann beliebig veränderbar. 


> Druecken Sie eine Taste, um das OS zu starten.
> SÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿ
> SÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿ
> SÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿSÿ
> ...




An dieser Stelle nochmal die Frage, warum beim Auslösen des Interrupts 1A in Bochs diese seltsame Fehlermeldung kommt.

PS: Echt klasse, dass es hier sogar ASM-Syntax Highlighting gibt. 
Ein Assembler-Unterforum wäre auch klasse!


----------

