Сортировка массива слов по возрастанию - Assembler

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

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

Разработать подпрограмму, которая преобразовывает заданное целое двоичное число в символьную строку. Написать программу, которая сортирует массив слов по возрастанию, формирует и выводит на экран строку с числовыми значениями элементов отсортированного массива-сделайте пожалуйста народ!!

Решение задачи: «Сортировка массива слов по возрастанию»

textual
Листинг программы
  1. LOCALS
  2. .model small
  3. .stack 256
  4. .data
  5.         ;сообщения программы
  6.         MsgBeforeSort   db      'Before sort:', 0Dh, 0Ah, '$'
  7.         MsgAfterSort    db      'After sort:', 0Dh, 0Ah, '$'
  8.         CrLf            db      0Dh, 0Ah, '$'
  9.         ;вспомогательные переменные
  10.         A               dw      777, 555, 123, 654, 841, 999, 645, 907
  11.         Len             dw      ($-A)/2
  12.         String          db      16 dup(0), '$'
  13. .code
  14.  
  15. main    proc
  16.         mov     ax,     @data
  17.         mov     ds,     ax
  18.  
  19.         mov     ah,     09h
  20.         lea     dx,     MsgBeforeSort
  21.         int     21h
  22.         mov     cx,     Len
  23.         lea     dx,     A
  24.         call    ShowArray
  25.         mov     ah,     09h
  26.         lea     dx,     CrLf
  27.         int     21h
  28.  
  29.         mov     cx,     Len
  30.         lea     si,     A
  31.         call    Sort
  32.         ;вывод
  33.         mov     ah,     09h
  34.         lea     dx,     MsgAfterSort
  35.         int     21h
  36.         mov     cx,     Len
  37.         lea     dx,     A
  38.         call    ShowArray
  39.         mov     ah,     09h
  40.         lea     dx,     CrLf
  41.         int     21h
  42.  
  43.         mov     ax,     4C00h
  44.         int 21h
  45. main    endp
  46.  
  47. ;Сортировка массива слов по неубыванию
  48. ;методом "пузырька"
  49. ;вход:
  50. ; ds:si - адрес массива ключей сортировки
  51. ; cx    - длина массива
  52. Sort    proc
  53.         push    bp
  54.         mov     bp,     sp
  55.         sub     sp,     4
  56.         push    ax
  57.         push    bx
  58.         push    cx
  59.         push    dx
  60.         push    si
  61.         push    di
  62.         ;проверка массива на длину более 1 элемента
  63.         cmp     cx,     1
  64.         jbe     @@End
  65.         ;dx - адрес (смещение) последнего элемента
  66.         mov     dx,     cx      ;dx - адрес (смещение) последнего элемента
  67.         dec     dx
  68.         shl     dx,     1       ;приведение dx - к размерности элемента массива
  69.  
  70.         mov     bx,     si      ;сортировка по массиву ключей
  71.         dec     cx              ;for i:=1 to N-1 do
  72.         mov     si,     0
  73. @@ForI:
  74.         mov     di,     dx      ;  for j:=N downto i+1
  75. @@ForJ:
  76.         mov     ax,     [bx+di] ;    if A[j]<A[j-1] then
  77.         cmp     ax,     [bx+di-2]
  78.         jae     @@Skip
  79.         ;обмен элементов массива
  80.         xchg    ax,     [bx+di-2];     swap(A[j], A[j-1]);
  81.         mov     [bx+di],ax
  82. @@Skip:
  83.         sub     di,     2
  84.         cmp     di,     si
  85.         ja      @@ForJ
  86.  
  87.         add     si,     2
  88.         loop    @@ForI
  89.  
  90. @@End:
  91.         pop     di
  92.         pop     si
  93.         pop     dx
  94.         pop     cx
  95.         pop     bx
  96.         pop     ax
  97.         mov     sp,     bp
  98.         pop     bp
  99.         ret
  100. Sort    endp
  101.  
  102. ;Вывод массива
  103. ;cx - количество вводимых элементов
  104. ;ds:dx - адрес массива
  105. ShowArray       proc
  106.         push    ax
  107.         push    bx
  108.         push    cx
  109.         push    dx
  110.         push    si
  111.         push    di
  112.  
  113.         jcxz    @@Exit          ;если массив пустой - завершить
  114.  
  115.         mov     si,     1       ;индекс элемента массива
  116.         mov     di,     dx      ;адрес текущего элемента массива
  117.         @@ForI:
  118.                 mov     ax,     [di]
  119.                 push    ax
  120.                 push    dx
  121.                 lea     dx,     String
  122.                 call    WordToBinStr
  123.                 mov     ah,     09h
  124.                 lea     dx,     String
  125.                 int     21h
  126.                 mov     ah,     09h
  127.                 mov     dl,     CrLf
  128.                 int     21h
  129.                 pop     dx
  130.                 pop     ax
  131.                 ;переход к следующему элементу
  132.                 inc     si
  133.                 add     di,     2
  134.         loop    @@ForI
  135. @@Exit:
  136.         pop     di
  137.         pop     si
  138.         pop     dx
  139.         pop     cx
  140.         pop     bx
  141.         pop     ax
  142.         ret
  143. ShowArray       endp
  144.  
  145. ; выводит число из регистра AX на экран
  146. ; входные данные:
  147. ; ax - число для отображения
  148. ; ds:dx - адрес строки для сохранения результата
  149. WordToBinStr    proc
  150.         push    ax
  151.         push    bx
  152.         push    cx
  153.         push    dx
  154.         push    di
  155.  
  156.         mov     cx,     16
  157.         mov     si,     dx
  158. @@For:
  159.         mov     bl,     '0'
  160.         shl     ax,     1
  161.         adc     bl,     0
  162.         mov     [si],   bl
  163.         inc     si
  164.         loop    @@For
  165.  
  166.         pop     di
  167.         pop     dx
  168.         pop     cx
  169.         pop     bx
  170.         pop     ax
  171.         ret
  172. WordToBinStr    endp
  173.  
  174. end     main

Объяснение кода листинга программы

  1. Создание локальных переменных:
    • MsgBeforeSort: 'Before sort:', 0Dh, 0Ah, '$'
    • MsgAfterSort: 'After sort:', 0Dh, 0Ah, '$'
    • CrLf: 0Dh, 0Ah, '$'
    • A: dw 777, 555, 123, 654, 841, 999, 645, 907
    • Len: dw ($-A)/2
    • String: db 16 dup(0), '$'
  2. Определение процедуры main:
    • Переменная ax инициализируется значением @data
    • Переменная ds присваивается значение ax
    • Отображение сообщения Before sort:
    • Вызов процедуры ShowArray для отображения массива перед сортировкой
    • Отображение символа новой строки
    • Вызов процедуры Sort для сортировки массива A
    • Отображение сообщения After sort:
    • Вызов процедуры ShowArray для отображения отсортированного массива
    • Отображение символа новой строки
    • Выход из программы
  3. Определение процедуры Sort для сортировки массива методом пузырька:
    • Проверка на длину массива
    • Итерация для сравнения элементов и их обмена в случае необходимости
  4. Определение процедуры ShowArray для отображения массива:
    • Проверка на наличие элементов в массиве
    • Итерация для отображения каждого элемента массива
    • Преобразование чисел в строку и вывод на экран
  5. Определение процедуры WordToBinStr для преобразования числа в строку:
    • Преобразование числа в двоичное представление
    • Сохранение результатов в адресной строке
  6. Конец программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

5   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы