Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Благодарю 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)?

Какие будут комментарии по поводу данных алгоритмов и их реализации на ассемблере?

И в общем реакция на написанное.

Отправлено: 23:44, 06-12-2006 | #26