I managed to fix the program by removing the PUSH AX, and setting the BP register value to SP, here is the code now:
DATA SEGMENT
ARRAY DB 1, 4, 7, 8
ARRAY2 DB 2, 3, 6, 9
DATA ENDS
STACK_SEG SEGMENT PARA STACK
DB 64 DUP (0)
STACK_SEG ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA, SS:STACK_SEG
MAIN PROC FAR
MOV AX, @DATA
MOV DS, AX
MOV BP, SP
MOV DI, 0
LEA SI, ARRAY
CALL LOOPTHRU
LEA SI, ARRAY2
CALL LOOPTHRU
MOV AH, 0
INT 21H
RET
MAIN ENDP
LOOPTHRU PROC NEAR
MOV AX, 0
MOV BX, 0
_LOOP:
MOV AL, [SI]
MOV [BP-DI], AX
INC SI
INC BX
SUB DI, 2
CMP BX, 4
JNE _LOOP
RET
LOOPTHRU ENDP
CODE ENDS
END MAIN
but I still don't understand why the PUSH instruction causes this strange behaviour.