Eigenen Interrupt
-
Hast du eigentlich schonmal die Doku zum NASM gelesen?
So sollte es gehen:mov word [0084h],inter
-
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 netMFG
LordHoto
-
Original erstellt von <LordHoto>:
es funzt jetzt zwar etwas aber auch nich ganz...
ich ruf den int auf und danach jump ich wohinBis 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 _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....