Прошу помощи у знающих и сведущих людей. Необходимо написать задачку на ассемблере, но увы практических знаний полученных мной не достаточно. Заранее благодарен за помощь.
Ввести два массива одинаковой длины. Сформировать третий массив, записав в него суммы соответствующих элементов первого и второго массива. В полученном массиве найти максимальный элемент.
Другие языки программирования и технологии
Помогите с программой на Ассемблере
.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

.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

могу, но не хочу на 8.1 разворачивать асм
Aslan Chonorov
Именно этой поддержки я и ждал! Благодарю словесно!
Похожие вопросы
- помогите написать программы в ассемблере
- Помогите написать программу на ассемблере, завтра экзамен а я в нём совсем не шарю.
- срочно помогите написать программу на ассемблере вычисляющую R. R=x2+y2, где x=a+b-c, y=b*c-a. a,b,c вводятся с клавы
- Помогите написать программу на ассемблере по условию
- Помогите написать программу на Ассемблере
- Помогите написать небольшую программу на ассемблере (TASM). Подробности внутри.
- Нужна помощь с программой на ассемблере - комментирование каждой строки
- Приведите пожалуйста пример программы на ассемблере, использующая API функцию GlobalMemoryStatus. Заранее спасибо.
- Нужно составить программу на ассемблере
- Люди, которые хоть немного разбираются в ассемблере, помогите написать программу)