+ -
当前位置:首页 → 问答吧 → 汇编中循环的问题,麻烦各位指点一下

汇编中循环的问题,麻烦各位指点一下

时间:2011-04-24

来源:互联网

题目:
按15*16列的表格形式显示ASCII码为10H-100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字符.每16个字符为一行,每行中相邻两个字符之间用空白符(ASCII码为0)隔开
datarea segment  
datarea ends

prognam segment  

main proc far
  assume cs:prognam, ds:datarea, es:datarea
start: ;starting execution address
;set up stack for return
  push ds  
  sub ax, ax  
  push ax  
;set DS register to current data segment
  mov ax, datarea  
  mov ds, ax  
  mov es, ax  
   
;MAIN PART OF PROGRAM GOES HERE
  mov dl, 10h
  mov cx, 20h
  mov ax, 101h

  print:mov ah, 02h  
  int 21h

  inc dl

  push dx         ;输出空格
  mov dl, 0h
  mov ah, 02h  
  int 21h
  pop dx

  dec cx  
  loop print 

  push dx ;输出换行回车
  mov dx, 0Ah  
  mov ah, 02h  
  int 21h
  mov dx, 0Dh  
  mov ah, 02h  
  int 21h
  pop dx

      cmp dx, ax       ;前面都没问题,能显示一行和换行,只是加上这两行后
  jnz print        ;是死循环,这是怎么一回事呢
   
  ret ;return to DOS
main endp ;end of main part of program  
;---------------------------------------------------------------------
prognam ends ;end of code segment
;*********************************************************************
  end start ;end assembly

作者: udbwcso   发布时间: 2011-04-24

cmp dx, ax       ;前面都没问题,能显示一行和换行,只是加上这两行后
  jnz print        ;是死循环,这是怎么一回事呢

jnz表示不为0则跳转,这里逻辑错误.
dx与ax做比较,大于,小于,等于...等情形判断,而不是用jnz(很可能成死循环)


可以参考以下:
JE  ;等于则跳转 
JNE ;不等于则跳转 
 
JZ  ;为 0 则跳转 
JNZ ;不为 0 则跳转 
 
JS  ;为负则跳转 
JNS ;不为负则跳转 
 
JC  ;进位则跳转 
JNC ;不进位则跳转 
 
JO  ;溢出则跳转 
JNO ;不溢出则跳转 
 
JA  ;无符号大于则跳转 
JNA ;无符号不大于则跳转 
JAE ;无符号大于等于则跳转 
JNAE ;无符号不大于等于则跳转 
 
JG  ;有符号大于则跳转 
JNG ;有符号不大于则跳转 
JGE ;有符号大于等于则跳转 
JNGE ;有符号不大于等于则跳转 
 
JB  ;无符号小于则跳转 
JNB ;无符号不小于则跳转 
JBE ;无符号小于等于则跳转 
JNBE ;无符号不小于等于则跳转 
 
JL  ;有符号小于则跳转 
JNL ;有符号不小于则跳转 
JLE ;有符号小于等于则跳转 
JNLE ;有符号不小于等于则跳转

作者: G_Spider   发布时间: 2011-04-24