Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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

 





Поделиться с друзьями:


Дата добавления: 2017-02-28; Мы поможем в написании ваших работ!; просмотров: 1117 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Наука — это организованные знания, мудрость — это организованная жизнь. © Иммануил Кант
==> читать все изречения...

2308 - | 2104 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.012 с.