Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Запрашивает строку из положительных целых чисел < 65536, разделенных пробелами
- ;Длина строки <= 80
- ;Находит и выводит на экран меньшее число
- ;Выводит ошибку, если ни одно из введенных чисел не может быть обработано
- model SMALL
- stack 100h
- ;Данные
- dataseg
- ;алиасы для значения булеанов
- FALSE equ 0
- TRUE equ 255
- ASK db 0Ah, 0Dh, 'Input:', '$' ;строка запрос ввода
- ERRSTR db 0Ah, 0Dh, 'No valid input', '$' ;строка ошибки
- INPSTR db 80, 0, 82 dup( ? ) ;вводимая строка строка
- OUTSTR db 0Ah, 0Dh, 5 dup( ? ), '$' ;выводимая строка
- LEN dw 80 ;длина ввода
- SHIFT dw 6 ;сдвиг до конца записываемых символов в выводимой строке
- MIN dw 0ffffh ;минимальное число
- ISEMPTY db TRUE ;флаг того, что текущее число не является пустым
- WASSET db FALSE ;флаг того, что хотя бы одно число было записано в MIN
- codeseg
- startupcode
- ;Ввод строки
- START:
- lea DX, ASK
- mov AH, 09h
- int 21h
- lea DX, INPSTR
- mov AH, 0Ah
- int 21h
- ;Обработка
- xor DX, DX
- xor AX, AX
- lea BX, INPSTR+2
- CONVERT:
- ;заносим символ в регистр
- mov DX, [BX]
- ;обнуляем второй байт DX
- xor DH, DH
- ;проверка символа конца строки
- cmp DX, '$'
- jz ENDCHECK
- ;проверка на пробел
- cmp DX, ' '
- jz CHECK
- ;проверка на цифру
- cmp DX, '0'
- jb ITER
- cmp DX, '9'
- ja ITER
- ;перевод в 16-ю систему
- sub DX, '0'
- ;умножение текущего числа на 10
- ;x*10 = x*(2^3) + x*(2^1) = (x << 3) + (x << 1)
- mov CX, AX
- sal CX, 1
- jc SKIP
- sal AX, 3
- jc SKIP
- add AX, CX
- jc SKIP
- ;добавление цифры к числу
- add AX, DX
- jc SKIP
- and ISEMPTY, FALSE
- ;итерация
- ITER:
- inc BX
- cmp BX, LEN ;доп. проверка итератора
- jnz CONVERT
- jmp ENDCHECK
- ;проверка минимального числа
- CHECK:
- ;проверяем, пустое ли число
- cmp ISEMPTY, TRUE
- jz NEXT
- ;сравниваем текущее число с минимальным
- cmp AX, MIN
- jae NEXT
- ;запоминаем минимальное число
- mov MIN, AX
- or WASSET, TRUE
- ;ресет текущего числа
- NEXT:
- or ISEMPTY, TRUE
- xor AX, AX
- jmp ITER
- ;пропуск символов до пробела
- ;или до конца строки
- SKIP:
- mov DX, [BX]
- xor DH, DH
- cmp DX, ' '
- jz NEXT
- cmp DX, '$'
- jz OUTPUT
- inc BX
- cmp BX, LEN
- jnz SKIP
- jmp OUTPUT
- ;проверка на минимальность
- ;по окончании итерации
- ENDCHECK:
- ;проверяем, пустое ли число
- cmp ISEMPTY, TRUE
- jz OUTPUT
- ;сравниваем текущее число с минимальным
- cmp AX, MIN
- jae OUTPUT
- ;запоминаем минимальное число
- mov MIN, AX
- or WASSET, TRUE
- ;Вывод результатов
- OUTPUT:
- ;проверка того, что хотя бы одно число было введено
- cmp WASSET, FALSE
- jz OUTERROR
- ;константы для форматирования вывода
- mov CX, 10
- mov AX, MIN
- mov BX, SHIFT
- DECONVERT:
- ;перевод в 10-ю систему
- ;делим AX, частное идет в AX, остаток - в DX
- mov DX, 0
- div CX
- ;перевод в символ и сохранение в строке
- add DL, '0'
- mov OUTSTR[BX], DL
- ;проверка оставшегося числа и итерация
- dec BX
- cmp AX, 0
- jnz DECONVERT
- ;вывод сформированной строки
- lea DX, OUTSTR
- mov AH, 09h
- int 21h
- jmp QUIT
- ;вывод ошибки об отстутствии корректных данных
- OUTERROR:
- lea DX, ERRSTR
- mov AH, 09h
- int 21h
- ;Конец работы
- QUIT: exitcode 0
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement