Удалить из введенной строки чисел минимальное - Assembler

Узнай цену своей работы

Формулировка задачи:

Удалить из введенной строки чисел минимальное. Числа разделяются пробелами. Завершение программы по нажатию клавиши "Esc". HELP PLEASE!)

Решение задачи: «Удалить из введенной строки чисел минимальное»

textual
Листинг программы
  1. .model tiny
  2. .286
  3. .code
  4. org 100h
  5.  
  6. Start:
  7.  
  8.   cld  ; прямой порядок чтения/записи
  9.  
  10.   mov ah,0Ah
  11.   mov dx,offset StringBuf
  12.   int 21h  ; ввод данных
  13.  
  14.   mov ah,2
  15.   mov dl,10
  16.   int 21h  ; переводим строку
  17.  
  18.   mov si,offset String  ; откуда читать
  19.   mov bx,32767  ; минимальное число
  20.   mov di,si  ; позиция минимального числа
  21. @@nextnum:
  22.   mov bp,si  ; позиция текущего числа
  23.   call StrToInt  ; читаем число, преобразуя в целое (dx)
  24.   cmp dx,bx  ; прочитанное число меньше минимального?
  25.   jge @@notless  ; нет, переходим
  26.   mov bx,dx  ; bx = минимальное число
  27.   mov di,bp  ; di = позиция минимального числа
  28. @@notless:
  29.   cmp al,13
  30.   jne @@nextnum  ; переходим к следующему, если последний прочитанный символ - не CR (Enter)
  31.  
  32.   mov cx,si
  33.   push cx
  34.   mov si,di  ; возвращаемся к минимальному числу
  35.   call StrToInt  ; пропускаем его
  36.   pop cx
  37.   sub cx,si
  38.   dec cx  ; получаем размер копируемой области
  39.   js @@nocopy  ; не копируем, если число отрицательное (пустая строка или это последнее число)
  40.   rep movsb  ; сдвигаем строку
  41. @@nocopy:
  42.   mov al,'$'
  43.   stosb  ; записываем '$' (символ конца строки)
  44.  
  45.   mov ah,9
  46.   mov dx,offset String
  47.   int 21h  ; выводим строку
  48.  
  49. @@waitkey:
  50.   xor ah,ah
  51.   int 16h  ; ждём нажатия клавиши
  52.   cmp al,27
  53.   jnz @@waitkey  ; повторяем, если не Esc
  54.  
  55.   int 20h  ; выходим
  56.  
  57. StrToInt proc
  58.   xor dx,dx  ; результат, пока = 0
  59.   xor cx,cx  ; знак (0-нет, 1-есть)
  60.   lodsb  ; читаем первый символ
  61.   cbw  ; ah = 0 (даже если al >= 80h и будет ah=0FFh, это не страшно, т.к. в этом случае будет выход при проверке корректности цифры)
  62.   cmp al,'-'
  63.   jne @@nominus ; переход, если первый символ не минус
  64.   inc cx  ; иначе cx = 1 (знак есть)
  65. @@nextchar:
  66.   lodsb  ; читаем символ
  67. @@nominus:
  68.   cmp al,'0'
  69.   jb @@wrongdigit  ; неверный символ, заканчиваем
  70.   cmp al,'9'
  71.   ja @@wrongdigit  ; неверный символ, заканчиваем
  72.   sub al,'0'
  73.   imul dx,dx,10  ; dx = dx*10
  74.   add dx,ax  ; dx = dx+ax нас уже ah=0, см. выше cbw)
  75. ;  cmp dx,3277
  76. ;  jb @@nextchar  ; продолжаем, если число меньше 3277 (защита от переполнения)
  77.   jmp @@nextchar  ; продолжаем без учёта переполнения
  78. @@wrongdigit:
  79.   jcxz @@posnum  ; переход, если знака нет
  80.   neg dx  ; меняем знак
  81. @@posnum:
  82. ; результат в dx
  83. ; в al последний прочитанный символ
  84.   ret
  85. StrToInt endp
  86.  
  87. StringBuf db 80,?
  88. String db 80 dup (?)  ; буфер на 79 символов для ввода
  89.  
  90. end Start

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы