Программа сортировки элементов массива в MASM32

;***************************************************************************

;Программа сортировки элементов массива в порядке возрастания. Размер элемента массива - 1байт, числа положительные (от 0 до 255)

;***************************************************************************

.486 ; create 32 bit code

.model flat, stdcall ; 32 bit memory model

option casemap :none ; case sensitive

include \masm32\include\windows.inc

include \masm32\include\masm32.inc

include \masm32\include\user32.inc

include \masm32\include\kernel32.inc

includelib \masm32\lib\masm32.lib

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

.data

buf_in DB 64 dup (0)

sort_arr DB 64 dup (0)

stdin DD ?

stdout DD ?

str1 DB "Vvedite massiv 4isel 4erez probel:",0,10,13

str4 DB "Out:",0

titel DB 'Sortirovka',0

count dd 0

arraydec DB 20 dup (0)

nRead DD ?

nRead_buf DD ?

nWrite DD ?

.code

start:

invoke AllocConsole ;инициализирует стандартный ввод данных, стандартный вывод и обработку стандартной ошибки для новой консоли

invoke SetConsoleTitle, offset titel ; установка имени окна

invoke GetStdHandle,STD_OUTPUT_HANDLE;извлекает дескриптор для стандартного вывода данных

mov stdout,eax

invoke GetStdHandle,STD_INPUT_HANDLE ;извлекает дескриптор для стандартного ввода данных

mov stdin,eax

;------------------------------------ввод массива в консоли

invoke WriteConsole,stdout,addr str1,sizeof str1,addr nWrite,0 ;записывает символьную строку в экранный буфер консоли

invoke ReadConsole,stdin,ADDR buf_in,64,ADDR nRead_buf,NULL ; читает символьный ввод данных из консольного буфера ввода

;---------------------

xor ebx,ebx ;обнуление ebx

xor edx,edx

xor ecx,ecx

lea esi,buf_in ;запись в esi адреса начала массива buf_in

lea edi, arraydec

call readdec

call sortirovka

lea edi,sort_arr ;edi - адрес отсортированного массива для вывода в ASCII

lea ebx,arraydec ;ebx - адрес отсортированного массива

mov ecx,count

h1: xor eax,eax

mov al,byte ptr[ebx]

call printdec

mov byte ptr[edi],' ' ; разделительный знак

inc edi

inc ebx

loop h1

invoke WriteConsole,stdout,addr str4,sizeof str4,addr nWrite,0 ;записывает символьную строку в экранный буфер консоли

invoke WriteConsole,stdout,addr sort_arr,sizeof sort_arr,addr nWrite,0 ;записывает символьную строку в экранный буфер консоли

invoke Sleep,6000 ; пауза в 6 секунд

kon: invoke ExitProcess,0 ;завершение программы

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

readdec proc ;процедура преобразования символьной строки по адресу ESI в массив чисел arraydec, в count - количество элементов в массиве

xor eax,eax ;обнуление eax

mov ebx,10 ; основание системы счисления

m2: mov cl, byte ptr [esi]

cmp cl,0Dh ; 0A,0D - возврат каретки и перевод строки

je m1

cmp cl,0Ah

je m1

cmp cl,20h ;пробел - переход к следующему числу

je nextnum

cmp cl,30h ;проверка на допустимые символы в 10-ой с.с.

jl kon

cmp cl,39h

ja kon

sub cl, 30h ;перевод из ASCII

mul ebx

add eax,ecx

inc esi ;переход к следующему байту массива

jmp m2

nextnum: mov byte ptr[edi],al

inc esi

inc edi

inc count

xor eax,eax

jmp m2

m1: mov byte ptr[edi],al

inc edi

inc count

ret

readdec endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

;-------------------------------------------------------

;процедура сортировки элементов массива arraydec

sortirovka proc

mov ecx, count ; в ECX - количество элементов массива

a4:

push ecx

mov ecx,count

dec ecx

mov ebx, offset arraydec

a2:

mov al, [ebx]

mov dl, [ebx+1]

cmp al,dl

jb a3

mov [ebx],dl

mov [ebx+1], al

a3:

inc ebx

loop a2

pop ecx

loop a4

;---------------

mov ecx,count

mov esi, offset arraydec

ret

sortirovka endp

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

;-----------------------------------------------------------

;Перевод массива в АСКИ для вывода

printdec proc ;преобразование числа из eах в десятичную строку по адресу edi

;eax - число

;edi - адрес буфера приемника

push ecx ;сохраняем регистры

push edx

push ebx

cld

mov ebx,10 ;основание системы

XOR eCX,eCX ;в eсх будет количество цифр в десятичном числе

@@m1: XOR edx,edx

DIV ebx ;делим число на степени 10

PUSH eDX ;и сохраняем остаток от деления(коэффициенты при степенях) в стек

INC eCX

TEST eAX,eAX

JNZ @@m1

@@m2: POP eAX

ADD AL,'0' ;преобразовываем число в ASCII символ

STOSb ;сохраняем в буфер

LOOP @@m2 ;все цифры

pop ebx ;восстанавливаем регистры

POP edx

POP ecx

RET

printdec endp

;-----------------------------------------------

end start

Наши рекомендации