Двоичная поразрядная сортировка массива целых чисел - Assembler
Формулировка задачи:
Выполнить двоичную поразрядную сортировку массива целых чисел
Решение задачи: «Двоичная поразрядная сортировка массива целых чисел»
textual
Листинг программы
LOCALS .model small, Pascal .stack 1000h .data A dw 100, 20, 500, 800, 600, 42, 32, 7894, 6541 N dw ($-A)/2 CrLf db 0Dh, 0Ah, '$' msgBefore db 'Before sort:', 0Dh, 0Ah, '$' msgAfter db 'After sort:', 0Dh, 0Ah, '$' .code main proc mov ax, @data mov ds, ax ;вывод массива до сортировки mov ah, 09h lea dx, msgBefore int 21h lea dx, A mov cx, N call ShowArray mov ah, 09h lea dx, CrLf int 21h ;сортировка массива lea ax, A push ax mov ax, N push N mov ax, 8000h push ax call RadixSort ;вывод массива после сортировки mov ah, 09h lea dx, msgAfter int 21h lea dx, A mov cx, N call ShowArray mov ah, 09h lea dx, CrLf int 21h mov ax, 4C00h int 21h main endp RadixSort proc arg pBegin:WORD, uiSize:WORD, uiMask:WORD uses ax,bx,cx,si,di cmp [uiMask], 0 ; if (!uiMask) return; je @@Return cmp [uiSize], 2 ; if (uiSize < 2) return; jb @@Return mov bx, 0 ; int last = 0; mov di, [pBegin] ; mov si, [pBegin] ; for (int i = 0; i < uiSize; i++) mov cx, [uiSize] @@For: ; { mov ax, [si] ; if ((pBegin[i] & uiMask) == 0) test ax, [uiMask] jnz @@Next xchg ax, [si] ; swap(pBegin[last++], pBegin[i]); xchg ax, [di] xchg ax, [si] inc bx add di, 2 @@Next: add si, 2 loop @@For ; } mov ax, [pBegin] ; RadixSort(pBegin, last, uiMask >> 1); push ax mov ax, bx push ax mov ax, [uiMask] shr ax, 1 push ax call RadixSort mov ax, di ; RadixSort(pBegin+last, uiSize-last, uiMask >> 1); push ax mov ax, [uiSize] sub ax, bx push ax mov ax, [uiMask] shr ax, 1 push ax call RadixSort @@Return: ret RadixSort 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] call Show_AX mov ah, 02h mov dl, ' ' int 21h ;переход к следующему элементу 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 - число для отображения Show_AX proc push ax push bx push cx push dx push di mov cx, 10 xor di, di ; di - кол. цифр в числе @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стэк or ax, ax jnz @@Conv ; выводим из стэка на экран @@Show: pop dx ; dl = очередной символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_AX endp end main
Объяснение кода листинга программы
- LOCALS: В данном разделе описываются локальные переменные для процедур, которые используются в коде.
- .model small, Pascal: Устанавливается модель памяти и формат исходного кода.
- .stack 1000h: Выделение памяти для стека.
- .data: Объявление сегмента данных программы.
- A: Массив целых чисел для сортировки.
- N: Количество элементов в массиве.
- CrLf: последовательность символов возврата каретки и перевода строки.
- msgBefore: строка с текстом
Before sort:
для вывода на экран. - msgAfter: строка с текстом
After sort:
для вывода на экран. - main: Начало процедуры main.
- RadixSort: Процедура для двоичной поразрядной сортировки.
- arg pBegin:WORD, uiSize:WORD, uiMask:WORD: Параметры процедуры RadixSort.
- ShowArray: Процедура для вывода массива.
- Show_AX: Процедура для вывода числа из регистра AX на экран.
- end main: Окончание процедуры main.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д