Pasar los datos por PILA entraña un gran problema. Tienes que reajustar el puntero de PILA para recuperarlos y después tienes que reajustarlo para recuperar la llamada del procedimiento que llamó a la subrutina en cuestión. Es muy facil que se te bloquee el programa. El programa en cuestión debe de ser el siguiente:
mov si,origen de datos
movdi, destino de datos
mov cx, tamaño
bucle:
mov al,ds:[si]
mov ds:[di],al
inc di
inc si
loop bucle
y todo el problema es este. FINAL.
En CX pasas el tamaño de la memoria a transferir. En DI el offset del desplazamiento destino y en SI el offset del origen. Dentro del bucle incrementas los dos punteros, SI y DI. La instrucción loop se ocupa automaticamente de decrementar el registro CX.