Guarda ... il tuo codice è un caos ... non si capisce nulla di quello che fai né di quello che vorresti fare. Quindi non ti posso dire molto.
Quello che posso fare è dirti cosa si può scrivere "semplicemente" e da dove puoi partire.
Tieni presente che mi pare sia la solita questione di cui abbiamo tanto discusso tempo fa.
Se la memoria a cui punta il puntatore non è allocata al processo (ad esempio il puntatore punta a NULL) allora puoi intercettare l'eccezione (anche semplicemente da C++ senza ASM) e operare di conseguenza. Ma se il puntatore punta casualmente a memoria del processo (ad altra variabile ad esempio), questo codice (e nessun altro codice) non ti potrà aiutare.
Nell'esempio che segue l'errore custom 100 indica un problema di accesso alla memoria.
Questo per un codice C che testa più byte a partire da un puntatore
#include <iostream>
using namespace std;
extern "C" int __stdcall Verifica_Variabile(char *indirizzo);
int main()
{
int errore;
char *stringa = NULL;
for (int quantevolte = 0; quantevolte < 5; quantevolte++)
{
errore = 0;
cout << "Indirizzo " << (void *)(stringa + quantevolte) << " ";
errore = Verifica_Variabile(stringa+quantevolte);
cout << "errore " << errore << endl;
}
return 0;
}
con la funzione ASM
.486
.model flat, stdcall
option casemap:none
.data
errore db ?
.code
;;
MTry_Begin Macro handler
pushad
mov esi,offset handler
push esi
push Dword ptr fs:[0]
mov Dword ptr fs:[0],esp
EndM
MTry_Except Macro handler
jmp NoException
handler: mov esp,[esp + 8]
pop Dword ptr fs:[0]
add esp,4
popad
EndM
MTry_End Macro handler
jmp Exceptionhandled
NoException: pop Dword ptr fs:[0]
add esp,32 + 4
Exceptionhandled:
EndM
;;
Verifica_Variabile proc Arg1:DWord
Assume Fs:nothing
pusha
mov edi,Arg1
MTry_Begin SEHHDL
mov byte ptr [edi], 0
MTry_Except SEHHDL
mov errore,100
MTry_End SEHHDL
popa
xor eax,eax
mov al,errore
ret 4
Verifica_Variabile EndP
End