На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> Отсортировать введенную строку из чисел в порядке возрастания , Не до конца понимаю работу приведенной программы
    ExpandedWrap disabled
      .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)?
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,1774 ]   [ 15 queries used ]   [ Generated: 19.04.24, 23:14 GMT ]