<-Informática\ensamblador 80x86...

Ejemplo 1

Este primer programa nos permite hacer una introducción a la programación en ensamblador. El objetivo es que mediante un sencillo programa dados dados dos vectores de mismo tamaño y tipo,que residen en memoria, sean intercambiados valor a valor.
Probablemente uno de los aspectos mas relevantes a señalar es la llamada a funciones pasando una serie de parámetros, hemos de recordar que trabajamos con un lenguaje a nivel de máquina, el paso de parámetros se hace almacenando en la pila del programa estos, que más tarde en la función seran desapilados.
La forma que lo vamos a abordar es como una serie de llamadas a una función que dadas dos posiciones en memoria pasadas como parámetros, el inicio de un vector origen y del vector destino, va recorriendo todas las posiciones moviendo los elementos del origen al destino.
No creo que quepa hacer alguna explicación más, aunque probablemente puedan surgir dudas dobre la utilización de la pila, aquí es donde os recomendaria hacer un dibujo en un papel y hacer un seguimiento de su estado en todo momento.
Recordad también que cuando se llama a una función far se almacenan automáticamente en la pila los valores de regreso, es decir el segmento y el desplazamiento de la siguiente instrucción que se iba a ejecutar antes de que se produjerá la llamada. Estos se desapilan cuando se produce el Ret al final del programa. Si ademas aparece un número después de Ret significa que antes de esta acción se desapilaran esos n bytes anteriores.

			;****** Segmento de datos **********************
			;* Definimos los dos vectores a intercambiar   *
			;* y uno auxiliar para almacenar temporalmente *
			;* el origen.				       *	
		        ;*********************************************** 
			
			datos segment
			vect_a db 1,2,3,4,5,6,7,8,9
			vect_b db 9,8,7,6,5,4,3,2,1
			vect_tmp db 10 dup(0)
			longitud dw 9
			cadena db 'ya he terminado...'
			db '$'
			datos ends

			;****** Segmento de pila ****************

			pila segment stack
			db 100 dup (0)
			pila ends

			;**Segmento de código*

			codigo segment
			assume cs:codigo,ds:datos,ss:pila

			;****************************************
			;* Nombre: ppal 			*
			;* Descripción: función principal que	*
			;* hace 3 llamadas a copiavec para 	* 
			;* intercambiar los 2 vectores con los 	* 
			;* parámetros: 				*
			;* -dirección del vect. origen 		*
			;* -dirección del vect. destino 	*
			;* -tamaño de las cadenas 		*
			;* estos se pasan por la pila. 		*
			;****************************************
			
			ppal proc far
			
			;* si quieres que termine bien no te olvides de esto *
			push ds
			xor ax,ax
			push ax
			mov ax,datos
			mov ds,ax

			;****** Primera llamada ****************** 
			;** Parametros: 		       	**
			;** Origen: direcc vector_a, 		**
			;** destino:direcc vector_temp 		** 
			;** tamaño: direcc longitud 		**
			;*****************************************

			push ds
			mov ax,offset vect_a
			push ax
			push ds
			mov ax, offset vect_tmp
			push ax
			mov ax, longitud
			push ax
			call copiavec 

			;****** Segunda llamada ******************
			;** Parametros: 			**
			;** Origen: direcc vector_b 		**
			;** destino:direcc vector_a 		** 
			;** tamaño: direcc longitud 		**
			;*****************************************

			push ds
			mov ax,offset vect_b
			push ax
			push ds
			mov ax, offset vect_a
			push ax
			mov ax, longitud
			push ax
			call copiavec

			;********* Tercera llamada *************** 
			;** Parametros: 			**
			;** Origen: direcc vector_temp 		**
			;** destino:direcc b 			** 
			;** tamaño: direcc longitud 		**
			;*****************************************

			push ds
			mov ax,offset vect_tmp
			push ax
			push ds
			mov ax, offset vect_b
			push ax
			mov ax, longitud
			push ax
			call copiavec

			;** Mostrar cadena (int 21h) ** 

			push ax dx
			mov ah,9
			mov dx, offset cadena
			int 21h
			pop dx ax
			ret

			ppal endp
			
			
			;****************************************
			;* Nombre: copiavec 			*
			;* Descripción: mueve los elementos 	*
			;* de un vector origen a un vector	* 
			;* destino.				* 
			;* Para ello se le pasan las direcciones*
			;* de estos mediante la pila. 		*
			;**************************************** 
			
						
			copiavec proc far
			push bp
			mov bp,sp
			push cx ds di es si ax bx

			;** Guardar valores de los parámetros **
			;** de la pila en registros. 	      **

			mov cx, [bp]+6
			mov ds, [bp]+14
			mov di, [bp]+12
			mov es, [bp]+10
			mov si, [bp]+8

			;** Mover valores de origen a destino **

			xor bx,bx

			;** Puesto que los vectores se han    **
			;** definido como arrays de bytes     **
			;** las operaciones se harán con      **
			;** registros y posiciones en memoria **
			;** de 8 bits **

			bucle:mov al, byte ptr ds:[di][bx]
			mov byte ptr es:[si][bx], al
			inc bx
			loop bucle
			pop bx ax si es di ds bx bp
			ret 10
			copiavec endp
			
			codigo ends
			end ppal	
			codigo ends