|
发表于 2012-2-22 23:00:42
|
显示全部楼层
本帖最后由 莫名其妙 于 2012-2-24 13:54 编辑
你的思路有问题 对于遇到0结束这一类的问题应该 第一时间判断这个数据是不是 0 而不是在一堆跳转之后在判断 也可能在跳转以后就不会执行是cx是否是0的语句了
就像是
mov al,[si] ;把字符放入al中----------这里等于si=0的时候下面 cmp 0,61 jb s 就直接跳过了 cx=0的判断 执行的是si+1然后回来 这里0以后的下一个内存单元是什么数据 就不知道了 但是还在循环 应该说这样写循环会一直跳下去!~
cmp al,61h ;和61h对比,61h为字母a的16进制数.
jb s ;如果小于61h则跳转到s
cmp al,7ah ;和7a对比,如果大于7a则跳转到s,7a为z的16进制数
ja s
mov cl,[si] ;把字符放入cl中
mov ch,0 ;ch置零 这里 两条指令我明白 是将cx 高8位置0 低八位赋值 然后判断cx是否是0 然后jcxz跳转
inc cx 就算当[si]=0的时候你inc自增加了 cx也永远不等于0
;这一条和下一条指令用到jcxz指令,判断是否为0,为0则跳转到ok.
jcxz ok
and al,11011111b ;小写转换为大写.
mov [si],al ;转换完毕放回原地.
s: inc si ;si+1,指向下一个字符.
jmp short s0 ;短转移到标号(子程序)letterc,进行下一次循环。
修改一下 还是你的思路
s0:mov al,[si] ; 赋值
mov cl,[si]
mov ch,0
jcxz ok ; 以上判断CX是否为0 是0跳转到OK 不是0继续执行下一行
;(其实我看甲鱼老师写的答案这里是 用的je 是否等于 估计这道题也是考 je jb ja使用的吧 )
cmp al,61h
jb s
cmp al,7ah
ja s ;判断al是否是在 a-z之间
and al,11011111b
mov [si],al ;修改 大小写并送回原单元
|
|