.686
.model flat

extern _ExitProcess@4 : PROC
public _main

; Lokalizacja/format danych wejściowych:
; - Ilość elementów w szeregu: EDX
; - Wskaźnik na tablicę z szeregiem: ESI
; - Wskaźnik na tablicę docelową: EDI
; - Elementy obydwu tablic mają po 16 bitów (word).
; - Wartość n: ECX
; - Wartość k: EBX

; Kod w C który przerabiamy:
; int licznik_sum = 0;
; for (int i = 0; i < EDX - n + 1; i += k) {
;     int16_t licznik = 0;
;     for (int j = i; j <= i + n; j++) {
;         licznik += ESI[j]
;     }
;
;     licznik = licznik / ECX;
;     EDI[licznik_sum] = licznik;
;     licznik_sum++;
; }

.data
	liczba_elementow_szeregu dd ?
	warunek_fora dd ?
	szerokosc_okna dd ?
	skok_do_nastepnego_okna dd ?
	temp_ecx_przed_porownaniem dd ?

.code
_main:
	MOV [liczba_elementow_szeregu], EDX

	; Warunek zewnętrznego fora: EDX - n + 1
	SUB EDX, ECX
	INC EDX
	MOV [warunek_fora], EDX

	MOV EDX, [liczba_elementow_szeregu]

	MOV [szerokosc_okna], ECX ; n
	MOV [skok_do_nastepnego_okna], EBX ; k

	MOV EBX, 0
	FOR:
		MOV EAX, 0;

		MOV ECX, EBX
		MOV [temp_ecx_przed_porownaniem], ECX
		SUBFOR:
			MOV ECX, [temp_ecx_przed_porownaniem]
			ADD AX, ESI[ECX]

			INC ECX

			; Warunek wewnętrznego fora: j <= i + n
			MOV [temp_ecx_przed_porownaniem], ECX
			ADD EBX, [szerokosc_okna]
			CMP ECX, EBX
			JLE SUBFOR
		END_SUBFOR:
		MOV ECX, [temp_ecx_przed_porownaniem]

		MOV EDX, 0;
		DIV ECX;

		MOV [EDI], EAX;

		ADD EDI, 2
		ADD EBX, [skok_do_nastepnego_okna]

		; i < warunek_fora
		CMP EBX, [warunek_fora]
		JL FOR
	END_FOR:

	PUSH DWORD PTR 0
	CALL _ExitProcess@4
END
