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
dataseg
Text1 dc "Дан массив [%u]:",13,10,0
Text2 dc 13,10,10,"Номер максимального элемента: %u"
dc 13,10,10,"Для завершения работы нажмите любую клавишу... ",0
OutFrmt dc "%8.3f",0
RndConst dd 3 shl 28
Const1 dd 199.98
Const2 dd 99.99
udataseg
Seed dd ?
Size dd ?
Array dd ?
Buff dq ?
codeseg
startupcode
rdtsc
mov [Seed],eax
finit
fstcw [word Buff]
or [word Buff],3072
fldcw [word Buff]
call Random
mov [dword Buff],101
fimul [dword Buff]
fistp [Size]
add [Size],50
mov eax,[Size]
shl eax,3
call VirtualAlloc,NULL,eax,MEM_COMMIT,PAGE_READWRITE
mov [Array],eax
call printf,offset Text1,[Size]
mov ebx,[Array]
xor edi,edi
mov ecx,[Size]
@@:
call Random
fmul [Const1]
fsub [Const2]
fstp [Buff]
mov eax,[dword Buff]
mov [dword ebx+edi*8],eax
mov edx,[dword Buff+4]
mov [dword ebx+edi*8+4],edx
push ecx
call printf,OutFrmt,eax,edx
pop ecx
inc edi
loop @B
;Поиск номера максимального элемента
mov esi,[Array]
xor ebx,ebx
mov edx,ebx
mov ecx,[Size]
fld [qword esi+ebx*8]
fstp [qword Buff]
DoLoop:
inc ebx
fld [qword esi+ebx*8]
fld [qword Buff]
fcomip st,st1
cmovb edx,ebx
jae @F
fst [qword Buff]
@@:
ffree st
loop DoLoop
inc edx
push edx
call printf,offset Text2,edx
pop edx
;В регистре dx порядковый номер максимального элемента в массве
;Здесь вы что-то делаете с этим номером
;...
call VirtualFree,[Array],NULL,MEM_RELEASE
call _getch
xor eax,eax
exitcode
proc Random uses eax edx
mov eax,[Seed]
mov edx,134775813
mul edx
inc eax
and eax,2147483647
mov [Seed],eax
fild [Seed]
fmul [RndConst]
ret
endp
