Сортировка массива слов по возрастанию - 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
Объяснение кода листинга программы
- Создание локальных переменных:
- 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), '$'
- Определение процедуры main:
- Переменная ax инициализируется значением @data
- Переменная ds присваивается значение ax
- Отображение сообщения
Before sort:
- Вызов процедуры ShowArray для отображения массива перед сортировкой
- Отображение символа новой строки
- Вызов процедуры Sort для сортировки массива A
- Отображение сообщения
After sort:
- Вызов процедуры ShowArray для отображения отсортированного массива
- Отображение символа новой строки
- Выход из программы
- Определение процедуры Sort для сортировки массива методом
пузырька
:- Проверка на длину массива
- Итерация для сравнения элементов и их обмена в случае необходимости
- Определение процедуры ShowArray для отображения массива:
- Проверка на наличие элементов в массиве
- Итерация для отображения каждого элемента массива
- Преобразование чисел в строку и вывод на экран
- Определение процедуры WordToBinStr для преобразования числа в строку:
- Преобразование числа в двоичное представление
- Сохранение результатов в адресной строке
- Конец программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д