Ковзель Евгений , Т -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 ;конец программы