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