117 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
;NXOS
 | 
						||
;--------
 | 
						||
;Written by: Alberto Venturini (Alb‚) - 2001
 | 
						||
;Email address: -albe-@libero.it
 | 
						||
;
 | 
						||
;NXOS exception handlers
 | 
						||
 | 
						||
 | 
						||
;------------------------------------------------------------------------------
 | 
						||
 | 
						||
InstallExceptionHandlers:
 | 
						||
	push ax
 | 
						||
	push es
 | 
						||
 | 
						||
	xor ax,ax
 | 
						||
	mov es,ax
 | 
						||
	mov ax,offset Int00h
 | 
						||
	mov word ptr es:[0000h],ax
 | 
						||
	mov ax,cs
 | 
						||
	mov word ptr es:[0000h+2],ax
 | 
						||
 | 
						||
	mov ax,offset Int06h
 | 
						||
	mov word ptr es:[0006h*4],ax
 | 
						||
	mov ax,cs
 | 
						||
	mov word ptr es:[0006h*4+2],ax
 | 
						||
 | 
						||
	mov ax,offset Int07h
 | 
						||
	mov word ptr es:[0007h*4],ax
 | 
						||
	mov ax,cs
 | 
						||
	mov word ptr es:[0007h*4+2],ax
 | 
						||
 | 
						||
	pop es
 | 
						||
	pop ax
 | 
						||
 | 
						||
	ret
 | 
						||
 | 
						||
;-----------------------------------------------------------------------------
 | 
						||
 | 
						||
Int00h:
 | 
						||
;L'interrupt 00h Š invocato quando si verifica una divisione per 0
 | 
						||
;(quando il divisore di DIV o IDIV Š 0)
 | 
						||
;Questa routine termina il processo che ha provocato l'errore.
 | 
						||
 | 
						||
	cli
 | 
						||
 | 
						||
	push cs
 | 
						||
	pop ds
 | 
						||
 | 
						||
	mov si,offset Int00hMsg
 | 
						||
	jmp TerminateProcess
 | 
						||
 | 
						||
;-----------------------------------------------------------------------------
 | 
						||
 | 
						||
Int06h:
 | 
						||
;L'int 06h si verifica quando c'Š un'istruzione non valida.
 | 
						||
;Termina il processo che ha provocato l'errore
 | 
						||
 | 
						||
	cli
 | 
						||
 | 
						||
	push cs
 | 
						||
	pop ds
 | 
						||
 | 
						||
	mov si,offset Int06hMsg
 | 
						||
	jmp TerminateProcess
 | 
						||
 | 
						||
;-----------------------------------------------------------------------------
 | 
						||
 | 
						||
Int07h:
 | 
						||
;L'int 07h viene generato quando c'Š un'istruzione di un coprocessore
 | 
						||
;che per• non Š presente.
 | 
						||
;Termina il processo che ha provocato l'errore.
 | 
						||
 | 
						||
	cli
 | 
						||
 | 
						||
	push cs
 | 
						||
	pop ds
 | 
						||
 | 
						||
	mov si,offset Int07hMsg
 | 
						||
	jmp TerminateProcess
 | 
						||
 | 
						||
;-----------------------------------------------------------------------------
 | 
						||
 | 
						||
TerminateProcess:
 | 
						||
;input SI --> offset del messaggio di errore da visualizzare
 | 
						||
 | 
						||
	push si
 | 
						||
 | 
						||
	mov ah,03h
 | 
						||
	int 20h
 | 
						||
	mov ah,04h
 | 
						||
	int 24h
 | 
						||
 | 
						||
	mov si,offset GeneralErrorMsg
 | 
						||
	mov ah,01h
 | 
						||
	mov bl,7
 | 
						||
	int 24h
 | 
						||
 | 
						||
	pop si
 | 
						||
	int 24h
 | 
						||
 | 
						||
	mov si,offset TerminateProcessMsg
 | 
						||
	int 24h
 | 
						||
 | 
						||
	mov ah,00h
 | 
						||
	int 25h
 | 
						||
 | 
						||
	mov ah,02h
 | 
						||
	mov bl,0
 | 
						||
	int 20h
 | 
						||
 | 
						||
;-----------------------------------------------------------------------------
 | 
						||
 | 
						||
GeneralErrorMsg db 13,10,'Fatal error:',0
 | 
						||
Int00hMsg	db ' division by zero (int 00h).',13,10,0
 | 
						||
Int06hMsg	db ' invalid opcode (int 06h).',13,10,0
 | 
						||
Int07hMsg	db ' processor extension not avaliable (int 07h).',13,10,0
 | 
						||
TerminateProcessMsg db 'The process will be terminated.',13,10,0
 |