Ensamblador en Maquina Rudimentaria

veamos, tengo un ligero problemilla con un codigo de ensamblador para maquina rudimentaria (modelo Von Neuman).

El codigo consiste en recorrer una matriz en la que hay 1, 0 ó -1, hay que contarles e ir mostrandoles...para al final guardar en memoria el numero de 1, de 0 y de -1 (en un vector).

Se que recorrer la matriz tiene que ser con dos vectores(el de columnas y el de filas) pero no soy capaz de hacer que me funcione el codigo..alguien me hecha una mano?
Pon el código que has hecho, e intenta explicar mejor que tienes que hacer. Igual te puedo ayudar en algo.
Los datos de la matriz se guardarán seguidos en la memoria, es decir, si tu tienes la matriz:
1 2 3
4 5 6
7 8 9

en memoria se guarda
1 2 3 4 5 6 7 8 9

Por lo tanto, tendrías que ir leyendo desde 0 a filas*columnas-1

Si lo quieres hacer con estructura 2xfor, para acceder, tendrías que hacer numfila*datos_fila+numcolumna..

Pero con lo de arriba creo que tienes bastante.

Si me equivoco, corregidme :P
veamos, pongo el codigo:
matriz:      .dw -1,0,1;
      .dw 1,-1,-1;
      .dw 0,1,-1;

ceros:      .rw 3;
neg:      .rw 3;
pos:      .rw 3;

      .begin ini

ini:      add R0,R0,R6;
      add R0,R0,R1;
bucle1:      subi R1,#9,R3;
      beq fin1;
      add R0,R0,R2;
      add R0,R0,R7;
bucle2:      subi R2,#3,R3;
      beq fin_fila;
      add R1,R2,R4;
      load matriz(R4),R5;
      add R5,R0,R5;
      bne nocero;
      addi R7,#1,R7;
nocero:      addi R2,#1,R2;
      br bucle2;
fin_fila:    store R7,ceros(R6);
      addi R1,#3,R1;
      addi R6,#1,R6;
      br bucle1;


fin1:      add R0,R0,R6;
      add R0,R0,R1;
bucle12:   subi R1,#9,R3;
      beq fin2;
      add R0,R0,R2;
      add R0,R0,R7;
bucle22:   subi R2,#3,R3;
      beq fin_fila2;
      add R1,R2,R4;
      load matriz(R4),R5;
      add R5,R0,R5;
      bge noneng;
      addi R7,#1,R7;
noneng:      addi R2,#1,R2;
      br bucle22;
fin_fila2:    store R7,neg(R6);
      addi R1,#3,R1;
      addi R6,#1,R6;
      br bucle12;


fin2:      add R0,R0,R6;
      add R0,R0,R1;
bucle13:   subi R1,#9,R3;
      beq fin
      add R0,R0,R2;
      add R0,R0,R7;
bucle23:   subi R2,#3,R3;
      beq fin_fila3;
      add R1,R2,R4;
      load matriz(R4),R5;
      add R5,R0,R5;
      ble nopos;
      addi R7,#1,R7;
nopos:      addi R2,#1,R2;
      br bucle23;
fin_fila3:    store R7,pos(R6);
      addi R1,#3,R1;
      addi R6,#1,R6;
      br bucle13;


fin:      .END


Ahora explico lo que hay que hacer: Teniendo una matriz NxN, recorrerla, y devolver el numero de positivos, negativos y ceros que hay en cada fila.
Es decir, devuelve 3 vectores, vcero, vpositivos y vnegativos. Supioniendo una matriz
110
-101
-1-1-1

Los resultados deberian ser:
vcero:1
1
0
vpos:2
1
0
vneg:0
1
3

No se si queda claro....

EDITO: etc_84, no entiendo nada de lo que dices, mas que la matriz se guarda de seguido, eso ya lo se, pero no soy capaz de hacerlo funcionar xD
Ostias que ensamblado mas chungo! Pensaba que seria un ensamblador mas cercano al actual.
ya te digo que es maquina rudimentaria, modelo von neuman xD De todas maneras es de lo mas simplote que hay, no usamos mas de 8 o 10 instrucciones(las aritmeticas(add,addi,sub,subi), las de salto(br,bge,beq...) y luego las de control(store, load))

EDITO: Lo que tengo que hacer esta en PDF aqui, pagina 23.
Cancerber escribió:ya te digo que es maquina rudimentaria, modelo von neuman xD De todas maneras es de lo mas simplote que hay, no usamos mas de 8 o 10 instrucciones(las aritmeticas(add,addi,sub,subi), las de salto(br,bge,beq...) y luego las de control(store, load))

EDITO: Lo que tengo que hacer esta en PDF aqui, pagina 23.

Lo siento.. no entiendo nada de ese código xDD
Nosotros usabámos ensamblador de MIPS.

Pero la estructura tiene que ser(pseudo):

contador1=-1
rango=2

Recorrido1: Si contador1 fuera de rango(contador1>=rango), salta a final
-contador1++
-contador2=0
Recorrido2: Si contador2 fuera de rango(contador2>=rango), salta a recorrido1
-Lectura dato
-Si dato==0 salta escero
-Si dato<0 salta pequeno
-Salta incondicional a mayor

:escero
-Incrementa contador de ceros
-Salto incondicional a siguiente

: pequeno
-Incrementa contador de pequenos
-Salto incondicional a siguiente

:mayor
-Incrementa contador mayores
-Salto incondicional a siguiente

:siguiente
-Contador2++ (incremento)
-Salto incondicional a Recorrido2

:final
Fuck all XD

Diria que es así.. a ver si te sirve de algo.. en principio es solo traducir ahora :P
pero eso tiene un problema...asi no se cuando saltas de una fila a otra, por lo que no estas recorriendo una matriz sino un vector
Cancerber escribió:pero eso tiene un problema...asi no se cuando saltas de una fila a otra, por lo que no estas recorriendo una matriz sino un vector

El Recorrido1 es contador de filas y el Recorrido2 es contador de columnas...
bueno, entonces todo tiene mas sentido xDD

pero 2 preguntas:
Dentro de recorrido1, '-contador1++' que hace?
y la segunda, al incrementar el numero en escero, es positivo o es negativo, solo pones el numero fijo, pero no lo guardas como un vector (¿la suma desplazamiento deberia ser quizas recorrido1?)
[tomaaa] Me confundí, lo siento, Recorrido1 y Recorrido2 son etiquetas...
El contador de filas es contador1 y el contador de columnas es contador2.

Lo otro de los vectores no entiendo qué quieres decir, tu quieres saber cuantos hay de cada o cuáles, o todo junto?

Si quieres todo junto, en :escero :mayor y : pequeño, tendrías que añadir que guardara contador1 y contador2 en un vector, correspondiente a [fila][columna] o directamente el valor que tienes guardado de la lectura dato.
pf, sera una tonteria, pero no me veo capaz de hacerlo y no me voy a poner a probar teniendo mña el examen xD Gracias de todas maneras pero no soy capaz de verlo...
Anda, un compañero de facultad [beer].
Me parece que llego un poco tarde, pero bueno, aquí tienes el código funcionando perfectamente (lo hice hace algo más de un mes y funcionaba ¬_¬), espero que te sirva de algo:

.BEGIN ini
matriz: .DW 1,0,-1
.DW -1,1,0
.DW 1,0,0
vcero: .RW 3
vpos: .RW 3
vneg: .RW 3

ini: addi r0,#2,r1
addi r0,#3,r3
bucle1: sub r1,r0,r0
bl finb1
store r0,vcero(r1)
store r0,vpos(r1)
store r0,vneg(r1)
subi r1,#1,r1
br bucle1
finb1: add r0,r0,r1
bucle3: subi r1,#3,r0
bge finb3
add r0,r0,r2
bucle2: subi r2,#3,r0
bge sumai
add r1,r0,r7
multi r7,r3,r4
add r4,r2,r4
load matriz(r4),r5
beq igual
bg mayor
load vneg(r1),r6
addi r6,#1,r6
store r6,vneg(r1)
br sumaj
igual: load vcero(r1),r6
addi r6,#1,r6
store r6,vcero(r1)
br sumaj
mayor: load vpos(r1),r6
addi r6,#1,r6
store r6,vpos(r1)
sumaj: addi r2,#1,r2
br bucle2
sumai: addi r1,#1,r1
br bucle3
finb3:
.END



Multi es el de la práctica esa de multiplicar, te lo pongo también por si acaso:
.DEF multi $1,$2,$3

add R0,R0,$3
bucle: subi $1,#1,$1
bl fin
add $2,$3,$3
br bucle
fin:
.ENDDEF



No he revisado lo tuyo porque tengo otro examen mañana y como que ya toy centrado en él, así que no me iba a enterar, en cualquier caso espero que no sea la línea en blanco al final lo que te falta xDD.
¡Suerte!
joer ke gusto da tener gente de la complu circulando por eol xD
Mil gracias :D
BuzzFuzz escribió:Ostias que ensamblado mas chungo! Pensaba que seria un ensamblador mas cercano al actual.


Juas [jaja] yo no salgo de Java (a ver como me van a poner cuando llegue a 3º...)
JAPosti escribió:
Juas [jaja] yo no salgo de Java (a ver como me van a poner cuando llegue a 3º...)
dudo muy mucho que si en 2º(estaras ya en 2º digo yo) no has tocado maquina rudimentaria (o ensamblador en x86) lo vayas a mirar en 3º...

de todas maneras no os penseis que es tan complicado como lo pintan eh, que es bastante mas sencillo...con hacerte un diagrama de datos te lo sacas(mas o menos) con la churra, salvo que tengas que estar recorriendo por ejemplo una matriz(que es lo mas complicado que hay, al menos en maquina rudimentaria)
En el 2º cuatrimestre de primero, en estructura de computadores nos dieron a mitad de la asigntura un lenguaje ensamblador 'inventado' por ellos, ya sabeis, los lenguajes teóricos, para familiarizarnos. Y luego el último día de clase :o nos dieron el del 68000 vamos, yo estaba que lo flipaba con el problema de sumar dos vectores que estaban en posiciones diferentes... ufff... menos mal que en julio no cayó nada de ese que si no me follan.

Pero vamos, que en 3º ya me pillarán :-p

Salu2
uff nosotros en 3º que tenemos practicas con los motorola cacharrones no me quiero ni imaginar lo que puede ser eso. Y luego he visto gente con cerebros de la bestia creados por ellos mismos, en plan con micros y poco mas programarte algo asi como una maquina rudimentaria, trescientosmil cables por todos lados.

Pero bueno, ya tendre tiempo para asustarme xD
Aqui un estudiante de informatica en la complu (2º)

-Doria-
18 respuestas