@smalldragon, l'implementazione della gestione delle eccezioni fornita dal codice assembler e' la BANALISSIMA implementazione mediante setjmp/longjmp, che puoi implementare anche in C, SENZA scomodare il lnguaggio macchina.
La struttura dati gestita e' un banale stack di indirizzi che rappresentan i vari "try/catch" nidificati, in cui il TOP dello stack, che DEVE ESSERE GLOBALE, e' memorizzato in "fs:[0]".
Quando il SISTEMA OPERATIVO genera un'eccezione (generata da codice DI SO o per eccezioni hardware), il controllo viene passato alla routine DEL PROCESSO, il cui indirizzo e' memorizzato in "fs:[0]". Da li, parte la gestione UTENTE dell'eccezione.
https://docs.microsoft.com/en-us/windows/win32/debug/structured-exception-handling.
La gestione della memoria di un processo, e la validazione degli indirizzi, in C/C++, E' TUTTA UN"ALTRA QUESTIONE.
La CPU controlla SOLO se l'indirizzo e' VALIDO per il processo corrente e se ci sono i diritti di lettura/scrittura in base all'operazione che si sta' eseguendo.
MA NON HA NESSUNA INFORMAZIONE su che cosa voglia dire quell'indirizzo! Perche' il SIGNIFICATO dell'indirizzo (se e' una variabile, un vettore, ..) E' RESPONSABILITA" dell'appricazione contenuta nel processo!
Chissa' se cosi ti si illumina la lampadina della comprensione