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:
}
}
我有这段代码可以将大写字母更改为小写字母:
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:
}
}