巧用位运算实现大小写转换

来源:互联网 发布:潍坊全影网络是传销吗 编辑:程序博客网 时间:2024/04/30 22:32
今天看王爽老师的《汇编语言》时,很有收获,不论是技术还是思考方式。
任务是将字符串进行大小写转换,但是还暂时不会用分支判断语句(而且这样的效率也不是最高的,有点类似于高级语言了)。
“如果一个问题的解决方法,使我们陷入一种矛盾之中。那么,很可能是我们考虑问题的出发点有了问题,或是说,我们起初运用的规律并不适合。”(强行被王老师灌了一碗鸡汤,爽!)
扯点淡:这两天正好遇到一点事情,使我略微开始怀疑自己,(当然也没那么严重,卓教授可是非常厉害的,承载了太多期许的目光,岂能轻言放弃。不能把世界交给我看不起的人!),所以王老师的这句话使我,换一种思考方式,也许会柳暗花明。
初步想法是,判断字符的ASCII码,如果大于61H,则减20H。但是没有判断语句,所以这条道走不通。
我们应该重新观察,寻找新的规律。可以看出,就ASCII码的二进制形式来看,除第5位(位数从0开始计算)外,大写字母和小写字母的其他各位都一样。大写字母ASCII码的第5位为0,小写字母的第5位为1。这样,我们就有了新的方法,一个字母,不管他原来是大写还是小写,将他的第5位置0,他就必将变为大写字母;将他的第5位置1,他就必将变为小写字母。在这个方法中,我们不需要在处理前判断字母的大小写。
果然,奇技淫巧...
代码如下:
assume cs:code, ds:data

data segment
      db 'BaSiC'
      db 'iNfOrMaTiOn'
data ends

code segment
start:
      mov ax, data
      mov ds, ax  ;设置ds指向data段
      mov bx, 0   ;设置(bx)=0,ds:bx指向'BaSiC'的第一个字母
      mov cx, 5   ;设置循环次数

      s1:
      mov al, [bx]      ;将ASCII码从ds:bx所指向的单元中取出
      and al, 11011111B ;将al中的ASCII码的第5位置为0,变为大写字母
      mov [bx], al      ;将转变后的ASCII码写回原单元
      inc bx      ;(bx)加1,ds:bx指向下一个字母
      loop s1

      mov bx, 5   ;设置(bx)=5,ds:bx指向'iNfOrMaTiOn'的第一个字母
      mov cx, 11  ;设置循环次数,因为'iNfOrMaTiOn'有11个字母

      s2:
      mov al, [bx]
      or al, 00100000B  ;将al中的ASCII码的第5位置为1,变为小写字母
      mov [bx], al
      inc bx
      loop s2

      mov ax, 4c00h
      int 21h
code ends
end start
在以后的操作中,可以从更底层的角度看看能否通过位运算来实现,效率更高,结果更精准。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米5返回键失灵怎么办 小米手机返回键失灵怎么办 萍果6splus关机键失灵怎么办 苹果5s很快没电怎么办 天猫分期付款没有花呗怎么办 淘宝花呗分期额度不够怎么办 支付宝余额支付超限怎么办 想分期花呗不够怎么办 来分期提现不了怎么办 帮朋友分期手机他不还钱怎么办 手机分期套现被骗了怎么办 学生既有分期办手机被骗怎么办? 京东刚买完东西第二天降价了怎么办 微信上买东西不给退货怎么办 微信买东西转红包被骗怎么办 买手机分期被骗了怎么办 苹果手机摔弯了怎么办 6s主板摔弯了怎么办 京东显示器坏了怎么办 苹果6s手机弯了怎么办 苹果手机变弯了怎么办 苹果手机屏幕摔碎了怎么办 苹果6p后壳弯曲怎么办 苹果手机后壳有点弯曲怎么办 苹果手机x弯了怎么办 苹果8手机弯了怎么办 苹果8p手机弯了怎么办? 美版iphone弯了怎么办 oppor9手机听筒声音小怎么办 苹果7摔弯了屏幕怎么办 苹果手机压弯了怎么办 京东买的电脑坏了怎么办 拼多多低价乱价怎么办 厂家不通过经销商直接发货怎么办 媳妇吵架说我全家有病怎么办 全家都不尊重媳妇怎么办 招商闪电贷有额度不通过怎么办 闪电贷页面登录不进去怎么办 91借钱极速逾期怎么办 论文没过拿不到毕业证怎么办 大学论文不过拿不到毕业证怎么办