internal unsafe static void CallHandler(InternalSystem.Exception exception, SharpOS.Korlib.Runtime.ExceptionHandlingClause handler, void *callerBP)
        {
            uint _callerBP        = (uint)callerBP;
            uint targetIP         = (uint)handler.HandlerBegin;
            uint exceptionAddress = (uint)Runtime.GetPointerFromObject(exception);

            // The address (EDX) will be then used in the handler
            Asm.MOV(R32.EDX, &exceptionAddress);

            // Set the address where it will jump to handle the exception
            Asm.MOV(R32.ECX, &targetIP);

            // This is very dependent of the way the AOT generates the prolog of the method
            Asm.MOV(R32.EAX, &_callerBP);
            Asm.SUB(R32.EAX, 12);
            Asm.MOV(R32.ESP, R32.EAX);
            Asm.POP(R32.EDI);
            Asm.POP(R32.ESI);
            Asm.POP(R32.EBX);
            Asm.POP(R32.EBP);

            // Just dump the address of the caller
            Asm.POP(R32.EAX);

            // Assign EAX the address of the exception object
            Asm.MOV(R32.EAX, R32.EDX);

            // Push target address of the handler
            Asm.PUSH(R32.ECX);
            Asm.RET();
        }
        internal unsafe static uint CallFilter(InternalSystem.Exception exception, SharpOS.Korlib.Runtime.ExceptionHandlingClause handler, void *callerBP)
        {
            uint _callerBP        = (uint)callerBP;
            uint targetIP         = (uint)handler.FilterBegin;
            uint exceptionAddress = (uint)Runtime.GetPointerFromObject(exception);
            uint result           = 0;

            // The address (EDX) will be then used in the handler
            Asm.MOV(R32.EDX, &exceptionAddress);

            // Set the address where it will jump to handle the exception
            Asm.MOV(R32.ECX, &targetIP);

            // This is very dependent of the way the AOT generates the prolog of the method
            Asm.MOV(R32.EAX, &_callerBP);

            Asm.PUSH(R32.EBP);
            Asm.PUSH(R32.EBX);
            Asm.PUSH(R32.ESI);
            Asm.PUSH(R32.EDI);

            Asm.MOV(R32.EBP, new DWordMemory(null, R32.EAX, null, 0, 0));
            Asm.MOV(R32.EBX, new DWordMemory(null, R32.EAX, null, 0, -4));
            Asm.MOV(R32.ESI, new DWordMemory(null, R32.EAX, null, 0, -8));
            Asm.MOV(R32.EDI, new DWordMemory(null, R32.EAX, null, 0, -12));

            // Assign EAX the address of the exception object
            Asm.MOV(R32.EAX, R32.EDX);

            // Push target address of the handler
            Asm.CALL(R32.ECX);

            Asm.POP(R32.EDI);
            Asm.POP(R32.ESI);
            Asm.POP(R32.EBX);
            Asm.POP(R32.EBP);

            // Get the result of the filter
            Asm.MOV(&result, R32.EAX);

            return(result);
        }
        internal unsafe static void CallFinallyFault(InternalSystem.Exception exception, SharpOS.Korlib.Runtime.ExceptionHandlingClause handler, void *callerBP)
        {
            uint _callerBP = (uint)callerBP;
            uint targetIP  = (uint)handler.HandlerBegin;

            // Set the address where it will jump to handle the exception
            Asm.MOV(R32.ECX, &targetIP);

            // This is very dependent of the way the AOT generates the prolog of the method
            Asm.MOV(R32.EAX, &_callerBP);

            Asm.PUSH(R32.EBP);
            Asm.PUSH(R32.EBX);
            Asm.PUSH(R32.ESI);
            Asm.PUSH(R32.EDI);

            Asm.MOV(R32.EBP, new DWordMemory(null, R32.EAX, null, 0, 0));
            Asm.MOV(R32.EBX, new DWordMemory(null, R32.EAX, null, 0, -4));
            Asm.MOV(R32.ESI, new DWordMemory(null, R32.EAX, null, 0, -8));
            Asm.MOV(R32.EDI, new DWordMemory(null, R32.EAX, null, 0, -12));

            // Push target address of the handler
            Asm.CALL(R32.ECX);

            Asm.POP(R32.EDI);
            Asm.POP(R32.ESI);
            Asm.POP(R32.EBX);
            Asm.POP(R32.EBP);
        }