小写字母的ASCII码值在0x61~0x7A之间,
大写字母的ASCII码值在0x41~0x5A之间
小写字母的ASCII值减去0x20就是大写字母的值
汇编源码如下
====toupper.asm====
segment .text
global ToUpper
ToUpper:
push ebp
mov ebp,esp
mov eax,[ebp+8]
mov ecx,[ebp+12]
mov esi,eax
mov edi,eax
xor eax,eax
cld
loopme:
lodsb
cmp al,60h
jng isupper
sub al,20h
isupper:
stosb
loop loopme
pop ebp
ret
========main.c======
#include<stdio.h>
void ToUpper(char *buf,int len);
int main()
{
char buf[]="This is a demo.";
printf("%s/n",buf);
ToUpper(buf,strlen(buf));
printf("%s/n",buf);
return 0;
}
=====build.bat=======
nasm -f coff toupper.asm --prefix _
gcc main.c toupper.o -o main.exe
if exist toupper.o del toupper.o
if exist main.o del main.o
====================
运行结果如下
This is a demo.
THIS IS A DEMO.
====================
在toupper.asm中用到了lodsb和stosb
lodab等价于mov al,[esi]
add/sub esi,1
stosb等价于mov [edi],al
add/sub edi,1
注:在使用他们时不要忘了执行CLD,清除DF标志位
==========================
类似lodsb的还有lodsw,lodsd
类似stosb的还有stosw,stosd