p586
model flat,stdcall
include "win32lz.inc"
includelib "imp32i.lib"
procdesc VirtualAlloc :dword, :dword, :dword, :dword
procdesc VirtualFree :dword, :dword, :dword
procdesc printf :vararg
procdesc _getch
codeseg
;Подпрограмма подсчёта кол-ва максимальных элементов в массиве
;с начальным адресом Adr и длиной Len
;Кол-во максимальных элементов возвращается в регистре eax
proc CountMax stdcall uses edx ebx ecx esi, Adr:dword, Len:dword
mov esi,Adr
mov ecx,Len
dec ecx
mov ebx,1
lodsw
mov dx,ax
CMax1:
lodsw
cmp dx,ax
jne CMax2
inc ebx
jmp CMax3
CMax2:
jg CMax3
mov ebx,1
mov dx,ax
CMax3:
loop CMax1
mov eax,ebx
ret
endp
startupcode
rdtsc
mov [Seed],eax
push eax
finit
fstcw [word esp]
or [byte esp+1],12
fldcw [word esp]
call Rand
mov [dword esp],201
fimul [dword esp]
fistp [Size]
add [Size],100
mov eax,[Size]
shl eax,1
call VirtualAlloc,NULL,eax,MEM_COMMIT,PAGE_READWRITE
mov [Array],eax
call printf,offset Text1,[Size]
mov edi,[Array]
mov ecx,[Size]
push -33.5
@@:
fld [dword esp]
call Rand
fyl2x
fldln2
fmul
mov ax,50
fistp [word esp+4]
sub ax,[word esp+4]
stosw
push ecx
movsx eax,ax
call printf,OutFrmt,eax
pop ecx
loop @B
add esp,8
call CountMax,[Array],[Size]; Вызов подпрограммы
call printf,offset Text2,eax
call VirtualFree,[Array],NULL,MEM_RELEASE
call _getch
xor eax,eax
exitcode
proc Rand uses eax edx
local p:dword
mov [p],3 shl 28
mov eax,[Seed]
mov edx,16070093
mul edx
add eax,453816693
and eax,7FFFFFFFh
mov [Seed],eax
fild [Seed]
fmul [p]
ret
endp
dataseg
Text1 dc "Дан массив [%u]:",13,10,0
Text2 dc 13,10,10,"Кол-во максимальных элементов: %u"
dc 13,10,10,"Для завершения работы нажмите любую клавишу... ",0
OutFrmt dc "%5i",0
udataseg
Seed dd ?
Size dd ?
Array dd ?
P.S. Подпрограмма подсчёта максимумов выделена жирным шрифтом. Подсчёт производится за один проход по массиву.
