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

Помогите с программой на Ассемблере

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

Ввести два массива одинаковой длины. Сформировать третий массив, записав в него суммы соответствующих элементов первого и второго массива. В полученном массиве найти максимальный элемент.
AC
Aslan Chonorov
843
.386
.model flat, c
option casemap :none

include windows.inc

scanf proto :dword, :vararg
printf proto :dword, :vararg
_putch proto :dword
_getch proto
_exit proto :dword
VirtualAlloc proto stdcall :dword, :dword, :dword, :dword
VirtualFree proto stdcall :dword, :dword, :dword

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

  InFrm db "%d", 0
  OutiFrm db "%4d: ", 0
  OutFrm db "%8d", 0

.data?
  N dd ?
  Array1 dd ?
  Array2 dd ?
  Array3 dd ?

.code
InputArray proc stdcall uses edi ecx, Adr :dword, Len :dword
    mov edi, Adr
    mov ecx, Len
@@:
    push ecx
    mov eax, Len
    sub eax, ecx
    inc eax
    invoke printf, addr OutiFrm, eax
    invoke scanf, addr InFrm, edi
    add edi, 4
    pop ecx
    loop @B
    ret
InputArray endp

OutputArray proc stdcall uses esi ecx, Adr :dword, Len :dword
    mov esi, Adr
    mov ecx, Len
@@:
    push ecx
    invoke printf, addr OutFrm, dword ptr [esi]
    add esi, 4
    pop ecx
    loop @B
    invoke _putch, 13
    invoke _putch, 10
    ret
OutputArray endp

N173059666:
    invoke printf, addr Prompt1
    invoke scanf, addr InFrm, addr N
    mov eax, N
    shl eax, 2
    mov esi, eax
    imul eax, eax, 3
    invoke VirtualAlloc, NULL, eax, MEM_COMMIT, PAGE_READWRITE
    mov Array1, eax
    add eax, esi
    mov Array2, eax
    add eax, esi
    mov Array3, eax
    invoke printf, addr Prompt2
    invoke InputArray, Array1, N
    inc byte ptr Prompt2 + 8
    invoke printf, addr Prompt2
    invoke InputArray, Array2, N

    mov ecx, N
    mov edi, Array3
    mov ebx, Array1
    mov edx, Array2
    xor esi, esi
@@:
    mov eax, [ebx + esi * 4]
    add eax, [edx + esi * 4]
    inc esi
    stosd
    loop @B
    invoke printf, addr Message1
    invoke OutputArray, Array3, N

    mov ecx, N
    dec ecx
    xor esi, esi
    mov edi, 1
    mov ebx, Array3
    mov eax, [ebx + esi * 4]
FindMax:
    cmp eax, [ebx + edi * 4]
    jge @F
    mov eax, [ebx + edi * 4]
    mov esi, edi
@@:
    inc edi
    loop FindMax
    inc esi
    invoke printf, addr Message2, esi, eax

    invoke printf, addr PromptQuit
    invoke _getch
    invoke VirtualFree, Array1, NULL, MEM_RELEASE
    invoke _exit, NULL
    end N173059666

АС
Азат Сулайманов
51 590
Лучший ответ
могу, но не хочу на 8.1 разворачивать асм
Asimjan Ziyavdinov
Asimjan Ziyavdinov
82 941
Aslan Chonorov Именно этой поддержки я и ждал! Благодарю словесно!