То есть, требуется чётность элементов проверять сравнением остатка от целочисленного деления на 2 с нулём вместо логических команд, обычно применяемых для этого?
Странное условие.
format PE64
entry N88749239
include 'win64ax.inc'
section '.data' data readable writeable
Msg1 db 'Дан массив длиной %i:',13,10,0
Msg2 db 13,10,10,'Cумма квадратов чётных элементов = %li',13,10
db 'Для завершения работы нажмите любую клавишу... ',0
Frmt db '%5i',0
Seed rd 1
Len rd 1
Sum rd 1
Array rq 1
section '.text' code readable executable
N88749239:
rdtsc
mov [Seed],eax
fastcall Random,191
add eax,10
mov [Len],eax
shl eax,2
invoke VirtualAlloc,NULL,eax,MEM_COMMIT,PAGE_READWRITE
mov [Array],rax
invoke printf,Msg1,[Len]
mov ecx,[Len]
mov rdi,[Array]
mov [Sum],0
mov r12d,2
DoLoop:
push rcx
fastcall Random,1001
sub eax,500
stosd
invoke printf,Frmt,dword [rdi-4]
mov eax,[rdi-4]
cdq
idiv r12d
test edx,edx
jnz Next
mov eax,[rdi-4]
imul eax
add [Sum],eax
Next:
pop rcx
loop DoLoop
invoke printf,Msg2,[Sum]
invoke getch
invoke VirtualFree,[Array],NULL,MEM_RELEASE
invoke ExitProcess,NULL
proc Random
mov eax,[Seed]
mov edx,08088405h
mul edx
inc eax
mov [Seed],eax
mul ecx
mov eax,edx
ret
endp
section '.idata' import data readable writeable
dd 0,0,0,RVA kernel_name,RVA kernel_table
dd 0,0,0,RVA msvcrt_name,RVA msvcrt_table
dd 0,0,0,0,0
kernel_table:
ExitProcess dq RVA _ExitProcess
VirtualAlloc dq RVA _VirtualAlloc
VirtualFree dq RVA _VirtualFree
dq 0
kernel_name db 'kernel32.dll',0
_ExitProcess db 0,0,'ExitProcess',0
_VirtualAlloc db 0,0,'VirtualAlloc',0
_VirtualFree db 0,0,'VirtualFree',0
msvcrt_table:
printf dq RVA _printf
getch dq RVA __getch
dq 0
msvcrt_name db 'msvcrt.dll',0
_printf db 0,0,'printf',0
__getch db 0,0,'_getch',0
