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

Нужна помощь с ассемблером

Прошу помощи у знающих и сведущих людей. Необходимо написать задачку на ассемблере, но увы практических знаний полученных мной не достаточно. Заранее благодарен за помощь.

Ввести два массива одинаковой длины. Сформировать третий массив, записав в него суммы соответствующих элементов первого и второго массива. В полученном массиве найти максимальный элемент.
ТУ
Тоо Укс
843
p686
model flat, stdcall

include "win32lz.inc"
includelib "imp32i.lib"

procdesc VirtualAlloc :dword, :dword, :dword, :dword
procdesc VirtualFree :dword, :dword, :dword
procdesc printf :dword, :vararg
procdesc scanf :dword, :vararg
procdesc _putch :dword
procdesc _getch

codeseg

proc InputArray uses edi ecx, Adr :dword, Len :dword
    mov edi, Adr
    mov ecx, Len
@@:
    push ecx
    mov eax, Len
    sub eax, ecx
    inc eax
    call printf, offset OutiFrm, eax
    call scanf, offset InFrm, edi
    add edi, 8
    pop ecx
    loop @B
    ret
endp

proc OutputArray uses esi ecx, Adr :dword, Len :dword
    mov esi, Adr
    mov ecx, Len
@@:
    push ecx
    call printf, offset OutFrm, [dword esi], [dword esi + 4]
    add esi, 8
    pop ecx
    loop @B
    call _putch, 13
    call _putch, 10
    add esp, 8
    ret
endp

    startupcode
    call printf, offset Prompt1
    call scanf, offset InNFrm, offset N
    mov eax, [N]
    shl eax, 3
    mov esi, eax
    imul eax, eax, 3
    call VirtualAlloc, NULL, eax, MEM_COMMIT, PAGE_READWRITE
    mov [Array1], eax
    add eax, esi
    mov [Array2], eax
    add eax, esi
    mov [Array3], eax
    call printf, offset Prompt2
    call InputArray, [Array1], [N]
    inc [byte Prompt2 + 8]
    call printf, offset Prompt2
    call InputArray, [Array2], [N]

    finit
    mov ecx, [N]
    mov edi, [Array3]
    mov ebx, [Array1]
    mov edx, [Array2]
    xor esi, esi
@@:
    fld [qword ebx + esi * 8]
    fadd [qword edx + esi * 8]
    fstp [qword edi + esi * 8]
    inc esi
    loop @B
    call printf, offset Message1
    call OutputArray, [Array3], [N]

    mov ecx, [N]
    dec ecx
    xor esi, esi
    mov edi, 1
    mov ebx, [Array3]
FindMax:
    fld [qword ebx + edi * 8]
    fld [qword ebx + esi * 8]
    fcomip st, st1
    cmovb esi, edi
    jae @F
    fstp st
@@:
    ffree st
    inc edi
    loop FindMax
    mov eax, esi
    inc esi
    call printf, offset Message2, esi, [dword ebx + esi * 8 - 8], [dword ebx + esi * 8 - 4]

    call printf, offset PromptQuit
    call _getch
    call VirtualFree, [Array1], NULL, MEM_RELEASE
    xor eax, eax
    exitcode

dataseg
  Prompt1 db "Введите размер массивов: ", 0
  Prompt2 db "Введите 1-й массив: ", 13, 10, 0
  Message1 db "Сформирован 3-й массив: ", 13, 10, 0
  Message2 db 10, "Максимальный элемент 3-го массива [%d] = %0.3f", 13, 10, 10, 0
  PromptQuit db "Для завершения работы нажмите любую клавишу... ", 0

  InNFrm db "%u", 0
  InFrm db "%lf", 0
  OutiFrm db "%4u: ", 0
  OutFrm db "%8.3f", 0

udataseg
  N dd ?
  Array1 dd ?
  Array2 dd ?
  Array3 dd ?

end

Роман Мисник
Роман Мисник
51 590
Лучший ответ