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

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

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

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

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

textual
Листинг программы
LOCALS
.model small
.stack 256
.data
        ;сообщения программы
        MsgBeforeSort   db      'Before sort:', 0Dh, 0Ah, '$'
        MsgAfterSort    db      'After sort:', 0Dh, 0Ah, '$'
        CrLf            db      0Dh, 0Ah, '$'
        ;вспомогательные переменные
        A               dw      777, 555, 123, 654, 841, 999, 645, 907
        Len             dw      ($-A)/2
        String          db      16 dup(0), '$'
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        mov     ah,     09h
        lea     dx,     MsgBeforeSort
        int     21h
        mov     cx,     Len
        lea     dx,     A
        call    ShowArray
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
 
        mov     cx,     Len
        lea     si,     A
        call    Sort
        ;вывод
        mov     ah,     09h
        lea     dx,     MsgAfterSort
        int     21h
        mov     cx,     Len
        lea     dx,     A
        call    ShowArray
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
 
        mov     ax,     4C00h
        int 21h
main    endp
 
;Сортировка массива слов по неубыванию
;методом "пузырька"
;вход:
; ds:si - адрес массива ключей сортировки
; cx    - длина массива
Sort    proc
        push    bp
        mov     bp,     sp
        sub     sp,     4
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
        ;проверка массива на длину более 1 элемента
        cmp     cx,     1
        jbe     @@End
        ;dx - адрес (смещение) последнего элемента
        mov     dx,     cx      ;dx - адрес (смещение) последнего элемента
        dec     dx
        shl     dx,     1       ;приведение dx - к размерности элемента массива
 
        mov     bx,     si      ;сортировка по массиву ключей
        dec     cx              ;for i:=1 to N-1 do
        mov     si,     0
@@ForI:
        mov     di,     dx      ;  for j:=N downto i+1
@@ForJ:
        mov     ax,     [bx+di] ;    if A[j]<A[j-1] then
        cmp     ax,     [bx+di-2]
        jae     @@Skip
        ;обмен элементов массива
        xchg    ax,     [bx+di-2];     swap(A[j], A[j-1]);
        mov     [bx+di],ax
@@Skip:
        sub     di,     2
        cmp     di,     si
        ja      @@ForJ
 
        add     si,     2
        loop    @@ForI
 
@@End:
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        mov     sp,     bp
        pop     bp
        ret
Sort    endp
 
;Вывод массива
;cx - количество вводимых элементов
;ds:dx - адрес массива
ShowArray       proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    si
        push    di
 
        jcxz    @@Exit          ;если массив пустой - завершить
 
        mov     si,     1       ;индекс элемента массива
        mov     di,     dx      ;адрес текущего элемента массива
        @@ForI:
                mov     ax,     [di]
                push    ax
                push    dx
                lea     dx,     String
                call    WordToBinStr
                mov     ah,     09h
                lea     dx,     String
                int     21h
                mov     ah,     09h
                mov     dl,     CrLf
                int     21h
                pop     dx
                pop     ax
                ;переход к следующему элементу
                inc     si
                add     di,     2
        loop    @@ForI
@@Exit:
        pop     di
        pop     si
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ShowArray       endp
 
; выводит число из регистра AX на экран
; входные данные:
; ax - число для отображения
; ds:dx - адрес строки для сохранения результата
WordToBinStr    proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx,     16
        mov     si,     dx
@@For:
        mov     bl,     '0'
        shl     ax,     1
        adc     bl,     0
        mov     [si],   bl
        inc     si
        loop    @@For
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
WordToBinStr    endp
 
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
Похожие ответы