x86 程序集:将大写字母更改为小写字母

x86 Assembly: Change an UpperCase letter to a LowerCase letter

我有这段代码可以将大写字母更改为小写字母:

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

access violation writing error

我做错了什么?

P.S.: 我不能使用另一个数组或指针或类似的东西。我必须重写那个字符。

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

但是你的程序还是不够健壮。 (例如,如果输入的是数字字符怎么办?)

一个解决方案是隔离小写字符,并分别用 AND(大写)或 OR(小写)清除或设置位 0x20,如本文所述所以答案:.

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:
  }
}