Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архив1 / docx57 / Отчет(7)

.docx
Скачиваний:
23
Добавлен:
01.08.2013
Размер:
50.54 Кб
Скачать

Ковзель Евгений , Т -093 , Лабораторная работа № 3

Листинг 1

;masm32

include \masm32\include\masm32rt.inc

.data?

buffer_for_string db 64 dup (?)

.data

mas dw 1,2,5,1,5,3,5,2,2 ; исходная последовательность

size_el equ 2 ; размер элемента

fnd dw 5 ; искомый ключ(элемент)

items db 0 ; число вхождений (результат)

title_string db "Результат: ",0

szformat db "%u"," - количество вхождений искомого элемента в массив", 0Dh,0Ah,0

.code

start:

main proc

xor eax,eax

xor ebx,ebx

xor edx,edx

xor ecx,ecx

xor esi,esi

xor edi,edi

mov ax,mas

mov si,0 ; индекс первого элемента массива

mov bx,fnd

mov cx,9 ; число элементов в массиве

cycl: ; организация цикла

mov dx,mas[si]

add si,size_el ; переход к следущему элементу

cmp dx,bx ; сравнение текущего элемента с ключом

je m1 ; если равны, то переход на метку m1

loop cycl

jmp outm

m1:

inc items ; увеличение счетчика

dec cx ; уменьшение значения регистра сх

jcxz outm ; сравнение значения сх с нулем

jmp cycl ; если не равно, то возврат на метку cycl

outm: ; вывод вычисленного значения в окно

xor eax,eax

mov al,items

;API

push eax

push offset szformat

push offset buffer_for_string

call wsprintf

push MB_OK

push offset title_string

push offset buffer_for_string

push 0

call MessageBox

push 0

call ExitProcess

main endp

end start ;конец программы

Листинг 2

;masm32

include \masm32\include\masm32rt.inc

.data?

buffer_for_string db 128 dup (?)

.data

n equ 9 ;количество элементов в массиве, считая с 0

mas dw 2,7,4,0,1,9,3,6,5,8 ;исходный массив

tmp dw 0 ;переменные для работы с массивом

i dw 0

j dw 0

title_string db "Результат: ",0

szformat db "%u", "%u", "%u", "%u", "%u", "%u", "%u", "%u", "%u", "%u", " - Отсортированный массив", 0Dh,0Ah, \

"%u", "%u", "%u", "%u", "%u", "%u", "%u", "%u", "%u", "%u", " - Исходный массив", 0Dh,0Ah, 0

.code

start:

main proc

xor eax,eax

xor ebx,ebx

xor edx,edx

xor ecx,ecx

xor esi,esi

xor edi,edi

mov cx,10

mov si,18

show_primary: ;вывод значения элементов исходного массива в окно

xor edx,edx

mov dx,mas[si]

push edx

sub si,2

loop show_primary

;================================================================

;строки 53-92 программы эквивалентны следующему коду на языке С:

;for (i=0;i<9;i++)

; for (j=9;j>i;j--)

; if (mas[i]>mas[j])

; {tmp=mas[i];

; mas[i]=mas[j];

; mas[j]=tmp;}

;================================================================

mov i,0 ;инициализация i

internal: ;внутренний цикл по j

mov j,9 ;инициализация j

jmp cycl_j ;переход на тело цикла

exchange:

mov bx,i ;bx=i

shl bx,1

mov ax,mas[bx] ;ax=mas[i]

mov bx,j ;bx=j

shl bx,1

cmp ax,mas[bx] ;mas[i] ? mas[j] - сравнение элементов

jle lesser ;если mas[i] меньше, то обмен не нужен и

;переход на продвижение далее по массиву

;иначе tmp=mas[i], mas[i]=mas[j], mas[j]=tmp:

;tmp=mas[i]

mov bx,i ;bx=i

shl bx,1 ;умножаем на 2, так как элементы - слова

mov tmp,ax ;tmp=mas[i]

;mas[i]=mas[j]

mov bx,j ;bx=j

shl bx,1 ;умножаем на 2, так как элементы - слова

mov ax,mas[bx] ;ax=mas[j]

mov bx,i ;bx=i

shl bx,1 ;умножаем на 2, так как элементы - слова

mov mas[bx],ax ;mas[i]=mas[j]

;mas[j]=tmp

mov bx,j ;bx=j

shl bx,1 ;умножаем на 2, так как элементы - слова

mov ax,tmp ;ax=tmp

mov mas[bx],ax ;mas[j]=tmp

lesser: ;продвижение далее по массиву во внутреннем цикле

dec j ;j--

;тело цикла по j

cycl_j:

mov ax,j ;ax=j

cmp ax,i ;сравнить j ? i

jg exchange ;если j>i, то переход на обмен

;иначе на внешний цикл по i

inc i ;i++

cmp i,n ;сравнить i ? n - прошли до конца массива

jl internal ;если i<n продолжение обработки

;вывод отсортированного массива в окно

prepare:

mov cx,10

mov si,18

show: ;вывод значения элемента

xor edx,edx

mov dx,mas[si]

push edx

sub si,2

loop show

;API

push offset szformat

push offset buffer_for_string

call wsprintf

push MB_OK

push offset title_string

push offset buffer_for_string

push 0

call MessageBox

push 0

call ExitProcess

main endp

end start ;конец программы

Соседние файлы в папке docx57