2016-05-15 213 views
1

我有了这个代码,应该改变大写字母为小写字母:x86汇编:更改一个大写字母为小写字母

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不起作用。我得到一个

访问冲突写入错误

我在做什么错?

P.S .:我不能使用其他数组或指针或类似的东西。我必须重写那个char。

+0

难道是你试图修改只读内存中的字符串,如文字字符串?像'tolower(“HELLO WORLD”);'?您不应该尝试修改文字字符串,只能复制。 –

回答

2

一种解决方案将被分别分离小写字符和清除或设置比特0x20AND(大写)或OR(小写),像这样在此描述的回答:"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:对不起。我更新了解决方案。现在它将所有大写字母转换为小写字母。 223是按位不是32. – zx485

+0

谢谢。我想出了如何做到这一点! 我做的第二个变化是:cmp [esi + ecx],65; ,cmp [esi + ecx],90; –

+0

@ValentinEmilCudelcu:我不得不做另一个关于Jcc跳转的问题。往上看。 – zx485

0

mov [esi + ecx], bl更改为add [esi + ecx], bl可更正错误。

但是你的程序仍然不健壮。 (例如,如果输入是什么数字符?)

+0

我的不好,我尝试添加[esi + ecx],bl到它并不工作。 假设这将只是从A到Z的字符。 –

+1

这很奇怪。代码在我的电脑上编译并正确运行。你测试它像'tolower(“ABCDEF”)'?不要这样做。相反,创建一个'char test [] =“ABCDEF”',然后执行'tolower(test)'。 – WhatsUp

+0

你的字符串零终止?也许函数会,你想要什么,但是可以停止字符串结束的地方,并且你超过了它? – Tommylee2k

相关问题