Двоичная поразрядная сортировка массива целых чисел - Assembler

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

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

Выполнить двоичную поразрядную сортировку массива целых чисел

Решение задачи: «Двоичная поразрядная сортировка массива целых чисел»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small, Pascal
  4.  
  5. .stack 1000h
  6.  
  7. .data
  8.  
  9.         A               dw      100, 20, 500, 800, 600, 42, 32, 7894, 6541
  10.         N               dw      ($-A)/2
  11.  
  12.         CrLf            db      0Dh, 0Ah, '$'
  13.         msgBefore       db      'Before sort:', 0Dh, 0Ah, '$'
  14.         msgAfter        db      'After sort:', 0Dh, 0Ah, '$'
  15. .code
  16.  
  17. main    proc
  18.         mov     ax,     @data
  19.         mov     ds,     ax
  20.         ;вывод массива до сортировки
  21.         mov     ah,     09h
  22.         lea     dx,     msgBefore
  23.         int     21h
  24.         lea     dx,     A
  25.         mov     cx,     N
  26.         call    ShowArray
  27.  
  28.         mov     ah,     09h
  29.         lea     dx,     CrLf
  30.         int     21h
  31.  
  32.         ;сортировка массива
  33.         lea     ax,     A
  34.         push    ax
  35.         mov     ax,     N
  36.         push    N
  37.         mov     ax,     8000h
  38.         push    ax
  39.         call    RadixSort
  40.  
  41.         ;вывод массива после сортировки
  42.         mov     ah,     09h
  43.         lea     dx,     msgAfter
  44.         int     21h
  45.         lea     dx,     A
  46.         mov     cx,     N
  47.         call    ShowArray
  48.  
  49.         mov     ah,     09h
  50.         lea     dx,     CrLf
  51.         int     21h
  52.  
  53.         mov     ax,     4C00h
  54.         int     21h
  55. main    endp
  56.  
  57. RadixSort       proc
  58. arg pBegin:WORD, uiSize:WORD, uiMask:WORD
  59. uses ax,bx,cx,si,di
  60.  
  61.         cmp     [uiMask],       0       ;    if (!uiMask) return;
  62.         je      @@Return
  63.         cmp     [uiSize],       2       ;    if (uiSize < 2) return;
  64.         jb      @@Return
  65.  
  66.         mov     bx,     0               ;    int last = 0;
  67.         mov     di,     [pBegin]        ;
  68.  
  69.         mov     si,     [pBegin]        ;    for (int i = 0; i < uiSize; i++)
  70.         mov     cx,     [uiSize]
  71. @@For:                                  ;    {
  72.         mov     ax,     [si]            ;      if ((pBegin[i] & uiMask) == 0)
  73.         test    ax,     [uiMask]
  74.         jnz     @@Next
  75.         xchg    ax,     [si]            ;        swap(pBegin[last++], pBegin[i]);
  76.         xchg    ax,     [di]
  77.         xchg    ax,     [si]
  78.         inc     bx
  79.         add     di,     2
  80. @@Next:
  81.         add     si,     2
  82.         loop    @@For                   ;    }
  83.  
  84.         mov     ax,     [pBegin]        ;    RadixSort(pBegin, last, uiMask >> 1);
  85.         push    ax
  86.         mov     ax,     bx
  87.         push    ax
  88.         mov     ax,     [uiMask]
  89.         shr     ax,     1
  90.         push    ax
  91.         call    RadixSort
  92.         mov     ax,     di              ;    RadixSort(pBegin+last, uiSize-last, uiMask >> 1);
  93.         push    ax
  94.         mov     ax,     [uiSize]
  95.         sub     ax,     bx
  96.         push    ax
  97.         mov     ax,     [uiMask]
  98.         shr     ax,     1
  99.         push    ax
  100.         call    RadixSort
  101.  
  102. @@Return:
  103.         ret
  104. RadixSort       endp
  105.  
  106.  
  107. ;Вывод массива
  108. ;cx - количество вводимых элементов
  109. ;ds:dx - адрес массива
  110. ShowArray       proc
  111.         push    ax
  112.         push    bx
  113.         push    cx
  114.         push    dx
  115.         push    si
  116.         push    di
  117.  
  118.         jcxz    @@Exit          ;если массив пустой - завершить
  119.  
  120.         mov     si,     1       ;индекс элемента массива
  121.         mov     di,     dx      ;адрес текущего элемента массива
  122.         @@ForI:
  123.                 mov     ax,     [di]
  124.                 call    Show_AX
  125.                 mov     ah,     02h
  126.                 mov     dl,     ' '
  127.                 int     21h
  128.                 ;переход к следующему элементу
  129.                 inc     si
  130.                 add     di,     2
  131.         loop    @@ForI
  132. @@Exit:
  133.         pop     di
  134.         pop     si
  135.         pop     dx
  136.         pop     cx
  137.         pop     bx
  138.         pop     ax
  139.         ret
  140. ShowArray       endp
  141.  
  142. ; выводит число из регистра AX на экран
  143. ; входные данные:
  144. ; ax - число для отображения
  145. Show_AX proc
  146.         push    ax
  147.         push    bx
  148.         push    cx
  149.         push    dx
  150.         push    di
  151.  
  152.         mov     cx, 10
  153.         xor     di, di          ; di - кол. цифр в числе
  154.  
  155. @@Conv:
  156.         xor     dx, dx
  157.         div     cx              ; dl = num mod 10
  158.         add     dl, '0'         ; перевод в символьный формат
  159.         inc     di
  160.         push    dx              ; складываем в стэк
  161.         or      ax, ax
  162.         jnz     @@Conv
  163.         ; выводим из стэка на экран
  164. @@Show:
  165.         pop     dx              ; dl = очередной символ
  166.         mov     ah, 2           ; ah - функция вывода символа на экран
  167.         int     21h
  168.         dec     di              ; повторяем пока di<>0
  169.         jnz     @@Show
  170.  
  171.         pop     di
  172.         pop     dx
  173.         pop     cx
  174.         pop     bx
  175.         pop     ax
  176.         ret
  177. Show_AX endp
  178.  
  179. end     main

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

  1. LOCALS: В данном разделе описываются локальные переменные для процедур, которые используются в коде.
  2. .model small, Pascal: Устанавливается модель памяти и формат исходного кода.
  3. .stack 1000h: Выделение памяти для стека.
  4. .data: Объявление сегмента данных программы.
  5. A: Массив целых чисел для сортировки.
  6. N: Количество элементов в массиве.
  7. CrLf: последовательность символов возврата каретки и перевода строки.
  8. msgBefore: строка с текстом Before sort: для вывода на экран.
  9. msgAfter: строка с текстом After sort: для вывода на экран.
  10. main: Начало процедуры main.
  11. RadixSort: Процедура для двоичной поразрядной сортировки.
  12. arg pBegin:WORD, uiSize:WORD, uiMask:WORD: Параметры процедуры RadixSort.
  13. ShowArray: Процедура для вывода массива.
  14. Show_AX: Процедура для вывода числа из регистра AX на экран.
  15. end main: Окончание процедуры main.

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


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

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

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

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

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

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