一世芳华 发表于 2012-2-22 23:00:41

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

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,                  ;把字符放入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-22 23:00:42

本帖最后由 莫名其妙 于 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                     ;修改 大小写并送回原单元


一世芳华 发表于 2012-2-22 23:02:04

问题补充,运行程序后,报错, 和平时的报错一样,估计是占用了哪个受保护的内存。

逍遥 发表于 2012-2-23 22:09:40

:P 路过   。。。。。。
页: [1]
查看完整版本: 实验11,用jcxz为什么不能跳转出来,请帮看看代码