x86汇编:将UpperCase字母更改为LowerCase字母

时间:2016-05-15 12:25:07

标签: assembly x86 inline-assembly lowercase

我有这个代码,应该将大写字母更改为小写字母:

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。:我不能使用另一个数组或指针或类似的东西。我必须重写那个字符。

2 个答案:

答案 0 :(得分:2)

一种解决方案是分别使用0x20(大写)或AND(小写)来隔离小写字符和清除或设置位OR,如本SO答案中所述:"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:
  }
}

答案 1 :(得分:0)

var response = vc.Request("/me/videos", "POST", false, "type=pull&link=http://someserver.com/156755.mp4"); 更改为mov [esi + ecx], bl会更正错误。

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