J'ai donc cette fonction écrite en CC Assemblée inline génération exception non gérée
int transform (char * p)
{
if(*p!='-'){
return 0;
}
p++;
if(*p == 'a')
{
return 1;
}
else if(*p == 'b')
{
return 2;
}
else
{
return 0;
}
}
et moi avons essayé de le traduire en assembleur en ligne ia32 comme celui-ci
int trasform (char * p)
{
int result;
_asm
{
mov eax, p
mov ebx, 0
mov bl, [eax]
cmp bl, '-' ;
jne invalid
mov bl, [4*eax]
cmp bl, 'a'
jne isB
mov result, 1
mov eax, result
jmp out
isB:
cmp bl, 'b'
jne invalid
mov result, 2
mov eax, result
jmp out
invalid:
mov result, 0
mov eax, result
out: ; end
}
return result;
}
Quand j'ai la fonction écrite en C cela fonctionne parfaitement dans Visual Studio, mais quand je le change en assembly en ligne et exécute le code, j'obtiens une erreur en disant
Exception non gérée à 0x774e15ee dans proyect.exe: 0xC0000005: violation d'accès l'emplacement de lecture 0x01745388.
Est-ce que ce problème doit être avec le code ou est-ce un problème de studio visuel?
Je débogué mon code et a constaté que l'erreur est dans cette ligne
mov bl, [4*eax]
Comment 'transform' est-il appelé? Je remets en question la légitimité de déréférencer 'p' après' p ++'. – Bathsheba
@Bathsheba Dans la fonction principale, je reçois comme argument de commande -b ou -a donc j'appelle la fonction de transformation pour voir si l'argument que j'ai reçu est valide. arg = argv [3]; puis int op = transformer (arg); – ravelinx
Visual Studio vous permet de déboguer votre code en exécutant une instruction à la fois (appuyez sur F11 si je me souviens bien). Cela pointera sur une instruction particulière qui a généré l'exception. S'il vous plaît [modifier] votre message et écrire ce que cette instruction est - c'est une information très importante pour résoudre votre problème! – anatolyg