Программа сортировки элементов массива в 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