8086汇编:输入输出和数组操作的一些函数

最近为了应付8086汇编的上机考试(一纸开卷),所以写了一些输入输出、数组操作相关函数,然而并没有卵用。

代码放在了下面,又需要的童鞋自取,注释什么的感觉已经写的很详细了,希望程序里没有神马BUG~

或者点击这里下载:8086汇编:输入输出和数组操作的一些函数


DELAY_SEC ;等待N秒,N由AX输入,N最大360
CLR_SCR ;清屏

SPACE ;空格
NEW_LINE ;回车换行
PRINT_CH ;输出AL中的字符
PRINT_STR ;输出DS:AX中的字符串($结尾)
PRINT_BI ;以二进制输出AX中的比特
PRINT_HEX_CH ;以十六进制输出AL低四位的比特
PRINT_HEX ;以十六进制输出AX中的比特
PRINT_DEC ;以十进制输出AX中的数值
PRINT_NUM ;以N进制输出AX中的数值;N由DL输入,N最大36

READ_CH ;读取字符到AL中
READ_STR ;读取字符串到DS:AX中;DL为缓冲区大小
READ_DEC ;读取十进制数到AX中
READ_NUM ;读取N进制数到AX中;N由DL输入,N最大36;DH返回错误码
READ_ERR ;根据错误码输出提示信息;错误码由DH输入

IF_RAD_CH ;判断AL是否为N进制合法字符;N由DL输入,N最大36;若是,AL返回对应数值;否则,AL返回值0FFH
RE_RAD_CH ;返回AL中的数值对应的N进制字符;N由DL输入,N最大36;字符由AL返回,错误则返回'?'

RAND ;生成一随机数存于AX
RAND_RANGE ;生成[0,RANGE)内的随机数;RANGE由AX输入

STR_LEN ;返回DS:AX中的字符串长度到AX中
UPPER_CH ;将AL中的字母大写
LOWER_CH ;将AL中的字母小写
UPPER_STR ;将DS:AX中的字符串大写
LOWER_STR ;将DS:AX中的字符串小写

ARR_INIT ;数组初始化;AX为数组的字节大小;SI为数组的偏移地址;数组至少4字节大小
ARR_SIZE ;返回数组的大小到AX;SI为数组的偏移地址
ARR_CAP ;返回数组的容量到AX;SI为数组的偏移地址
ARR_IS_FULL ;判断数组是否已满;是,AX返回数组大小;否,AX返回0;SI为数组的偏移地址
ARR_GET ;返回下标为AX的值到AX中;SI为数组的偏移地址;越界,则DH返回错误码5
ARR_APPEND ;在数组末尾添加AX中的值;SI为数组的偏移地址;数组已满,则DH返回错误码6
ARR_INS ;在下标BX处插入AX中的值;SI为数组的偏移地址;数组已满,则DH返回错误码6;越界,则DH返回错误码5
ARR_DEL ;删除下标为AX的值;删除的值由AX返回;SI为数组的偏移地址;越界,则DH返回错误码5
ARR_REV ;数组逆置;SI为数组的偏移地址
ARR_SORT ;数组非递减排序;SI为数组的偏移地址
ARR_ERR ;根据错误码输出提示信息;错误码由DH输入
ARR_PRINT ;输出数组内容;SI为数组的偏移地址

;-------------------
;等待N秒,N由AX输入,N最大360
DELAY_SEC PROC
    PUSHF
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
    
    MUL CS:DELAY_SEC_CPS
    DIV CS:DELAY_SEC_TEN
    MOV BX,AX
    
    INT 1AH
    MOV CS:DELAY_SEC_TIMES,DX
DELAY_SEC_1:
    INT 1AH
    SUB DX,CS:DELAY_SEC_TIMES
    CMP DX,BX
    JB DELAY_SEC_1    
    
    POP DX
    POP CX
    POP BX
    POP AX
    POPF
    RET
    
    DELAY_SEC_CPS DW 182
    DELAY_SEC_TEN DW 10
    DELAY_SEC_TIMES DW 0
DELAY_SEC ENDP
;-------------------

;-------------------
;清屏
CLR_SCR PROC
    PUSHF
    PUSH AX
    
    MOV AX,3
    INT 10H
    
    POP AX
    POPF
    RET
CLR_SCR ENDP
;-------------------

;-------------------
;空格
SPACE PROC
    PUSHF
    PUSH AX
    PUSH DX
    
    MOV AH,02H
    MOV DL,' '
    INT 21H
        
    POP DX
    POP AX
    POPF
    RET
SPACE ENDP
;-------------------

;-------------------
;回车换行
NEW_LINE PROC
    PUSHF
    PUSH AX
    PUSH DX
    
    MOV AH,02H
    MOV DL,0AH
    INT 21H
    MOV DL,0DH
    INT 21H
    
    POP DX
    POP AX
    POPF
    RET
NEW_LINE ENDP
;-------------------

;-------------------
;输出AL中的字符
PRINT_CH PROC
    PUSHF
    PUSH AX
    PUSH DX
    
    MOV DL,AL
    MOV AH,02H
    INT 21H
    
    POP DX
    POP AX
    POPF
    RET
PRINT_CH ENDP
;-------------------

;-------------------
;输出DS:AX中的字符串($结尾)
PRINT_STR PROC
    PUSHF
    PUSH AX
    PUSH DX
    
    MOV DX,AX
    MOV AH,09H
    INT 21H
    
    POP DX
    POP AX
    POPF
    RET
PRINT_STR ENDP
;-------------------

;-------------------
;以二进制输出AX中的比特
PRINT_BI PROC
    PUSHF
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
    
    MOV BX,AX
    MOV AH,02H
    
    MOV CX,16
PRINT_BI_1:
    ROL BX,1
    MOV DL,BL
    AND DL,1
    ADD DL,'0'
    INT 21H
    LOOP PRINT_BI_1
    
    POP DX
    POP CX
    POP BX
    POP AX
    POPF
    RET
PRINT_BI ENDP
;-------------------

;-------------------
;以十六进制输出AL低四位的比特
PRINT_HEX_CH PROC
    PUSHF
    PUSH AX
    PUSH DX
    
    AND AL,0FH
    
    CMP AL,9
    JA PRINT_HEX_CH_1
    ADD AL,'0'
    JMP PRINT_HEX_CH_2
PRINT_HEX_CH_1:
    ADD AL,'A'-10
PRINT_HEX_CH_2:
    MOV DL,AL
    MOV AH,02H
    INT 21H
    
    POP DX
    POP AX
    POPF
    RET
PRINT_HEX_CH ENDP
;-------------------

;-------------------
;以十六进制输出AX中的比特
PRINT_HEX PROC
    PUSHF
    PUSH CX
    
    MOV CX,4
PRINT_HEX_1:
    PUSH CX
    MOV CL,4
    ROL AX,CL
    CALL PRINT_HEX_CH
    POP CX
    LOOP PRINT_HEX_1
    
    POP CX
    POPF
    RET
PRINT_HEX ENDP
;-------------------

;-------------------
;以十进制输出AX中的数值
PRINT_DEC PROC
    PUSHF
    PUSH AX
    PUSH CX
    PUSH DX
    
    MOV CX,0
PRINT_DEC_1:
    MOV DX,0
    DIV PRINT_DEC_TEN
    PUSH DX
    INC CX
    CMP AX,0
    JNE PRINT_DEC_1
    
    MOV AH,02H
PRINT_DEC_2:
    POP DX
    ADD DX,'0'
    INT 21H
    LOOP PRINT_DEC_2
    
    POP DX
    POP CX
    POP AX
    POPF
    RET
    
    PRINT_DEC_TEN DW 10
PRINT_DEC ENDP
;-------------------

;-------------------
;以N进制输出AX中的数值
;N由DL输入,N最大36
PRINT_NUM PROC
    PUSHF
    PUSH AX
    PUSH CX
    PUSH DX
    
    MOV DH,0
    MOV PRINT_NUM_RAD,DX
    
    MOV CX,0
PRINT_NUM_1:
    MOV DX,0
    DIV PRINT_NUM_RAD
    PUSH DX
    INC CX
    CMP AX,0
    JNE PRINT_NUM_1
    
    
PRINT_NUM_2:
    POP AX
    MOV DX,PRINT_NUM_RAD
    CALL RE_RAD_CH
    MOV DL,AL
    MOV AH,02H
    INT 21H
    LOOP PRINT_NUM_2
    
    POP DX
    POP CX
    POP AX
    POPF
    RET
    
    PRINT_NUM_RAD DW 0
PRINT_NUM ENDP
;-------------------

;-------------------
;读取字符到AL中
READ_CH PROC
    PUSHF
    PUSH BX
    MOV BH,AH
    
    MOV AH,01H
    INT 21H
    
    MOV AH,BH
    POP BX
    POPF
    RET
READ_CH ENDP
;-------------------

;-------------------
;读取字符串到DS:AX中
;DL为缓冲区大小
READ_STR PROC
    PUSHF
    PUSH AX
    PUSH DX
    PUSH DI
    PUSH SI
    PUSH ES
    
    MOV DI,DS
    MOV ES,DI
    MOV DI,AX
    MOV SI,DI
    ADD SI,2
    
    SUB DL,2
    MOV ES:[DI],DL
    MOV DX,AX
    MOV AH,0AH
    INT 21H
    
    CLD
READ_STR_1:
    MOV AX,DS:[SI]
    CMP AX,0DH
    JE READ_STR_2
    MOVSB
    JMP READ_STR_1
READ_STR_2:
    MOV AL,'$'
    MOV ES:[DI],AL
    
    POP ES
    POP SI
    POP DI
    POP DX
    POP AX
    POPF
    RET
READ_STR ENDP
;-------------------

;-------------------
;读取十进制数到AX中
READ_DEC PROC
    PUSHF
    PUSH BX
    PUSH CX
    PUSH DX
    
    PUSH DS
    MOV DX,CS
    MOV DS,DX
    MOV DX,OFFSET READ_DEC_BUF
    MOV AH,0AH
    INT 21H
    POP DS
    
    XOR AX,AX
    MOV BX,OFFSET READ_DEC_BUF+1
READ_DEC_1:
    INC BX
    MOV CL,CS:[BX]
    CMP CL,0DH
    JE READ_DEC_END
    CMP CL,'0'
    JB READ_DEC_1
    CMP CL,'9'
    JA READ_DEC_1
    
    XOR CH,CH
READ_DEC_2:
    MOV CL,CS:[BX]
    CMP CL,0DH
    JE READ_DEC_END
    CMP CL,'0'
    JB READ_DEC_END
    CMP CL,'9'
    JA READ_DEC_END
    SUB CL,'0'
    MUL READ_DEC_TEN
    ADD AX,CX
    INC BX
    JMP READ_DEC_2
    
READ_DEC_END:
    POP DX
    POP CX
    POP BX
    POPF
    RET
    
    READ_DEC_TEN DW 10
    READ_DEC_BUF DB 62,63 DUP(0)
READ_DEC ENDP
;-------------------

;-------------------
;读取N进制数到AX中
;N由DL输入,N最大36
;DH返回错误码
READ_NUM PROC
    PUSHF
    PUSH BX
    PUSH CX
    PUSH DX
    
    MOV DH,0
    MOV READ_NUM_RAD,DX
    
    PUSH DS
    MOV BX,CS
    MOV DS,BX
    MOV DX,OFFSET READ_NUM_BUF
    MOV AH,0AH
    INT 21H
    POP DS
    
    MOV BX,OFFSET READ_NUM_BUF+1
    MOV CL,CS:[BX]
    CMP CL,0
    JE READ_NUM_1
    
    MOV READ_NUM_RES,0
    XOR CH,CH
    XOR DH,DH
READ_NUM_J1:
    INC BX
    MOV DL,CS:[BX]
    CMP DL,' '
    JNE READ_NUM_J2
    OR DH,2
    JMP READ_NUM_J3
    
READ_NUM_J2:
    CMP DH,3
    JE READ_NUM_3
    OR DH,1
    AND DH,0FFH-2
    
    MOV AX,READ_NUM_RAD
    MOV AH,AL
    MOV AL,DL
    MOV DL,AH
    CALL IF_RAD_CH
    CMP AL,0FFH
    JE READ_NUM_2
    
    MOV AH,0
    MOV READ_NUM_TMP,AX
    PUSH DX
    MOV AX,READ_NUM_RES
    MUL READ_NUM_RAD
    ADD AX,READ_NUM_TMP
    ADC DX,0
    MOV READ_NUM_RES,AX
    MOV READ_NUM_TMP,DX
    POP DX
    
    MOV AX,READ_NUM_TMP
    CMP AX,0
    JNE READ_NUM_4
    
READ_NUM_J3:
    LOOP READ_NUM_J1
    
    AND DH,1
    CMP DH,0
    JE READ_NUM_1
    JMP READ_NUM_0
    
READ_NUM_4:;数值溢出
    MOV AX,0FFFFH
    POP DX
    MOV DH,4
    JMP READ_NUM_END
    
READ_NUM_3:;格式错误
    MOV AX,READ_NUM_RES
    POP DX
    MOV DH,3
    JMP READ_NUM_END
    
READ_NUM_2:;非法字符;
    MOV AX,READ_NUM_RES
    POP DX
    MOV DH,2
    JMP READ_NUM_END
    
READ_NUM_1:;输入为空;
    MOV AX,0
    POP DX
    MOV DH,1
    JMP READ_NUM_END
    
READ_NUM_0:;正常结束
    MOV AX,READ_NUM_RES
    POP DX
    MOV DH,0
    
READ_NUM_END:
    POP CX
    POP BX
    POPF
    RET
    
    READ_NUM_TMP DW 0
    READ_NUM_RES DW 0
    READ_NUM_RAD DW 10
    READ_NUM_BUF DB 62,63 DUP(0)
READ_NUM ENDP
;-------------------

;-------------------
;根据错误码输出提示信息
;错误码由DH输入
READ_ERR PROC
    PUSHF
    PUSH AX
    PUSH DX
    
    CMP DH,0
    JE READ_ERR_END
    
    CMP DH,1
    JNE READ_ERR_1
    MOV DX,OFFSET READ_ERR_T1
    JMP READ_ERR_PRT
READ_ERR_1:
    CMP DH,2
    JNE READ_ERR_2
    MOV DX,OFFSET READ_ERR_T2
    JMP READ_ERR_PRT
READ_ERR_2:
    CMP DH,3
    JNE READ_ERR_3
    MOV DX,OFFSET READ_ERR_T3
    JMP READ_ERR_PRT
READ_ERR_3:
    CMP DH,4
    JNE READ_ERR_4
    MOV DX,OFFSET READ_ERR_T4
    JMP READ_ERR_PRT
READ_ERR_4:
    
READ_ERR_PRT:
    PUSH DS
    MOV AX,CS
    MOV DS,AX
    MOV AH,09H
    INT 21H
    POP DS
    
READ_ERR_END:
    POP DX
    POP AX
    POPF
    RET
    
    READ_ERR_T1 DB 'Err: empty input!',10,13,36
    READ_ERR_T2 DB 'Err: invalid character!',10,13,36
    READ_ERR_T3 DB 'Err: wrong format!',10,13,36
    READ_ERR_T4 DB 'Err: numeric overflow!',10,13,36
READ_ERR ENDP
;-------------------

;-------------------
;判断AL是否为N进制合法字符
;N由DL输入,N最大36
;若是,AL返回对应数值
;否则,AL返回值0FFH
IF_RAD_CH PROC
    PUSHF
    PUSH DX
    
    CMP AL,'0'
    JB IF_RAD_CH_1
    CMP DL,10
    JA IF_RAD_CH_4
    MOV DH,DL
    ADD DH,'0'-1
    JMP IF_RAD_CH_5
IF_RAD_CH_4:
    MOV DH,'9'
IF_RAD_CH_5:
    CMP AL,DH
    JA IF_RAD_CH_2
    SUB AL,'0'
    JMP IF_RAD_CH_END
    
IF_RAD_CH_2:
    CMP AL,'A'
    JB IF_RAD_CH_1
    MOV DH,DL
    ADD DH,'A'-11
    CMP AL,DH
    JA IF_RAD_CH_3
    SUB AL,'A'
    ADD AL,10
    JMP IF_RAD_CH_END
    
IF_RAD_CH_3:
    CMP AL,'a'
    JB IF_RAD_CH_1
    MOV DH,DL
    ADD DH,'a'-11
    CMP AL,DH
    JA IF_RAD_CH_1
    SUB AL,'a'
    ADD AL,10
    JMP IF_RAD_CH_END
    
IF_RAD_CH_1:
    MOV AL,0FFH
IF_RAD_CH_END:
    POP DX
    POPF
    RET
IF_RAD_CH ENDP
;-------------------

;-------------------
;返回AL中的数值对应的N进制字符
;N由DL输入,N最大36
;字符由AL返回,错误则返回'?'
RE_RAD_CH PROC
    PUSHF
    
    CMP AL,DL
    JB RE_RAD_CH_1
    MOV AL,'?'
    JMP RE_RAD_CH_END
    
RE_RAD_CH_1:
    CMP AL,10
    JB RE_RAD_CH_2
    ADD AL,'A'-10
    JMP RE_RAD_CH_END
    
RE_RAD_CH_2:
    ADD AL,'0'
    
RE_RAD_CH_END:
    POPF
    RET
RE_RAD_CH ENDP
;-------------------

;-------------------
;生成一随机数存于AX
RAND PROC
    PUSHF
    PUSH BX
    PUSH CX
    PUSH DX
    
    MOV AH,2CH
    INT 21H
    MOV BL,DL
    XOR BH,BH
    MOV AL,CS:[BX]
    MOV AH,BL
    CMP AX,0
    MUL RAND_TMP_2
    XCHG AH,AL
    JE RAND_1
    MOV RAND_TMP_1,AX
RAND_1:
    
    XOR AX,AX
    OUT 43H,AL
    IN AL,40H
    MOV AH,AL
    IN AL,40H
    CMP AX,0
    XCHG AH,AL
    MUL RAND_TMP_1
    XCHG AH,AL
    JE RAND_2
    MOV RAND_TMP_2,AX
RAND_2:
    
    XOR AX,RAND_TMP_1
    ADD AX,DX
    XCHG AH,AL
    
    POP DX
    POP CX
    POP BX
    POPF
    RET
    
    RAND_TMP_1 DW 1
    RAND_TMP_2 DW 1
RAND ENDP
;-------------------

;-------------------
;生成[0,RANGE)内的随机数
;RANGE由AX输入
RAND_RANGE PROC
    PUSHF
    PUSH BX
    PUSH DX
    
    MOV BX,AX
    CALL RAND
    XOR DX,DX
    DIV BX
    MOV AX,DX
    
    POP DX
    POP BX
    POPF
    RET
RAND_RANGE ENDP
;-------------------

;-------------------
;返回DS:AX中的字符串长度到AX中
STR_LEN PROC
    PUSHF
    PUSH BX
    PUSH CX
    
    MOV BX,AX
    XOR CX,CX
STR_LEN_1:
    MOV AL,DS:[BX]
    CMP AL,'$'
    JE STR_LEN_END
    INC CX
    INC BX
    JMP STR_LEN_1
    
STR_LEN_END:
    MOV AX,CX
    
    POP CX
    POP BX
    POPF
    RET
STR_LEN ENDP
;-------------------

;-------------------
;将AL中的字母大写
UPPER_CH PROC
    PUSHF
    
    CMP AL,'a'
    JB UPPER_CH_END
    CMP AL,'z'
    JA UPPER_CH_END
    AND AL,0FFH-32
    
UPPER_CH_END:
    POPF
    RET
UPPER_CH ENDP
;-------------------

;-------------------
;将AL中的字母小写
LOWER_CH PROC
    PUSHF
    
    CMP AL,'A'
    JB UPPER_CH_END
    CMP AL,'Z'
    JA UPPER_CH_END
    OR AL,32
    
UPPER_CH_END:
    POPF
    RET
LOWER_CH ENDP
;-------------------

;-------------------
;将DS:AX中的字符串大写
UPPER_STR PROC
    PUSHF
    PUSH AX
    PUSH SI
    
    MOV SI,AX
UPPER_STR_1:
    MOV AL,DS:[SI]
    CMP AL,'$'
    JE UPPER_STR_END
    CALL UPPER_CH
    MOV DS:[SI],AL
    INC SI
    JMP UPPER_STR_1
    
UPPER_STR_END:
    POP SI
    POP AX
    POPF
    RET
UPPER_STR ENDP
;-------------------

;-------------------
;将DS:AX中的字符串小写
LOWER_STR PROC
    PUSHF
    PUSH AX
    PUSH SI
    
    MOV SI,AX
LOWER_STR_1:
    MOV AL,DS:[SI]
    CMP AL,'$'
    JE LOWER_STR_END
    CALL LOWER_CH
    MOV DS:[SI],AL
    INC SI
    JMP LOWER_STR_1
    
LOWER_STR_END:
    POP SI
    POP AX
    POPF
    RET
LOWER_STR ENDP
;-------------------

;-------------------
;数组初始化
;AX为数组的字节大小
;SI为数组的偏移地址
;数组至少4字节大小
ARR_INIT PROC
    PUSHF
    PUSH AX
    
    SHR AX,1
    SUB AX,2
    MOV [SI],AX
    MOV WORD PTR [SI+2],0
    
    POP AX
    POPF
    RET
ARR_INIT ENDP
;-------------------
    
;-------------------
;返回数组的大小到AX
;SI为数组的偏移地址
ARR_SIZE PROC
    MOV AX,[SI+2]
    RET
ARR_SIZE ENDP
;-------------------

;-------------------
;返回数组的容量到AX
;SI为数组的偏移地址
ARR_CAP PROC
    MOV AX,[SI]
    RET
ARR_CAP ENDP
;-------------------

;-------------------
;判断数组是否已满
;是,AX返回数组大小
;否,AX返回0
;SI为数组的偏移地址
ARR_IS_FULL PROC
    PUSHF
    
    MOV AX,[SI]
    CMP AX,[SI+2]
    JE ARR_IS_FULL_END
    MOV AX,0
    
ARR_IS_FULL_END:
    POPF
    RET
ARR_IS_FULL ENDP
;-------------------

;-------------------
;返回下标为AX的值到AX中
;SI为数组的偏移地址
;越界,则DH返回错误码5
ARR_GET PROC
    PUSHF
    PUSH BX
    
    CMP AX,[SI+2]
    JB ARR_GET_1 
    MOV DH,5
    JMP ARR_GET_END
    
ARR_GET_1:
    MOV BX,DX
    SHL BX,1
    MOV AX,[SI+4+BX]
    MOV DH,0
    
ARR_GET_END:
    POP BX
    POPF
    RET
ARR_GET ENDP
;-------------------

;-------------------
;在数组末尾添加AX中的值
;SI为数组的偏移地址
;数组已满,则DH返回错误码6
ARR_APPEND PROC
    PUSHF
    PUSH BX
    
    MOV BX,[SI+2]
    CMP BX,[SI]
    JB ARR_APPEND_1
    MOV DH,6
    JMP ARR_APPEND_END
    
ARR_APPEND_1:
    INC BX
    MOV [SI+2],BX
    SHL BX,1
    MOV [SI+2+BX],AX
    MOV DH,0
    
ARR_APPEND_END:
    POP BX
    POPF
    RET
ARR_APPEND ENDP
;-------------------

;-------------------
;在下标BX处插入AX中的值
;SI为数组的偏移地址
;数组已满,则DH返回错误码6
;越界,则DH返回错误码5
ARR_INS PROC
    PUSHF
    PUSH CX
    PUSH BP
    PUSH DI
    
    MOV BP,[SI+2]
    CMP BP,[SI]
    JB ARR_INS_1
    MOV DH,6
    JMP ARR_INS_END
ARR_INS_1:
    
    CMP BX,BP
    JBE ARR_INS_2
    MOV DH,5
    JMP ARR_INS_END
ARR_INS_2:
    
    MOV CX,BP
    SUB CX,BX
    INC BP
    MOV [SI+2],BP
    DEC BP
    SHL BP,1
    CMP CX,0
    JE ARR_INS_4
ARR_INS_3:
    SUB BP,2
    MOV DI,DS:[SI+4+BP]
    MOV DS:[SI+6+BP],DI
    LOOP ARR_INS_3
ARR_INS_4:
    MOV DS:[SI+4+BP],AX
    MOV DH,0
    
ARR_INS_END:
    POP DI
    POP BP
    POP CX
    POPF
    RET
ARR_INS ENDP
;-------------------

;-------------------
;删除下标为AX的值
;删除的值由AX返回
;SI为数组的偏移地址
;越界,则DH返回错误码5
ARR_DEL PROC
    PUSHF
    PUSH BX
    PUSH CX
    
    CMP AX,[SI+2]
    JB ARR_DEL_1
    MOV DH,5
    JMP ARR_DEL_END
    
ARR_DEL_1:
    MOV CX,[SI+2]
    DEC CX
    MOV [SI+2],CX
    SUB CX,AX
    
    MOV BX,AX
    SHL BX,1
    MOV AX,[SI+4+BX]
    
    CMP CX,0
    JE ARR_DEL_3
    PUSH DX
ARR_DEL_2:
    MOV DX,[SI+6+BX]
    MOV [SI+4+BX],DX
    ADD BX,2
    LOOP ARR_DEL_2
    POP DX
ARR_DEL_3:
    MOV DH,0
    
ARR_DEL_END:
    POP CX
    POP BX
    POPF
    RET
ARR_DEL ENDP
;-------------------

;-------------------
;数组逆置
;SI为数组的偏移地址
ARR_REV PROC
    PUSHF
    PUSH AX
    PUSH BX
    PUSH BP
    
    MOV BX,[SI+2]
    CMP BX,1
    JBE ARR_REV_END
    
    DEC BX
    SHL BX,1
    ADD BX,4
    ADD BX,SI
    MOV BP,4
    ADD BP,SI
ARR_REV_1:
    CMP BP,BX
    JAE ARR_REV_END
    MOV AX,DS:[BP]
    XCHG DS:[BX],AX
    MOV DS:[BP],AX
    ADD BP,2
    SUB BX,2
    JMP ARR_REV_1
    
ARR_REV_END: 
    POP BP
    POP BX
    POP AX
    POPF
    RET
ARR_REV ENDP
;-------------------

;-------------------
;数组非递减排序
;SI为数组的偏移地址
ARR_SORT PROC
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
    
    MOV CX,[SI+2]
    CMP CX,1
    JBE ARR_SORT_END
    
    DEC CX
ARR_SORT_1:
    MOV DX,0
    MOV BX,0
ARR_SORT_2:
    CMP DX,CX
    JE ARR_SORT_3
    MOV AX,[SI+4+BX]
    CMP AX,[SI+6+BX]
    JBE ARR_SORT_4
    XCHG AX,[SI+6+BX]
    MOV [SI+4+BX],AX
ARR_SORT_4:
    INC DX
    ADD BX,2
    JMP ARR_SORT_2
ARR_SORT_3:
    LOOP ARR_SORT_1
    
ARR_SORT_END:
    POP DX
    POP CX
    POP BX
    POP AX
    RET
ARR_SORT ENDP
;-------------------

;-------------------
;根据错误码输出提示信息
;错误码由DH输入
ARR_ERR PROC
    PUSHF
    PUSH AX
    PUSH DX
    
    CMP DH,0
    JE ARR_ERR_END
    
    CMP DH,5
    JNE ARR_ERR_5
    MOV DX,OFFSET ARR_ERR_T5
    JMP ARR_ERR_PRT
ARR_ERR_5:
    CMP DH,6
    JNE ARR_ERR_6
    MOV DX,OFFSET ARR_ERR_T6
    JMP ARR_ERR_PRT
ARR_ERR_6:
    
ARR_ERR_PRT:
    PUSH DS
    MOV AX,CS
    MOV DS,AX
    MOV AH,09H
    INT 21H
    POP DS
    
ARR_ERR_END:
    POP DX
    POP AX
    POPF
    RET
    
    ARR_ERR_T5 DB 'Err: invalid index!',10,13,36
    ARR_ERR_T6 DB 'Err: array is full!',10,13,36

ARR_ERR ENDP
;-------------------

;-------------------
;输出数组内容
;SI为数组的偏移地址
ARR_PRINT PROC
    PUSHF
    PUSH AX
    PUSH BX
    PUSH CX
    
    MOV CX,[SI+2]
    MOV BX,0
ARR_PRINT_1:
    MOV AX,[SI+4+BX]
    ;---------------
    CALL PRINT_DEC
    CALL SPACE
    ;---------------
    ADD BX,2
    LOOP ARR_PRINT_1
    
    POP CX
    POP BX
    POP AX
    POPF
    RET
ARR_PRINT ENDP
;-------------------

你可能感兴趣的:(汇编)