Благодарю
DillerInc что так оперативно смог ответить на моё сообщение
По сложившейся традиции для начала приведу обновлённый код, который сразу отмечу, работает, как требовалось постановкой задачи!
Код:

TITLE The bubble way of sorting the array
SSEG SEGMENT PARA STACK 'STACK'
DB 16 DUP(0)
SSEG ENDS
DSEG SEGMENT PARA PUBLIC 'DATA'
Msg1 DB 0dh,' Массив не упорядоченных данных - ','$'
Msg2 DB 0ah,0dh,' Массив упорядоченных данных - ','$'
ArraySize DW 10
buff DW 10 DUP(?)
Array DW 2,9,3,8,4,7,6,5,0,1
DSEG ENDS
CSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
PROC MAIN NEAR
mov ax,DSEG
mov ds,ax
mov ax,0
mov cx,ArraySize
mov si,0
mov ah,09h
lea dx,Msg1
int 21h
call SHOW
call BUBBLE_SORT
mov cx,ArraySize
mov si,0
mov ah,09h
lea dx,Msg2
int 21h
call SHOW
exit:
mov ax,4c00h
int 21h
MAIN ENDP
BUBBLE_SORT PROC NEAR
push ax
cld
lea si,Array ;source
lea di,buff ;destany
mov cx,ArraySize
rep movsw
mov dx,ArraySize
cmp dx,1
jbe sort_exit
dec dx
sb_loop1:
mov cx,dx
xor bx,bx
mov si,di
sb_loop2:
lodsw
cmp ax,word ptr [si]
jbe no_swap
xchg ax,word ptr [si]
mov word ptr [si-2],ax
inc bx
no_swap:
loop sb_loop2
cmp bx,0
jne sb_loop1
sort_exit:
pop ax
ret
BUBBLE_SORT ENDP
PROC SHOW NEAR
mov ah,02h
mov dx,Array[si]
add dl,30h
int 21h
inc si
inc si
loop show
ret
SHOW ENDP
CSEG ENDS
END MAIN
Из изменений исправлено типы данных в шапке, а также самое главное как для переменных слов в подпрограмме выводе на экран добавлен ещё один
inc si (поскольку работаем со словами, а между ними разность не
si+1, а
si+2).
По сути код был рабочий и в прошлой реализации за исключением не верной инициализации размерности и самого массива по типу данных.
Что натолкнуло меня на правильный ход мысли? Как раз
Цитата DillerInc:
..ей,богу,глаз режит.У тебя получается массив Array,состоящий из десяти байт,а размер ты выставляешь в словах -- десять слов,что соответствует двадцати байтам!И чем интересно будут заполнены лишние десять байт??Шелл-кодом??
|
Я откорректировал код в сторону слов, а не байт, так как большая часть кода ориентировано на слова, хотя надо будет попробовать поработать и с байтами. Теоретически файл должен стать меньше, а код быстрее. Не только
movsb, но и
lodsb будет для байт масива будет присутствовать в коде вместо
movsw и
lodsw соответственно.
Так что
Цитата:
Array DB 2,9,3,8,4,7,6,5,0,1
ArrayLen = $-Array
|
ещё по используем. А какой аналог для слов?
А разница между тем какой массив (байтовый или словный) будет проявляться в реализации программы и в допустимых числовых значениях элементов:
Цитата ASM Glossary:
db — резервирование памяти для данных размером 1 байт.
для чисел со знаком –128...+127;
для чисел без знака 0...255;
а для слов
dw — резервирование памяти для данных размером 2 байта.
для чисел со знаком –32 768...32 767;
для чисел без знака 0...65 535
|
а также как я предположил уменьшением увиличением файла, изминением быстродействием алгоритма?
А вообше бывают ли масивы
Цитата ASM Glossary:
dd — резервирование памяти для данных размером 4 байта.
df — резервирование памяти для данных размером 6 байт;
dp — резервирование памяти для данных размером 6 байт.
dq — резервирование памяти для данных размером 8 байт.
dt — резервирование памяти для данных размером 10 байт.
|
После корректировки на вывод выдавалось только половина массива через нули, которые и есть так называемый Шелл-код. То есть неправильно выдавался массив на экран, значит и недочёт в подпрограмме вывода. Добавил ещё
inc si и всё пошло как по маслу!
Итог
Цитата Proga.exe;1,50 KB (1*539 bytes):
Массив не упорядоченных данных - 2938476501
Массив упорядоченных данных - 0123456789
|
P.S
А как насчёт следующих алгоритмов: быстрого сортирования и методом линейного отбора.
Код:

;***************************************************
;
;Сортирование массива методом быстрого сортирования
;
;***************************************************
;DS:DI – адреса массива
;DX – размер массива
quick_sort proc near
cmp dx,1
jle qsort_done
xor di,di
mov si,dx
dec si
shl si,1
mov ax,word ptr [bx]
step_2: cmp word ptr [bx+si],ax
jle step_3
sub si,2
jmp short step_2
step_3: cmp si,di
je step_5
add di,2
cmp word ptr [bx+di],ax
jl step_3
step_4: mov cx,word ptr [bx+di]
xchg cx,word ptr [bx+si]
mov word ptr [bx+di],cx
jmp short step_2
step_5: xchg ax,word ptr [bx+di]
mov word ptr [bx],ax
push dx
push di
push bx
mov dx,di
shr dx,1 ;загрузка длины массива
call quick_sort ;сортирование
pop bx
pop di
pop dx
add bx,di
add bx,2 ;загрузка начала массива
shr di,1
inc di
sub dx,di ;загрузка длины массива
call quick_sort ;сортирование
qsort_done: ret
quick_sort endp
а также
Код:

;***************************************************
;
;Сортирование массива методом линейного отбора
;
;***************************************************
;DS:DI (ES:SI) – адреса массивов
;DX – количество элементов массива
do_swap: lea bx,word ptr [di-2]
mov ax,word ptr [bx] ;новое наименьше число
dec cx ;если поиск минимального завершён
jcxz tail ;перейти в конец
loop1: scasw ;сравнить минимальное в AX
;со следующим элементом
ja do_swap
loop loop1 ;продолжить сравнение
tail: xchg ax,word ptr [si-2]
mov word ptr [bx],ax
linear_sel_sort: proc near ;точка входу в процедуру
mov bx,si
lodsw
mov di,si
dec dx
mov cx,dx
jg loop1
ret
linear_sel_sort: endp
Заменив подпрограмму, на один из указанных алгоритмов получил ошибку исполняемого файла. Для данных алгоритмов необходимо писать свою шапку инициализации массива?
И что за новенькое DS:DI (ES:SI)?
Какие будут комментарии по поводу данных алгоритмов и их реализации на ассемблере?
И в общем реакция на написанное.