回 帖 发 新 帖 刷新版面

主题:初学者,请大家帮忙解决问题

有三个单字节无符号数存放在BUFFER开始的缓冲区中,将这三个数按从大到小排序。
第一步:将原来由程序给定的三个单字节无符号数改成由用户从键盘输入三个一位数字,仍按从大到小排序
            (提示:由用户从键盘输入一位数的方法可参考课本例5.2)

            将第一步的结果生成一个.asm文件和一个.exe文件

    第二步:在第一步的基础上改进:
               用户每输入一位数前屏幕显示:
                       Enter the first value(0-9): _
                       Enter the second value(0-9): _
                       Enter the third value(0-9): _
               排完序后,显示如下
                       After sorting...
                       Num1= _
                       Num2= _
                       Num3= _
            将第二步的结果同样生成一个.asm文件和一个.exe文件

回复列表 (共2个回复)

沙发

朋友,你自己写的代码有么?
总不见的让别人代你做作业咯?

板凳

由于时间关系没写完
前面完成了一半,也没时间写注释了
前面的如果能看懂的话,我想后面的你自己写应该没问题的
不能老靠别人啊,代码贴在下面了 自己看吧。
再一个那汇编写这东西,真的没什么长处,就一个字麻烦


DATA    SEGMENT
BUF     DB      3 DUP(?)
SENT1   DB      'Enter the first value(0-9): '
SENT2   DB      'Enter the second value(0-9):'
SENT3   DB      'Enter the third value(0-9): '
CNT1    EQU     $-SENT3

SENT4   DB      'Num1='
SENT5   DB      'Num2='
SENT6   DB      'Num3='
CNT2    EQU     $-SENT6

SENT7   DB      'After sorting...'
CNT3    EQU     $-SENT7

SENT8   DB      'OUT OF 0-9, Enter again!'
CNT4    EQU     $-SENT8

FLAG1   DB      0
DATA    ENDS




CODE    SEGMENT
        ASSUME  CS:CODE,DS:DATA

MAIN    PROC    FAR
START:
        MOV     AX,DATA
        MOV     DS,AX

        CALL    BEGI
       

        MOV     AH,4CH
        INT     21H
MAIN    ENDP
       


;________________________
;BEGI子程序:主要用于用户输入3个数据,包含信息提示与出错信息
;无入口参数
;SI为提示信息地址,DI为存储输入数据的地址,CX为循环次数
;本过程的LP1循环体调用DISP1用来显示提示信息,调用IN_PUT来提供用户输入
;并且利用FLAG1来检测输入数据是否有效,如果无效则跳转本次重新输入
;循环体内,DI和SI相应的变化
;________________________

BEGI    PROC    NEAR

        MOV     SI,OFFSET SENT1
        MOV     DI,OFFSET BUF
        MOV     CX,3
        PUSH    BX
        MOV     BL,1
LP1:
        PUSH    CX
        MOV     CX,CNT1
RET_ER: CALL    DISP1
        CALL    IN_PUT

        CMP     BL,FLAG1
        JE      RET_ER

        ADD     SI,CNT1
        INC     DI
        POP     CX
        LOOP    LP1
        POP     BX      
        RET
BEGI    ENDP


;_______________________
;DISP1子程序
;入口参数:显示字符串首地址(SI),串长(CX)
;使用寄存器:AX,DX,SI,CX(用前入栈)
;该过程属于通用过程
;该过程应注意SI与CX入栈,此过程被多次调用,防止信息乱套
;*********

DISP1   PROC    NEAR
        
        PUSH    AX
        PUSH    DX
        PUSH    SI
        PUSH    CX
        MOV     AH,2
LP2:
        MOV     DL,[SI]
        INT     21H
        INC     SI
        LOOP    LP2
    POP    CX    
        POP     SI
        POP     DX
        POP     AX
        RET
DISP1   ENDP


;_______________
;IN_PUT子程序
;入口参数:无
;出口参数:FLAG1
;使用寄存器:AX,DI(用前入栈)
;该过程主要用于输入一个字符并存于BUF存储区,如果非阿拉伯数字
;设置FLAG1为1,返回后用于提供出错信息,如果属于阿拉伯数字进行存储
;并且需要设置FLAG1为0
;_______________

IN_PUT  PROC    NEAR
        PUSH    AX
        PUSH    DI
        MOV     AH,1
        INT     21H

        SUB     AL,30H
        CMP     AL,0
        JB      SET_FG
        CMP     AL,9
        JNBE    SET_FG

        JMP     RIGHT

SET_FG:
        CALL    IN_ERRO
        MOV     AH,1
        MOV     FLAG1,AH
        JMP     EXIT1

RIGHT:  MOV     [DI],AL
        CALL    CR_LF
        MOV    AH,0
    MOV    FLAG1,AH
EXIT1:  POP    DI
    POP    AX
        RET


       
IN_PUT ENDP



;___________________
;IN_ERRO出错提示信息
;调用DISP1通用函数
;无参数

;__________________

IN_ERRO PROC    NEAR
        PUSH    SI
        PUSH    CX
        MOV     SI,OFFSET SENT8
        MOV     CX,CNT4
        CALL    CR_LF
        CALL    DISP1
        CALL    CR_LF
        POP     CX
        POP     SI
        RET
IN_ERRO ENDP


;___________________
;CR_LF换行回车子程序
;无参数,通用过程

;___________________

CR_LF   PROC    NEAR
        PUSH    AX
        PUSH    DX
        MOV     AH,2
        MOV     DL,0AH
        INT     21H
        MOV     DL,0DH
        INT     21H
        POP     DX
        POP     AX
        RET
CR_LF   ENDP


CODE    ENDS    
        END     START   

我来回复

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