Сортировка массива слов по возрастанию - 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 для преобразования числа в строку:
- Преобразование числа в двоичное представление
- Сохранение результатов в адресной строке
- Конец программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д