So habe ich diese Funktion in C geschriebenC Inline-Assembly Erzeugung nicht behandelte Ausnahme
int transform (char * p)
{
if(*p!='-'){
return 0;
}
p++;
if(*p == 'a')
{
return 1;
}
else if(*p == 'b')
{
return 2;
}
else
{
return 0;
}
}
Und ich versuchte, es zu übersetzen Montage ia32 wie diese
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;
}
Inline Wenn ich die Funktion geschrieben haben in C es funktioniert perfekt in Visual Studio, aber wenn ich es in Inline-Assembly ändern und den Code ausführen, erhalte ich eine Fehlermeldung
Nicht behandelte Ausnahme bei 0x774e15ee in proyect.exe: 0xC0000005: Zugriff auf Leseort 0x01745388 der Verletzung.
Muss dieses Problem mit dem Code oder ist es ein Problem von Visual Studio?
gedebuggt ich meinen Code und festgestellt, dass Fehler in dieser Zeile ist
mov bl, [4*eax]
Wie heißt 'transform'? Ich stelle die Legitimität der Dereferenzierung von 'p' nach' p ++ 'in Frage. – Bathsheba
@Bathsheba In der Hauptfunktion erhalte ich als Befehlsargument -b oder -a, also rufe ich die Transformationsfunktion auf, um zu sehen, ob das Argument, das ich erhalten habe, gültig ist. arg = argv [3]; und dann int op = transformieren (arg); – ravelinx
In Visual Studio können Sie Ihren Code debuggen, indem Sie jeweils eine Anweisung ausführen (drücken Sie F11, wenn ich mich richtig erinnere). Dies zeigt auf eine bestimmte Anweisung, die die Ausnahme generiert hat. Bitte [bearbeiten] Sie Ihren Beitrag und schreiben Sie, was diese Anweisung ist - das ist eine sehr wichtige Information zur Lösung Ihres Problems! – anatolyg