Удалить из введенной строки чисел минимальное - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д