2016-05-15 18 views
1

ich diesen Code haben, die einen Großbuchstaben Kleinbuchstaben ändern sollte:x86 Assembly: Ändern Sie einen Großbuchstaben zu einem Kleinbuchstaben

void tolower(char *text) 
{ 
    _asm 
    { 
     mov esi, text; 
     mov ecx, 0; 
     mov bl, 32; 
     opakuj: 
     cmp [esi + ecx], 0; 
     je konec; 
     cmp [esi + ecx], 97; 
     jbe dolower; 
     add ecx, 1; 
     jmp opakuj; 

     dolower: 
     mov [esi + ecx], bl; 
     add ecx, 1; 
     jmp opakuj; 
     konec: 
    } 
} 

mov [esi + ecx], bl funktioniert nicht. Ich erhalte eine

Zugriffsverletzung Schreibfehler

Was mache ich falsch?

S.S .: Ich kann kein anderes Array oder Zeiger oder so etwas verwenden. Ich muss diesen Buchstaben neu schreiben.

+0

Könnte es sein, dass Sie versuchen, eine Zeichenfolge im schreibgeschützten Speicher zu ändern, z. B. eine Literalzeichenfolge? etwas wie "tolower (" HALLO WORLD ");'? Sie sollten nicht versuchen, Literalstrings zu modifizieren, nur Kopien. –

Antwort

2

Eine Lösung, die die Kleinbuchstaben Zeichen und Löschen oder Setzen des Bits 0x20 mit einem AND (Großbuchstaben) oder OR (Kleinbuchstaben) Isolieren würden jeweils wie so in diesem beschriebenen Antwort: "How to access a char array and change lower case letters to upper case, and vice versa".

void tolower(char *text) 
{ 
    _asm 
    { 
    mov esi, text; 
    mov ecx, -1; 
    opakuj: 
    inc ecx; 
    cmp [esi + ecx], 0;  // end of string 
    je konec; 
    cmp [esi + ecx], 65;  // lower bound for uppercase chars 
    jb opakuj; 
    cmp [esi + ecx], 90;  // upper bound for uppercase chars 
    ja opakuj; 
    ; and [esi + ecx], 223; // 11011111 binary - sets uppercase 
    or [esi + ecx], 32;  // 00100000 binary - sets lowercase 
    jmp opakuj 
    konec: 
    } 
} 
+0

@ValentinEmilCudelcu: Entschuldigung. Ich habe meine Lösung aktualisiert. Jetzt konvertiert es alle Großbuchstaben in Kleinbuchstaben. 223 ist das bitweise NICHT von 32. – zx485

+0

Danke. Ich habe herausgefunden, wie es geht! Zweite Änderung, die ich machte, war: cmp [esi + ecx], 65; , cmp [esi + ecx], 90; –

+0

@ValentinEmilCudelcu: Ich musste einen weiteren Fix bezüglich der 'Jcc' Sprünge machen. Siehe oben. – zx485

0

Die Änderung mov [esi + ecx], bl zu add [esi + ecx], bl behebt den Fehler.

Aber Ihr Programm ist immer noch nicht robust. (Eg, was, wenn die Eingabe eine Zahl Zeichen?)

+0

Mein Schlechter, ich habe versucht, [esi + ecx], bl zu versuchen und es funktioniert nicht. Lassen Sie uns annehmen, dass nur Zeichen von A bis Z sein werden. –

+1

Das ist seltsam. Der Code wird kompiliert und läuft auf meinem Computer korrekt. Testen Sie es wie "tolower (" ABCDEF ")? Tu das nicht. Erstellen Sie stattdessen einen 'char test [] =" ABCDEF "' und führen Sie dann "tolower (test)" aus. – WhatsUp

+0

IST Ihre Zeichenkette Null abgeschlossen? vielleicht macht die Funktion das, was Sie wollen, aber hören Sie nicht auf, wo die Zeichenkette endet, und Sie überschreiten es? – Tommylee2k