Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DATA SEGMENT
- msg_input DB "Enter value (from -32768 to 65488): $" ; Повідомлення для введення числа
- input_buffer DB 7,?, 7 DUP (" ") ; Буфер для введення даних
- msg_output DB "Result (input value + 47): $" ; Повідомлення для виводу результату
- newline DB 0Dh,0Ah,"$" ; Символ нового рядка
- msg_error DB "Invalid input!$" ; Повідомлення про помилку
- msg_range_error DB "Value is out of range!$" ; Повідомлення про вихід за межі
- number DW ? ; Змінна для збереження числа
- is_negative DB 0 ; Флаг знаку (0 - додатне, 1 - від'ємне)
- DATA ENDS
- STACK_SEG SEGMENT PARA STACK "STACK"
- DB 64 DUP("STACK")
- STACK_SEG ENDS
- CODE SEGMENT
- ASSUME CS:CODE, DS:DATA, SS:STACK_SEG
- START:
- MOV AX, DATA
- MOV DS, AX
- CALL PRINT_PROMPT ; Вивід повідомлення для введення
- CALL VALIDATE_INPUT ; Перевірка коректності введеного числа
- MOV SI, OFFSET input_buffer + 2
- XOR BX, BX ; Обнуляємо BX для збереження числа
- XOR DX, DX ; Обнуляємо DX
- CLD ; Скидаємо прапор напрямку
- MOV is_negative, 0 ; Ініціалізуємо флаг знаку
- MOV AL, [SI]
- CMP AL, '-'
- JNE CONVERT_TO_NUMBER
- MOV is_negative, 1 ; Позначаємо число як від'ємне
- INC SI ; Пропускаємо знак мінус
- CONVERT_TO_NUMBER:
- MOV AL, [SI]
- CMP AL, '0'
- JB END_CONVERSION ; Якщо символ менший за '0', вихід
- CMP AL, '9'
- JA END_CONVERSION ; Якщо символ більший за '9', вихід
- SUB AL, '0' ; Перетворення ASCII в число
- MOV AH, 0
- PUSH AX
- MOV AX, BX
- MOV CX, 10
- MUL CX
- CMP DX, 0
- JNE OVERFLOW_ERROR ; Перевірка переповнення
- MOV BX, AX
- POP AX ; Відновлюємо цифру
- ADD BX, AX
- INC SI
- JMP CONVERT_TO_NUMBER
- OVERFLOW_ERROR:
- CALL PRINT_NEWLINE
- MOV DX, OFFSET msg_range_error
- MOV AH, 9
- INT 21h
- JMP START
- END_CONVERSION:
- MOV number, BX
- CMP is_negative, 1
- JNE ADD_OFFSET
- CALL CHECK_RANGE
- NEG number ; Робимо число від'ємним
- ADD_OFFSET:
- ADD number, 47 ; Додаємо зміщення
- JC OVERFLOW_ERROR
- CMP number, -1
- JLE PRINT_RESULT
- CALL RESET_SIGN_FLAG
- PRINT_RESULT:
- CALL PRINT_NEWLINE
- MOV DX, OFFSET msg_output
- MOV AH, 9
- INT 21h
- CMP is_negative, 0
- JNE PRINT_NEGATIVE
- CMP number, 0
- JAE PRINT_NUMBER
- PRINT_NEGATIVE:
- MOV DL, '-'
- MOV AH, 2
- INT 21h
- NEG number
- PRINT_NUMBER:
- MOV AX, number
- CALL DISPLAY_NUMBER
- MOV AH, 4Ch
- INT 21h
- RESET_SIGN_FLAG PROC
- MOV is_negative, 0
- RET
- RESET_SIGN_FLAG ENDP
- DISPLAY_NUMBER PROC
- PUSH number
- PUSH CX
- PUSH DX
- XOR CX, CX
- MOV number, 10
- TO_STRING:
- XOR DX, DX
- DIV number
- ADD DL, '0'
- PUSH DX
- INC CX
- TEST AX, AX
- JNZ TO_STRING
- PRINT_DIGITS:
- POP DX
- MOV AH, 2
- INT 21h
- LOOP PRINT_DIGITS
- POP DX
- POP CX
- POP number
- RET
- DISPLAY_NUMBER ENDP
- VALIDATE_INPUT PROC
- MOV SI, OFFSET input_buffer + 2
- MOV CL, [input_buffer + 1]
- MOV BL, 0
- MOV AL, [SI]
- CMP AL, '-'
- JNE CHECK_NUMBERS
- INC SI
- DEC CX
- JZ INPUT_ERROR
- CHECK_NUMBERS:
- MOV AL, [SI]
- CMP CX, 0
- JZ END_VALIDATION
- CHECK_LOOP:
- MOV AL, [SI]
- CMP AL, '0'
- JB INPUT_ERROR
- CMP AL, '9'
- JA INPUT_ERROR
- INC BL
- INC SI
- DEC CX
- JNZ CHECK_LOOP
- CMP BL, 0
- JZ INPUT_ERROR
- JMP END_VALIDATION
- INPUT_ERROR:
- MOV DX, OFFSET msg_error
- MOV AH, 9
- INT 21h
- JMP ERROR_EXIT
- ERROR_EXIT:
- JMP START
- END_VALIDATION:
- RET
- VALIDATE_INPUT ENDP
- CHECK_RANGE PROC
- MOV AX, number
- CMP is_negative, 0
- JB CHECK_POSITIVE_LIMITS
- CMP AX, -32768
- JA RANGE_ERROR
- CMP AX, 32721
- JG RANGE_ERROR
- RET
- CHECK_POSITIVE_LIMITS:
- CMP AX, 0
- JL RANGE_ERROR
- CMP AX, 65488
- JA RANGE_ERROR
- RET
- RANGE_ERROR:
- CALL PRINT_NEWLINE
- MOV DX, OFFSET msg_range_error
- MOV AH, 9
- INT 21h
- JMP START
- CHECK_RANGE ENDP
- PRINT_PROMPT PROC
- MOV DX, OFFSET msg_input
- MOV AH, 9
- INT 21h
- MOV DX, OFFSET input_buffer
- MOV AH, 10
- INT 21h
- RET
- PRINT_PROMPT ENDP
- PRINT_NEWLINE PROC
- MOV DX, OFFSET newline
- MOV AH, 9
- INT 21h
- RET
- PRINT_NEWLINE ENDP
- CODE ENDS
- END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement