Д. Программа
;-----------------CODE-----------------
CODESG SEGMENT PARA 'CODE'
BEGIN PROC FAR
ASSUME CS: CODESG, SS: STACKSG, DS: DATASG, ES: DATASG
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, DATASG
MOV DS, AX
MOV ES, AX
; input message: enter c
MOV AX, 0900H
LEA DX, MESSAGE1
INT 21H
; input c
CALL INPUT_NUMBER
MOV AX, BIN_VALUE
MOV NUMBER_C, AX
CALL COUT_ENDL
; input message: enter d
MOV AX, 0900H
LEA DX, MESSAGE2
INT 21H
; input d
CALL INPUT_NUMBER
MOV AX, BIN_VALUE
MOV NUMBER_D, AX
CALL COUT_ENDL
; input message: enter array
MOV AX, 0900H
LEA DX, MESSAGE_ARR
INT 21H
CALL COUT_ENDL
MOV CX, bN ; 5
XOR BX, BX
INP:
CALL INPUT_NUMBER
MOV AX, BIN_VALUE
CALL COUT_ENDL
MOV NUMBERS[BX], AX
INC BX
INC BX
LOOP INP
MOV CX, bN
CALL LAB4
MOV BIN_VALUE, DX
CALL BIN_TO_ASCII
MOV AX, 0900H
LEA DX, RESULT
INT 21H
EXIT:
MOV AX, 4C00H
INT 21H
RET
BEGIN ENDP
LAB4 PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI
XOR BX, BX
XOR DX, DX
DO:
MOV AX, NUMBERS[BX]
CMP AX, NUMBER_C
JL NXT
CMP AX, NUMBER_D
JG NXT
CMP AX, 0
JL NXT
INC DX
NXT:
INC BX
INC BX
LOOP DO
POP DI
POP SI
POP CX
POP BX
POP AX
RET
LAB4 ENDP
COUT_ENDL PROC NEAR
PUSH AX
PUSH DX
MOV AH, 09
LEA DX, ENDLINE
INT 21H
POP DX
POP AX
RET
COUT_ENDL ENDP
INPUT_NUMBER PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
JMP NORMAL
MESSAGE_ERROR_LABEL:
CALL COUT_ENDL
MOV AX, 0900H
LEA DX, INPUT_ERROR_MESSAGE
INT 21H
NORMAL:
MOV MULT10, 1
MOV BIN_VALUE, 0
MOV AX, 0A00H
LEA DX, IPARAM
INT 21H
LEA SI, FIELD - 1
MOV BH, 0
MOV BL, ASCLEN
CALL IS_NUMBER
JNZ MESSAGE_ERROR_LABEL
CALL ASCII_TO_BIN
POP SI
POP DI
POP DX
POP CX
POP BX
POP AX
RET
INPUT_NUMBER ENDP
ASCII_TO_BIN PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
MOV CX, 10
MOV DX, BX ; SAVE LEN TO DX
MOV BX, 1
MOV AL, [SI + BX]
MOV BX, DX
XOR DX, DX
MOV DI, BX ; DI = BX
CMP AL, '-' ; AL IS MINUS?
JNE B20 ; NO
DEC DI ; YES
B20:
MOV AL, [SI + BX]
AND AX, 000FH
MUL MULT10
ADD BIN_VALUE, AX
MOV AX, MULT10
MUL CX
MOV MULT10, AX
DEC BX
DEC DI
JNZ B20
CMP BX, DI ; IF BX == DI
JE END_B ; NO MINUS
; ELSE MINUS:
MOV AX, BIN_VALUE
NEG AX
MOV BIN_VALUE, AX
END_B:
POP SI
POP DI
POP DX
POP CX
POP BX
POP AX
RET
ASCII_TO_BIN ENDP
IS_NUMBER PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
PUSH SI
MOV CX, BX ; SAVE LEN IN CX
MOV BX, 1 ; BX = 1
MOV AL, [SI + BX] ; AL = (CHAR)
CMP AL, '-' ; AL IS MINUS?
MOV BX, CX ; LEN IN BX
; NO - JUMP
JNE IS_NUM
; YES:
DEC CX
IS_NUM:
MOV AL, [SI + BX]
CMP AL, '0'
JB ERROR_N
CMP AL, '9'
JA ERROR_N
DEC BX
DEC CX
JNZ IS_NUM
JMP BRANCHI
ERROR_N:
STC
BRANCHI:
POP SI
POP DI
POP DX
POP CX
POP BX
POP AX
RET
IS_NUMBER ENDP
BIN_TO_ASCII PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MOV CX, 0010
LEA SI, RESULT + 5
MOV AX, BIN_VALUE
MOV BX, AX
AND BX, 8000H
CMP BX, 8000H
JB C20
MOV BX, AX
MOV AX, 65535
SUB AX, BX
ADD AX, 1
MOV BX, 1
C20:
CMP AX, 0010
JB C30
XOR DX, DX
DIV CX
OR DL, 30H
MOV [SI], DL
DEC SI
JMP C20
C30:
OR AL, 30H
MOV [SI], AL
CMP BX, 1
JE ADDMINUS
JMP RETFUNC
ADDMINUS:
DEC SI
MOV AL, '-'
MOV [SI], AL
RETFUNC:
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
BIN_TO_ASCII ENDP
CODESG ENDS
;---------------END CODE---------------
;-----------------STACK-----------------
STACKSG SEGMENT PARA STACK 'STACK'
DW 32 DUP(?)
STACKSG ENDS
;---------------END STACK---------------
;-----------------DATA-----------------
DATASG SEGMENT PARA 'DATA'
INPUT_ERROR_MESSAGE DB 'INCORRECT. $'
bN DW 5 ; Количество чисел
NUMBER_C DW 0
NUMBER_D DW 0
MESSAGE1 DB 'ENTER C: $'
MESSAGE2 DB 'ENTER D: $'
MESSAGE_ARR DB 'ENTER 5 ELEMENTS: $'
NUMBERS DW 5 DUP(0)
IPARAM LABEL BYTE
MAXLEN DB 20
ASCLEN DB ?
FIELD DB 20 DUP (' ')
MULT10 DW 1
BIN_VALUE DW 0
ENDLINE DB 13, 10, '$'
RESULT DB ' $'
DATASG ENDS
;---------------END DATA---------------
END BEGIN