回 帖 发 新 帖 刷新版面

主题:本该跳回dos的,为什么光标会回到起始处,又可以继续输入,且覆盖前面的呢?

我的代码如下:
DATASG        SEGMENT
    NUM        DB    ?
    MSG1        DB    'SPACE','$'
    MSG2        DB    'ENTER','$'
DATASG        ENDS
;*****************************************************************************
CODESG        SEGMENT
    ASSUME        CS:CODESG,DS:DATASG
        MAIN    PROC    FAR
        MOV        AX,DATASG
        MOV        DS,AX    
                                
        CALL        INPUT
                                
        MOV      AX,4C00H
                  INT      21H
                                
       MAIN        ENDP
;-------------------------------------------
    INPUT    PROC    NEAR    
START:
        MOV    AH,01H
             INT        21H

        CMP    AX,32
        JZ    STEP
                                
        CMP    AX,10
        JZ    EXIT
                                
        JMP    START
                                
STEP:
        LEA    DX,MSG1
        MOV    AH,09H
        INT    21H
        JMP    START
                                
EXIT:
        LEA    DX,MSG2
        MOV    AH,09H
        INT     21H
        RET    
    INPUT        ENDP
CODESG        ENDS
    END        MAIN
按ENTER本来应该退出程序了,可是,光标又回到开始,可以继续输入,且覆盖前面的回显..............晕了,求教达人,再拜,(30分)            

回复列表 (共5个回复)

沙发

你的程序问题稍微有点多,调用dos一号功能数据默认在al中,不是ax中,你写的程序是一个死循环,而且不会显示结果,比较的数据选的也不好,jmp用的不是地方,也没有回车换行,是程序输出有点乱,我做了点修改如下,我选的比较数据是32h和31h,也就是2和1(键盘输入) 如下:
DATASG        SEGMENT
    NUM        DB    ?
    MSG1        DB    'SPACE','$'
    MSG2        DB    'ENTER','$'
DATASG        ENDS
;*****************************************************************************
CODESG        SEGMENT
    ASSUME        CS:CODESG,DS:DATASG
        MAIN    PROC    FAR
        MOV        AX,DATASG
        MOV        DS,AX    
                                
        CALL        INPUT
                                
        MOV      AX,4C00H
                  INT      21H
                                
       MAIN        ENDP
;-------------------------------------------
    INPUT    PROC    NEAR    
START:
        MOV    AH,01H
             INT        21H

        CMP    AX,32
        JZ    STEP
                                
        CMP    AX,10
        JZ    EXIT
                                
        JMP    START
                                
STEP:
        LEA    DX,MSG1
        MOV    AH,09H
        INT    21H
        JMP    START
                                
EXIT:
        LEA    DX,MSG2
        MOV    AH,09H
        INT     21H
        RET    
    INPUT        ENDP
CODESG        ENDS
    END        MAIN
我已编译运行过,能正确的输出结果,而且可以循环(如果输入正确)。

板凳

ASCII码10是换行,不是回车,回车应该用13;一号功能输入的字符存在al中,不是ax,应该用al比较而不是ax;程序使用了call,最好自己建立一个堆栈段。

修改如下:


DATASG     SEGMENT
NUM        DB    ?
MSG1        DB    'SPACE','$'
MSG2        DB    'ENTER','$'
DATASG        ENDS

stack      segment  stack
           db  50 dup(?)
stack      ends

CODESG        SEGMENT
    ASSUME        CS:CODESG,DS:DATASG, ss:stack
start:  MOV        AX,DATASG
        MOV        DS,AX    
        CALL        INPUT
        MOV      AX,4C00H
        INT      21H
                                
INPUT    PROC    NEAR
cycle:  MOV    AH,01H
        INT    21H
        CMP    Al,32
        JZ    STEP
        CMP    Al,13
        JZ    EXIT
        JMP   cycle
STEP:   LEA    DX,MSG1
        MOV    AH,09H
        INT    21H
        JMP    cycle
EXIT:   mov ah, 2
        mov dl, 10
        int 21h
        LEA    DX,MSG2
        MOV    AH,09H
        INT    21H
        RET    
INPUT   ENDP
CODESG  ENDS
    END start

3 楼

谢谢,再拜达人

4 楼

我还想问RE2的达人,程序里的
EXIT:
          MOV     AH,2
          MOV     DL,10
          INT     21H
有什么作用?
我发现少了这三行就出问题了...........
再拜达人!

5 楼

哦,明白了,刚才犯傻了,呵呵

我来回复

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