Eigenen Interrupt



  • um jetzt ehrlich zu sein nein...

    MFG

    LordHoto



  • es funzt jetzt zwar etwas aber auch nich ganz...
    ich ruf den int auf und danach jump ich wohin aber er jumpt erst und dann zeigt er das an und der letzte jump funzt auch net 😞

    MFG

    LordHoto



  • Original erstellt von <LordHoto>:
    es funzt jetzt zwar etwas aber auch nich ganz...
    ich ruf den int auf und danach jump ich wohin

    Bis hierhin noch verstaendlich... aber dann peil ichs leider nicht mehr so richtig:

    aber er jumpt erst und dann zeigt er das an

    Wie kannst du feststellen, dass zuerst der Jump ausgefuehrt und anschliessend der Text auf dem Bildschirm ausgegeben wurde?

    und der letzte jump funzt auch net 😞

    Seh ich nicht, kann ich also auch nichts zu sagen.
    Dieses Codeschnipsel, dass du gepostet hast sollte jetzt jedenfalls Fehlerfrei sein.

    [ Dieser Beitrag wurde am 27.05.2003 um 20:37 Uhr von Nobuo T editiert. ]



  • Also hier mal der ganze Code :
    [BITS 16]
    group DGROUP _TEXT _DATA _BSS _STACK

    extern _main
    ; ****************************CODE-Segment*********************************
    segment _TEXT class=CODE
    ..start:
    main: mov ax, cs
    mov ds, ax
    mov es, ax
    cli
    mov ss, ax
    mov sp, StackEnd
    sti
    mov word [0084h],inter
    mov [0086h],cs
    call _main

    .hang: jmp .hang

    ;------------------------------= Int 21h =----------------------------------------------
    inter:
    cmp ah, 00h
    je printv
    cmp ah, 01h
    je printf
    IRET
    printv:
    mov si, OpenOsVersion
    call message
    IRET
    printf:
    call message
    IRET
    ;------------------------------= Int 21h =----------------------------------------------

    message:
    lodsb
    cmp al, 00h
    jz putstrd
    mov ah,0Eh
    int 10h
    jmp message
    putstrd: ret

    ; ****************************DATA-Segment*********************************
    segment _DATA class=DATA
    ;------------------------------= Int 21h =----------------------------------------------
    OpenOsVersion db "OpenOs Build 00.00.01",13,10,0
    ;----------------------------------------------------------------------------------------

    ; ****************************BSS-Segment**********************************
    segment _BSS class=BSS

    ; ****************************STACK-Segment********************************
    segment _STACK class=STACK
    resw 512
    StackEnd:

    so aber er jumpt jetzt ein paar mal zu der funktion main nur er führt sie nie vollständig aus... woran kann das liegen? (main ist in C geschrieben hat aber vor dem int zeug funktioniert, da es den int 21 (ich hoffe den hab ich erstellt *G*) nicht benutzt...)

    MFG

    LordHoto



  • Ist das da jetzt direkt der Code aus dem Bootstrap? Wenn nicht: wie ist cs beim Aufruf dieses Codes gesetzt?
    Worauf ich hinaus will: ds muss in deinem Code bei der Manipulation der Int-Vectoren null sein.
    Was du da beschreibst klingt aber ganz so, als waere das irgendwie nicht der Fall. 🙄



  • nö ist es auch net...
    das kommt direct NACH dem bootloader...

    MFG

    LordHoto



  • Wie dem auch sei, ich hoffe du hast die Kernaussage meines letzten Posts verstanden und konntest deinen Code dementsprechend aendern.
    Funktioniert es denn jetzt?



  • bin grad auf ner Lan und hab kein Bochs drauf...

    MFG

    LordHoto



  • also cs ist immernoch wie im bootsector 🙂
    und wenn ds null ist gibts auch keinen unterschied 😞

    MFG

    LordHoto



  • so das hier ist der richtige code!

    [BITS 16]
    group DGROUP _TEXT _DATA _BSS _STACK
    extern _main
    ; ****************************CODE-Segment*********************************
    segment _TEXT class=CODE
    ..start:
    main:
    mov ax, cs
    mov ds, ax
    mov es, ax
    cli
    mov ss, ax
    mov sp, StackEnd
    mov bx, 00h
    mov es, bx
    mov word [es:84h], INT21h
    mov [es:86h], cs
    sti
    call _main

    .hang: jmp .hang

    ;------------------------------= Int 21h =----------------------------------------------
    inter:
    cmp ah, 00h
    je printv
    cmp ah, 01h
    je printf
    IRET
    printv:
    mov si, OpenOsVersion
    call message
    IRET
    printf:
    call message
    IRET
    ;------------------------------= Int 21h =----------------------------------------------

    message:
    lodsb
    cmp al, 00h
    jz putstrd
    mov ah,0Eh
    int 10h
    jmp message
    putstrd: ret

    ; ****************************DATA-Segment*********************************
    segment _DATA class=DATA
    ;------------------------------= Int 21h =----------------------------------------------
    OpenOsVersion db "OpenOs Build 00.00.01",13,10,0
    ;----------------------------------------------------------------------------------------

    ; ****************************BSS-Segment**********************************
    segment _BSS class=BSS

    ; ****************************STACK-Segment********************************
    segment _STACK class=STACK
    resw 512
    StackEnd:



  • so jetzt funzt alles nun will ich eine Funktion einbauen mit der ich von einem ausgeführten Programm wieder in meine Commandline zurück springe ich hab das jetzt so gemacht :
    _return_:
    mov si, toos
    call message
    pop ax
    pop ax
    jmp _commandline

    mir hat man gesagt um den rücksprungspunkt zu löschen soll ich 2 mal 'poppen'
    aber dabei hängt er sich immer auf. Weiß einer wo der Fehler ist?

    MFG

    LordHoto



  • Keiner eine ahnung?

    MFG

    LordHoto



  • Das wichtigste fehlt IMHO, naemlich wie dieses Stueck code da aufgerufen wird.

    Ansonsten kann ich mir nur denken, dass ein FAR-Call zu diesem code ausgefuehrt wird und der Ruecksprung im falschen Segment landet.



  • wie meinst du das?
    Ich will das von einem Belibigen Punkt im Speicher aufrufen...
    ach und das da und dahin wo er springt ist im gleichen Segment...

    MFG

    LordHoto



  • im gleichen segment in dem der Int initialisiert wird....


Anmelden zum Antworten