鱼C论坛

 找回密码
 立即注册
查看: 3107|回复: 3

实验11,用jcxz为什么不能跳转出来,请帮看看代码

[复制链接]
发表于 2012-2-22 23:00:41 | 显示全部楼层 |阅读模式
1鱼币
assume cs:codesg
datasg 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,[si]                  ;把字符放入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,[si]                    ;把字符放入cl中
          mov ch,0                      ;ch置零
  
          inc cx                          ;这一条和下一条指令用到jcxz指令,判断是否为0,为0则跳转到ok.
         jcxz ok                        
         and al,11011111b         ;小写转换为大写.
         mov [si],al                     ;转换完毕放回原地.
   s:   inc si                              ;si+1,指向下一个字符.
         jmp short s0              ;短转移到标号(子程序)letterc,进行下一次循环。
ok:   pop si   
        ret                                  ;返回主程序.
   
        codesg ends
   
        end start

最佳答案

查看完整内容

你的思路有问题 对于遇到0结束这一类的问题应该 第一时间判断这个数据是不是 0 而不是在一堆跳转之后在判断 也可能在跳转以后就不会执行是cx是否是0的语句了 就像是 mov al,[si] ;把字符放入al中----------这里等于si=0的时候下面 cmp 0,61 jb s 就直接跳过了 cx=0的判断 执行的是si+1然后回来 这里0以后的下一个内存单元是什么数据 就不知道了 但是还在循环 应该说这样写循环会一直跳下去!~ cmp ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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                       ;修改 大小写并送回原单元


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-2-22 23:02:04 | 显示全部楼层
问题补充,运行程序后,报错, 和平时的报错一样,估计是占用了哪个受保护的内存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-2-23 22:09:40 | 显示全部楼层
:P 路过   。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 20:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表