不用条件判断指令实现字符串大小写的转化
今天在写汇编的时候遇到一个问题,如何不使用任何条件指令完成字符串字母大小写的转化,略思之后感觉挺有意义,记之。比如如下一个字符串:
“RooEYeBlOG”
要把其全部转化为小写,我们知道对于字符,机器都是将其转化为ascii码进行处理的,并且一个字符大写字母的ascii和其小写字符的ascii码总是相差20H,小写字符ascii码值
= 20H + 对应大写字符ascii码值。
但是问题来了,这里只能对小写字符减去20H转化为大写字符,而对于大写字符则不能变,那么如何判断一个字符是大写字符还是小写字符呢?而且不能使用任何的条件判断指令。可以通过判断其二进制表示的第5位(从第0位开始)来判断是大写还是小写
.
对于A/a:
对于D/d :
观察之后发现大写字符的二进制表示的第5位总是0,而小写字符的二进制表示的第5位总是1,其余位二者是一样的。假如寄存器al中存储字符,不论其为大写或小写,通过and指令总是将其转化为大写:
and al, 0dfh
通过or指令总能将其转化为小写:
or al, 20h
下面是一个不使用条件判断将小写字符全部转化为大写字符的汇编代码,大写转化为小写同理亦然。
assume cs:codesg,ds:datasg datasg segment db 'RooEYeBlOG' datasg ends codesg segment start: mov ax,datasg mov ds,ax mov bx,0 mov cx,10 cc: mov al,[bx] and al,0dfh mov [bx],al inc bx loop cc codesg ends end start
使用debug跟踪分析,
执行指令之前:
执行指令之后:
博客原载于俺的博客寻梦人博客,欢迎大家踩点...