Advertisement
Guest User

Untitled

a guest
Mar 14th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;Запрашивает строку из положительных целых чисел < 65536, разделенных пробелами
  2. ;Длина строки <= 80
  3. ;Находит и выводит на экран меньшее число
  4. ;Выводит ошибку, если ни одно из введенных чисел не может быть обработано
  5.  
  6.         model  SMALL
  7.         stack  100h
  8.  
  9. ;Данные
  10.         dataseg
  11. ;алиасы для значения булеанов
  12. FALSE   equ 0
  13. TRUE    equ 255
  14.  
  15. ASK     db 0Ah, 0Dh, 'Input:', '$'          ;строка запрос ввода  
  16. ERRSTR  db 0Ah, 0Dh, 'No valid input', '$'  ;строка ошибки    
  17. INPSTR  db 80, 0, 82 dup( ? )               ;вводимая строка строка
  18. OUTSTR  db 0Ah, 0Dh, 5 dup( ? ), '$'        ;выводимая строка
  19.  
  20. LEN     dw 80       ;длина ввода
  21. SHIFT   dw 6        ;сдвиг до конца записываемых символов в выводимой строке
  22. MIN     dw 0ffffh   ;минимальное число
  23. ISEMPTY db TRUE     ;флаг того, что текущее число не является пустым
  24. WASSET  db FALSE    ;флаг того, что хотя бы одно число было записано в MIN
  25.  
  26.         codeseg
  27.         startupcode
  28.  
  29. ;Ввод строки
  30. START:
  31.         lea DX, ASK
  32.         mov AH, 09h
  33.         int 21h
  34.         lea DX, INPSTR
  35.         mov AH, 0Ah
  36.         int 21h
  37.  
  38. ;Обработка
  39.         xor DX, DX
  40.         xor AX, AX
  41.         lea BX, INPSTR+2
  42.  
  43. CONVERT:
  44. ;заносим символ в регистр
  45.         mov DX, [BX]
  46. ;обнуляем второй байт DX
  47.         xor DH, DH  
  48.  
  49. ;проверка символа конца строки
  50.         cmp DX, '$'
  51.         jz  ENDCHECK
  52. ;проверка на пробел  
  53.         cmp DX, ' '
  54.         jz  CHECK
  55. ;проверка на цифру
  56.         cmp DX, '0'      
  57.         jb  ITER        
  58.         cmp DX, '9'      
  59.         ja  ITER      
  60.  
  61. ;перевод в 16-ю систему
  62.         sub DX, '0'
  63.  
  64. ;умножение текущего числа на 10
  65. ;x*10 = x*(2^3) + x*(2^1) = (x << 3) + (x << 1)
  66.         mov CX, AX
  67.         sal CX, 1
  68.         jc  SKIP
  69.         sal AX, 3
  70.         jc  SKIP  
  71.         add AX, CX
  72.         jc  SKIP  
  73.  
  74. ;добавление цифры к числу
  75.         add AX, DX
  76.         jc  SKIP
  77.         and ISEMPTY, FALSE
  78.  
  79. ;итерация
  80. ITER:  
  81.         inc BX  
  82.         cmp BX, LEN ;доп. проверка итератора
  83.         jnz CONVERT
  84.         jmp ENDCHECK
  85.  
  86. ;проверка минимального числа
  87. CHECK:  
  88. ;проверяем, пустое ли число
  89.         cmp ISEMPTY, TRUE
  90.         jz  NEXT
  91. ;сравниваем текущее число с минимальным
  92.         cmp AX, MIN
  93.         jae NEXT
  94. ;запоминаем минимальное число
  95.         mov MIN, AX
  96.         or  WASSET, TRUE
  97.  
  98. ;ресет текущего числа
  99. NEXT:  
  100.         or ISEMPTY, TRUE
  101.         xor AX, AX
  102.         jmp ITER
  103.  
  104. ;пропуск символов до пробела
  105. ;или до конца строки
  106. SKIP:  
  107.         mov DX, [BX]
  108.         xor DH, DH  
  109.         cmp DX, ' '
  110.         jz  NEXT
  111.         cmp DX, '$'
  112.         jz  OUTPUT
  113.         inc BX
  114.         cmp BX, LEN
  115.         jnz SKIP
  116.         jmp OUTPUT
  117.  
  118. ;проверка на минимальность
  119. ;по окончании итерации
  120. ENDCHECK:
  121. ;проверяем, пустое ли число
  122.         cmp ISEMPTY, TRUE
  123.         jz  OUTPUT
  124. ;сравниваем текущее число с минимальным
  125.         cmp AX, MIN
  126.         jae OUTPUT
  127. ;запоминаем минимальное число
  128.         mov MIN, AX
  129.         or  WASSET, TRUE
  130.  
  131.  
  132. ;Вывод результатов
  133. OUTPUT:
  134. ;проверка того, что хотя бы одно число было введено
  135.         cmp WASSET, FALSE
  136.         jz  OUTERROR
  137. ;константы для форматирования вывода
  138.         mov CX, 10
  139.         mov AX, MIN
  140.         mov BX, SHIFT
  141.  
  142. DECONVERT:
  143. ;перевод в 10-ю систему
  144. ;делим AX, частное идет в AX, остаток - в DX
  145.         mov DX, 0        
  146.         div CX
  147.  
  148. ;перевод в символ и сохранение в строке
  149.         add DL, '0'
  150.         mov OUTSTR[BX], DL
  151.  
  152. ;проверка оставшегося числа и итерация
  153.         dec BX
  154.         cmp AX, 0
  155.         jnz DECONVERT
  156.  
  157. ;вывод сформированной строки
  158.         lea DX, OUTSTR
  159.         mov AH, 09h
  160.         int 21h
  161.         jmp QUIT
  162.  
  163. ;вывод ошибки об отстутствии корректных данных
  164. OUTERROR:
  165.         lea DX, ERRSTR
  166.         mov AH, 09h
  167.         int 21h
  168.  
  169.  
  170. ;Конец работы
  171. QUIT:   exitcode  0
  172.         end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement