;***************************************************************************
;Программа сортировки элементов массива в порядке возрастания. Размер элемента массива - 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