Результаты вычислительного эксперимента
Лабораторная работа №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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|