Другие языки программирования и технологии

как найти количество максимальных элементов в массиве? на асемблере. на асемблере

На ассемблере:

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. Подпрограмма подсчёта максимумов выделена жирным шрифтом. Подсчёт производится за один проход по массиву.

Виктор Милованов
Виктор Милованов
51 590
Лучший ответ
Пересчитать, как же еще?
Ах да, на ассемблере.
Юрий Гончаров
Юрий Гончаров
96 976

Похожие вопросы