2016-11-20 1 views
0

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] 
+0

Wie heißt 'transform'? Ich stelle die Legitimität der Dereferenzierung von 'p' nach' p ++ 'in Frage. – Bathsheba

+0

@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

+1

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

Antwort

1

Wie der Debugger zeigt, ist das Problem in dieser Anweisung ist:

mov bl, [4*eax] 

am C-Code sucht, seine Absicht ist es, das zweite Byte der Zeichenkette in bl zu laden. Der Zeiger auf das erste Byte ist eax, daher ist der Zeiger auf das zweite Byte eax+1. Das heißt, der richtige Befehl

mov bl, [eax+1] 

ist Alternativ könnten Sie das tun, mit zwei Anweisungen:

inc eax 
mov bl, [eax] 

Diese mehr im Einklang mit C-Code:

p++; 
if (*p == ...) 

aber tut die gleich.

3
mov bl, [4*eax] 
cmp bl, 'a' 

Die Idee ist, den Zeiger in EAX vorzurücken. Keine Notwendigkeit, es zu multiplizieren!

inc eax    ;ptr++ 
mov bl, [eax] 
cmp bl, 'a' 
1

Sie möchten das Byte nach dem '-' lesen, das ist eax+1, nicht 4*eax.

Verwandte Themen