回 帖 发 新 帖 刷新版面

主题:用汇编语言打印ASCII码的一个问题

;此程序用来打印ASCII码
STACK SEGMENT STACK
      DB 200 DUP(0)
STACK ENDS
CODE  SEGMENT
      ASSUME CS:CODE,SS:STACK
START:MOV BL,0H
      MOV BH,0H
OUTER1: ADD BL,BH
;处理特殊字符(不可输出字符)
        CMP BL,0AH
        JE COUT_BREAK
        CMP BL,0DH
        JE COUT_BREAK
        CMP BL,07H
        JE COUT_BREAK
        CMP BL,08H
        JE COUT_BREAK
        CMP BL,09H
        JNE OUTER2
COUT_BREAK:MOV DL,20H
           MOV AH,2
           INT 21H
           JMP OUTER3
;处理可输出字符
OUTER2: MOV DL,BL
        MOV AH,2
        INT 21H
OUTER3: MOV DL,20H ;输出空格
        MOV AH,2
        INT 21H                              
        ADD BL,10H  ;改变列循环变量
        SUB BL,BH
        CMP BL,0F0H  ;比较列循环变量与转移条件的值
        JNE OUTER1        
        MOV BL,0F0H   ;输出每一行的最后一个字符
        ADD BL,BH
        MOV DL,BL
        MOV AH,2
        INT 21H
OUTER4: MOV DL,0AH   ;输出回车换行
        MOV AH,2
        INT 21H
        MOV DL,0DH
        MOV AH,2
        INT 21H
        INC BH    ;改变行循环变量
        MOV BL,0H   ;列循环变量置零
        CMP BH,0FH   ;比较行循环变量与转移条件的值
        JLE OUTER1
        MOV AH,4CH
        INT 21H
CODE  ENDS
      END START
;我想不明白的一个问题:CMP BL,0F0H  ;比较列循环变量与转移条件的值
                      JNE OUTER1
;表示如过BL不等于0F0H则转到OUTER1出执行,它应该和下面这条指令是等价的
;CMP,BL0F0H
;JLE OUTER1
;可是不一样,用下面一条指令就不循环,为什么?  
[em1][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1]

回复列表 (共2个回复)

沙发

JLE OUTER1是判断有符号数的,而在这里用的是无符号数

板凳


这不是关键之所在,而是为什么用JNE就不循环的问题。
如果改成无符号数,那个地方0就要单独去处理,显得麻烦。

我来回复

您尚未登录,请登录后再回复。点此登录或注册