Vectores en Ensamblador

Hexar

Buenas , necesito ayuda en la resolucion de un pequeño problemilla simple en ensamblador que me esta quebrando el alma ya que no mantengo los apuntes de los arrays y me da problemas.

El problema es el siguiente :
Implementar una rutina que debe calcular la suma de todos los elementos del vector A de tamaño N y dejar el resultado en C.

EL pseudocodigo es simple

int i=0   ;(i es el contador)
int C=0  ; ( suma total )

while(i<C) {
  C=C+A[j]
  j++;
}

No tengo permitido el uso de la instruccion Loop.
Se que lo que hay que hacer es usar otra variable contadora y un salto condicional con el tipico beq i,n para saber que ha recorrido todo el vector ( habiendo iniciado i en 1 para que lo haga bien ). Pero soy incapaz de recordar como recorrer valor por valor el vector.

IlithieN

Aunque puede variar un poco la sintaxis y de los bits que use ese procesador en concreto lo que has de hacer para recorrer el vector es tener ir sumando a la dirección inicial del vector un número (que será el número de Bits en función del procesador donde programes... normalmente serán saltos de tipo Word o byte supongo dependiendo de los valores que tengan los elementos del vector) y leer la posición de memoria sumada.

Algo así (te lo explico así un poco chorra que no tengo los apuntes delante, si no lo entiendes intento explicarlo mejor o mirarlo para Motorola68000 o PDP-11 que es lo que yo he usado):

Supongamos el vector A empieza en la posición 1000.

  1. Copias la dirección absoluta (1000) del vector en un registro de Direcciones (ya te digo que esto puede variar en función de los registros que tenga el cacharro en cuestión)
  2. Lees el valor de esta posición (la primera del vector) y lo metes en C (sumando)
  3. Saltas un elemento del vector sumando un word o un byte (en función del tamaño que sean los elementos de este vector)
  4. Realizas el salto (pseudo-bucle) con el BEQ pertinente que comentas.

Y así hasta que te salga del bucle y recorras todo el vector.

Perdón no por explicarme demasiado bien pero entre que hace 6 mese sque no toco ensamblador y tampoc se exactamente cuál es el que estás utilizando me cuesta explicarlo. Si no lo entiendes intento explicartelo un poco más claro pero todo se basa en utilizar un Registro como puntero del vector e ir moviendolo y leer la posición apuntada por este vector, el "j++" tuyo será el incremento en función del tamaño de los elementos de tu vector (Word o byte normalmente, podría ser más).

Hexar

Ya lo solucioné


TITLE practica
DOSSEG
MODEL small
.STACK 100h ;Define la pila

.data ;Define segmento de datos

Serie dw 1,2,3,4,5,6,7 ; El vector ( en el enunciado A )
Long EQU ($-Serie)/2 ;$-Serie da la longitud de Serie ( en el enunciado N o 	tamaño de vector)
RESUL dw 0 ;(en el enunciado C)
cont dw 0;
.code ;Define segmento de código
inicio:mov ax, @data ;ax   @data
	mov ds, ax
	mov cx, Long ;cx es el contador
	xor bx, bx ;i 0
	xor ax, ax ;RESUL 0
Bucle: add ax, Serie[bx] ;Suma= sumaanterior+Serie[i](posicion del vector actual)
	add bx,2 ;I i+1
	inc cont; incrementamos contador
	cmp cx,cont ; Miramos que no haya llegado a fin de vector
	jnz bucle; Si no son CX y cont iguales volvemos a bucle
	mov RESUL, ax ; Una vez haya recorrido el vector el resultado lo dejamos 	en resul
	mov ah, 4Ch ;Forma de devolver el control
	int 21h ;al sistema operativo
	END inicio ;

Por si alguien tiene dudas , es para el 8086 y el jnz es un salto condicional si el flag z es !=1

2

Usuarios habituales

  • Hexar
  • IlithieN