Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Результаты вычислительного эксперимента

Лабораторная работа №1

Дисциплина «Основы вычислительной техники»

Тема: «Сортировка в MASM 32»

 

 

Выполнил:

студент группы 4-05-3

Курдюмова Е.С.

 

Проверил:

преподаватель

Лекомцев П.В.

 

 

Ижевск 2011

Содержание

 

Задание на лабораторную работу 3

Введение 4

1. Разработка схемы алгоритма решения задачи 5

2. Разработка программы 7

3. Результаты вычислительного эксперимента 11

Выводы 12

Список литературы 12

 

Задание на лабораторную работу

Разработать алгоритм и программу сортировки элементов массива в соответствии с индивидуальным заданием на языке Assembler для Win32. Ввод и вывод осуществить в диалоговом окне Windows.

 

Вариант задания:

 

- элементы сортировки – нечетные;

- порядок сортировки – по возрастанию;

- метод – простым обменом.

 

Введение

Сортировка простым обменом (метод пузырька)

Данный метод сортировки основан на принципе сравнения и обмена пары соседних элементов до тех пор, пока не будут рассортированы все элементы. Пример сортировки методом пузырька представлен на рисунке 1.

 

Рисунок 1 – Пример сортировки методом пузырька

Разработка схемы алгоритма решения задачи

 

Пример оформления схемы алгоритма программы сортировки элементов массива в соответствии с индивидуальным заданием на языке Assembler для Win32 представлен на рисунке 2.

Рисунок 2 - Схема алгоритма программы сортировки элементов массива в соответствии с индивидуальным заданием на языке Assembler для Win32

 

 

Рисунок 2 - Продолжение

 

Разработка программы

 

В соответствии с алгоритмом разработана программа. Текст программы представлен на рисунке 3.

 

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

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

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

 

.486; тип процессора

.model flat, stdcall; модель памяти и вызов программ

option casemap:none; различает строчные и заглавные буквы

 

include H:\ОВТ\masm321125o0\masm32\masm32\include\windows.inc ;подключение необходимых файлов

include H:\ОВТ\masm321125o0\masm32\masm32\include\masm32.inc

include H:\ОВТ\masm321125o0\masm32\masm32\include\user32.inc

include H:\ОВТ\masm321125o0\masm32\masm32\include\kernel32.inc

includelib H:\ОВТ\masm321125o0\masm32\masm32\lib\masm32.lib ;подключение необходимых библиотек

includelib H:\ОВТ\masm321125o0\masm32\masm32\lib\user32.lib

includelib H:\ОВТ\masm321125o0\masm32\masm32\lib\kernel32.lib

 

.data ;сегмент данных (инициализированные данные)

buf_in db 64 dup (0)

sort_arr db 64 dup (0)

stdin dd?

stdout dd?

P db?

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

str4 db "Out:",0

titel db 'Sortirovka',0

i 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 ;обнуление edx

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

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

lea edi, arraydec

call readdec ;вызов процедуры readdec

Рисунок 3 –Текст программы

call sortirovka ;вызов процедуры sortirovka

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

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

mov ecx,i

 

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

mov al,byte ptr[ebx]

call printdec ;вызов процедуры 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,20000 ;пауза в 20 секунд

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

 

; """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

readdec proc ;процедура преобразования символьной строки по адресу

;ESI в массив чисел arraydec, в i - количество элементов в массиве

 

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 ;если cl<30h => переход на метку kon

cmp cl,39h

ja kon ;если cl>39h => переход на метку 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 I; i=i+1

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

jmp m2

 

m1:

mov byte ptr[edi],al

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

inc I; i=i+1

ret ;выход из процедуры

readdec endp

; """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

 

Рисунок 3 – Продолжение

 

 

; """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

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

sortirovka proc

 

mov P,1 ;очистка Р (P=1-была перестановка элементов, P=0-не было)

mov esi,offset arraydec ;в esi - адрес 1-го элемента (esi=j)

mov edi,esi

add edi,i; в edi - адрес последнего элемента (edi=i)

mov ebx,esi

add ebx,1; в ebx - адрес 2-го элемента (ebx=j+1=z)

 

m1:

cmp P,0 ;Р сравниваем с 0

je exit ;если не было перестановок(P=0), то сортировка завершена

mov P,0 ;P=0

mov esi,offset arraydec ;j=1

mov ebx,esi

add ebx,1 ;z=2

 

m2:

cmp ebx,edi ;если z<i переходим на метку к1

jbe k1

dec edi ;если z>i, edi уменьшается на 1

jmp m1 ;переходим наметку m1

 

k1:

mov ah, byte ptr[esi] ;в ah записываем j-ый элемент

shr ah,1 ;если последняя цифра в числе 1 => оно нечетное

jc k2

inc esi ;переход к следующему байту массива (j=j+1)

inc ebx ;переход к следующему байту массива (z=z+1)

jmp m2

 

k2:

mov al, byte ptr[ebx] ;в ah записываем z -ый элемент

shr al,1 ;если последняя цифра в числе 1 => оно нечетное

jc m3

inc ebx ;переход к следующему байту массива (z=z+1)

jmp m2

 

m3:

mov ah, byte ptr[esi] ;в ah - j-ый элемент массива

mov al, byte ptr[ebx] ;в al - z-ый элемент массива

cmp ah,al

ja yes ;ah>al --->yes

 

n:

mov esi,ebx ;j=z (т.е.j=j+1)

inc ebx ;z=z+1

jmp m2

 

yes:

mov P,1 ;P=1

mov byte ptr[esi],al

mov byte ptr[ebx],ah ;меняем местами элементы al <---> ah

jmp m3

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

mov ecx,i

exit: mov esi, offset arraydec

ret ;выход из процедуры

sortirovka endp

; """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

Рисунок 3 – Продолжение

; """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

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

 

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

;eax - число

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

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

push edx

push ebx

cld ;установка флага DF=0

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

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

 

@@m1:

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

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

push edx ;и сохраняем остаток от деления(коэф-ты при степенях) в стек

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

test eax,eax ;выборочное обнуление отдельных битов (логическое побитовое и|или)

;операнды не меняет, а меняет только флаги

jnz @@m1; если не 0 переход на метку @@m1

 

@@m2:

pop eax ;считываем данные из стека

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

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

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

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

pop ecx

ret ;выход из процедуры

printdec endp

; """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

end start ;окончание кода программы

Рисунок 3 – Продолжение

 

 

Результаты вычислительного эксперимента

 

Пример работы программы представлен на рисунках 4, 5.

Ι.

Рисунок 4 – Вычислительный эксперимент 1

 

Ι Ι.

Рисунок 5 – Вычислительный эксперимент 2

Вывод

В ходе данной лабораторной работы были получены навыки программирования на языке Assembler для Win32, в частности, освоение навыков программирования на языке Assembler для Win32, в частности изучения команд работы с массивами данных и реализации простейших алгоритмов сортировок.

 

Список литературы

1. Лекомцев П.В.: Сортировка в MASM 32: методическое пособие (по дисциплине «Основы вычислительной техники») – Ижевск: Издательство ИжГТУ, 2008. — 10с.

2. Пирогов В.Ю. Ассемблер и дизассемблирование.— СПб.: БХВ-Петербург, 2006. — 464 с: ил. (ISBN 5-94157-677-3)

3. Вигдорчик Г.В., Воробьев А.Ю.: Основы программирования на ассемблере – Москва: Издательство «Финансы и статистика», 1987. –240с.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...