实验11,用jcxz为什么不能跳转出来,请帮看看代码
assume cs:codesgdatasg segment
db "Beginner's All-purpose symblic Instruction Code.",0
datasg ends
codesg segment
start: mov ax,datasg
mov ds,ax
mov si,0
call letterc
mov ax,4c00h
int 21h
letterc:push si
s0:mov al, ;把字符放入al中
cmp al,61h ;和61h对比,61h为字母a的16进制数.
jb s ;如果小于61h则跳转到s
cmp al,7ah ;和7a对比,如果大于7a则跳转到s,7a为z的16进制数
ja s
mov cl, ;把字符放入cl中
mov ch,0 ;ch置零
inc cx ;这一条和下一条指令用到jcxz指令,判断是否为0,为0则跳转到ok.
jcxz ok
and al,11011111b ;小写转换为大写.
mov ,al ;转换完毕放回原地.
s: inc si ;si+1,指向下一个字符.
jmp short s0 ;短转移到标号(子程序)letterc,进行下一次循环。
ok: pop si
ret ;返回主程序.
codesg ends
end start
本帖最后由 莫名其妙 于 2012-2-24 13:54 编辑
你的思路有问题 对于遇到0结束这一类的问题应该 第一时间判断这个数据是不是 0 而不是在一堆跳转之后在判断 也可能在跳转以后就不会执行是cx是否是0的语句了
就像是
mov al, ;把字符放入al中----------这里等于si=0的时候下面 cmp 0,61jb 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, ;把字符放入cl中
mov ch,0 ;ch置零 这里 两条指令我明白 是将cx 高8位置0 低八位赋值 然后判断cx是否是0然后jcxz跳转
inc cx 就算当=0的时候你inc自增加了 cx也永远不等于0
;这一条和下一条指令用到jcxz指令,判断是否为0,为0则跳转到ok.
jcxz ok
and al,11011111b ;小写转换为大写.
mov ,al ;转换完毕放回原地.
s: inc si ;si+1,指向下一个字符.
jmp short s0 ;短转移到标号(子程序)letterc,进行下一次循环。
修改一下 还是你的思路
s0:mov al, ; 赋值
mov cl,
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 ,al ;修改 大小写并送回原单元
问题补充,运行程序后,报错, 和平时的报错一样,估计是占用了哪个受保护的内存。 :P 路过 。。。。。。
页:
[1]