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

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

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

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

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

textual
Листинг программы
.model tiny
.286
.code
org 100h
 
Start:
 
  cld  ; прямой порядок чтения/записи
 
  mov ah,0Ah
  mov dx,offset StringBuf
  int 21h  ; ввод данных
 
  mov ah,2
  mov dl,10
  int 21h  ; переводим строку
 
  mov si,offset String  ; откуда читать
  mov bx,32767  ; минимальное число
  mov di,si  ; позиция минимального числа
@@nextnum:
  mov bp,si  ; позиция текущего числа
  call StrToInt  ; читаем число, преобразуя в целое (dx)
  cmp dx,bx  ; прочитанное число меньше минимального?
  jge @@notless  ; нет, переходим
  mov bx,dx  ; bx = минимальное число
  mov di,bp  ; di = позиция минимального числа
@@notless:
  cmp al,13
  jne @@nextnum  ; переходим к следующему, если последний прочитанный символ - не CR (Enter)
 
  mov cx,si
  push cx
  mov si,di  ; возвращаемся к минимальному числу
  call StrToInt  ; пропускаем его
  pop cx
  sub cx,si
  dec cx  ; получаем размер копируемой области
  js @@nocopy  ; не копируем, если число отрицательное (пустая строка или это последнее число)
  rep movsb  ; сдвигаем строку
@@nocopy:
  mov al,'$'
  stosb  ; записываем '$' (символ конца строки)
 
  mov ah,9
  mov dx,offset String
  int 21h  ; выводим строку
 
@@waitkey:
  xor ah,ah
  int 16h  ; ждём нажатия клавиши
  cmp al,27
  jnz @@waitkey  ; повторяем, если не Esc
 
  int 20h  ; выходим
 
StrToInt proc
  xor dx,dx  ; результат, пока = 0
  xor cx,cx  ; знак (0-нет, 1-есть)
  lodsb  ; читаем первый символ
  cbw  ; ah = 0 (даже если al >= 80h и будет ah=0FFh, это не страшно, т.к. в этом случае будет выход при проверке корректности цифры)
  cmp al,'-'
  jne @@nominus ; переход, если первый символ не минус
  inc cx  ; иначе cx = 1 (знак есть)
@@nextchar:
  lodsb  ; читаем символ
@@nominus:
  cmp al,'0'
  jb @@wrongdigit  ; неверный символ, заканчиваем
  cmp al,'9'
  ja @@wrongdigit  ; неверный символ, заканчиваем
  sub al,'0'
  imul dx,dx,10  ; dx = dx*10
  add dx,ax  ; dx = dx+ax (у нас уже ah=0, см. выше cbw)
;  cmp dx,3277
;  jb @@nextchar  ; продолжаем, если число меньше 3277 (защита от переполнения)
  jmp @@nextchar  ; продолжаем без учёта переполнения
@@wrongdigit:
  jcxz @@posnum  ; переход, если знака нет
  neg dx  ; меняем знак
@@posnum:
; результат в dx
; в al последний прочитанный символ
  ret
StrToInt endp
 
StringBuf db 80,?
String db 80 dup (?)  ; буфер на 79 символов для ввода
 
end Start

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

15   голосов , оценка 4.133 из 5
Похожие ответы