Eigenen Interrupt
-
Also hier mal der ganze Code :
[BITS 16]
group DGROUP _TEXT _DATA _BSS _STACKextern _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 unterschiedMFG
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 _commandlinemir 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....