La instrucción MUL DX coloca en DX,AX el resultado de AX*DX
Como la parte alta de esa multiplicación no nos interesa y además sabemos que va a ser 0 (y lo que si nos interesa es mantener el valor previo de DX) se hace un PUSH DX previo al MUL DX y un POP DX para recuperar el valor previo).
La parte alta de la multiplicación sabemos que va a ser 0 porque la matriz no puede exceder un segmento y el cálculo que estamos haciendo es para obtener la ubicacion de una celda de dicha matriz.
Si la matriz pudiese exceder un segmento esto debería haber sido aclarado en la letra dado que el programa sería bastante más complejo. O sea, la entrada "largo" del programa debe ser tal que la matriz no exceda en tamaño a un segmento.
Saludos,
Gustavo