Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2018, 20:38   #1
Bartimeus777
 
Регистрация: 25.03.2018
Сообщений: 3
По умолчанию Отсортировать введенную строку из чисел в порядке возрастания. Не до конца понимаю работу приведенной программы

Код:
.model small
.stack 100h

.data
MaxLen db 254     ; Буфер строки формата функции 0ah int 21h
Len db ?          
String db 254 dup(?)
NL db 13,10,'$'   ; Перевд строки


.code
; Процедура сортировки
; SI = указатель на начало стоки, терминированной 0dh
sort proc
cld               ; Направление сканирования - вперёд
mov di,si         ; Сортировка выбором - заполнение с начала
m1:cmp byte ptr[di],0dh    ; Внешний цикл, проверка окончания строки
   je FinSort
   mov ah,[di]             ; Инициализация минимума
   mov dx,di               ; и его индекса
   mov si,di               ; Инициализаци внутреннего цикла
   inc si
   m2:cmp byte ptr[si],0dh	 ; Поиск минимального из неотсортированных элементов
      je Next              ; Дошли до конца строки - прекратить поиск
      lodsb                ; Загрузка очередного символа
      cmp al,ah            ; Сравнение с минимумом
      jnb m2               ; Меньше - обновить минимум и его индекс
      mov ah,al
      mov dx,si
      dec dx
      jmp m2
   Next:                   ; Обмен ведущего и минимального элемента
   mov al,[di]
   xchg al,ah
   stosb                   ; Запись отсортированного (минимального) элемента
   mov si,dx               ; Запись ведущего элемента на место минимума
   mov [si],ah
   jmp m1                  ; Искать следующий минимум из оставшихся
FinSort:ret
endp


; Основная программа
start:
mov ax,@data
mov ds,ax
mov es,ax



mov ah,0ah      ; Ввод строки
lea dx,MaxLen
int 21h
lea dx,NL       ; Переход на новую строку
mov ah,9
int 21h

lea si,String   ; Сортировка
call sort

xor bh,bh       ; Замена терминатора с 0dh на $
mov bl,Len
lea si,String
mov byte ptr[bx+si+1],'$'
mov ah,9        ; Вывод результата
lea dx,String
int 21h
    
xor ah,ah       ; Ожидание нажатия клавиши
int 16h
mov ax, 4c00h   ; Завершение программы
int 21h    
end start
После строк lea si,String / call sort происходит сортировка введенной строки. Но в String ведь на момент lea si,String лишь 254 знака ?. А сортировка происходит с введенной строкой mov ah,0ah / lea dx,MaxLen / int 21h и теперь эта введенная строка в MaxLen. Как эта строка попадает в сортировку(sort)?
Вложения
Тип файла: txt StrSort.txt (1.9 Кб, 139 просмотров)

Последний раз редактировалось Bartimeus777; 05.05.2018 в 20:46. Причина: Не тот файл
Bartimeus777 вне форума Ответить с цитированием
Старый 05.05.2018, 21:04   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от Bartimeus777 Посмотреть сообщение
Но в String ведь на момент lea si,String лишь 254 знака ?
Зарезервировано для...

Цитата:
Сообщение от Bartimeus777 Посмотреть сообщение
А сортировка происходит с введенной строкой mov ah,0ah / lea dx,MaxLen / int 21h и теперь эта введенная строка в MaxLen. Как эта строка попадает в сортировку(sort)?
Может стоит почитать офф документацию по функции прежде чем лезьт в асм?
10я функция
принимает адрес буфера, первый элемент которого задает максимальное кол-во сиволов
меняет буфер следущим образом - макс. элементов остается, размер введенного, введенные символы и возврат каретки
Итого, в результате просто заполнятся переменные
Код:
Len db ?          
String db 254 dup(?)
И да, строка не в MaxLen, как вы написали, даже название говорит что это не для этого.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание программы в ДЕЛФИ (Листинг содержимого папки, привязка программы к папкам) Staziah2 Общие вопросы Delphi 8 19.03.2015 13:07
Как посмотреть работу программы в режиме командной строки moreman Помощь студентам 21 24.02.2015 17:08
Обрезать пробелы в строке с начала строки и с конца строки (C++) tema65 Помощь студентам 6 28.12.2011 13:24
Чтение содержимого страницы происходит не до конца SpaceIQ Общие вопросы .NET 0 26.04.2010 16:33
Нужен скрипт сохранения введенной строки valeraB JavaScript, Ajax 3 23.10.2008 14:15