Ensamblador - Ayuda Ordenar Vector

 
Vista:
sin imagen de perfil

Ayuda Ordenar Vector

Publicado por Vanessa (7 intervenciones) el 23/10/2016 01:37:10
Hola,¿Como estan? :) Realmente quisiera unas sugerencias o que me hagan la correciones necesarias,serian muy amables por eso y por su tiempo :) ,Les paso a detallar el enunciado:

Un programa que ordene las letras de una oración de hasta 40 (cuarenta) caracteres juntando las vocales y las consonantes de acuerdo a la letra de comienzo, de la siguiente manera:
a) Se debe permitir el ingreso de cualquier elemento del teclado (entiéndase: letras, números y caracteres especiales).
b) Si la palabra comienza con vocal, todas las vocales deberán ser ubicadas al principio siguiendo el orden de aparición y posteriormente las consonantes de acuerdo a su aparición.
c) Si en el medio de la palabra aparece un número, o un carácter especial, este debe ser eliminado del conjunto de palabras, y colocado separadamente indicando cual es la posición del mismo en el conjunto original.
d) Si el carácter especial o número aparece como cierre de una palabra, frase u oración este debe conservar el lugar y no ser separado del conjunto inicial.
Ejemplos:
Estos serían 3 ejemplos básicos, pero podría escribirse cualquier cosa tenga o no sentido

1)Esta historia es larga y entusiasta
2)La comi#$da esta aceitosa pero sa;=brosa
3)Estaba esperando1 cuando aparecio?

Bien ahora analicemos uno por uno.

1)Esta historia es larga y entusiasta
DEBE DEVOLVER: East hstrioia es lrgaa y euiaantsst

Observen que en este ejemplo la tercera palabra no tiene modificación porque es de 2 letras pero las otras si se han modificado para obtener el resultado solicitado.
Vamos al segundo ejemplo

2)La comi#$da esta aceitosa pero sa;=brosa
DEBE DEVOLVER: La cmdoia east aeioacts preo sbrsaoa
# posicion 8
$ posicion 9
; posicion 34
= posicion 35

Como ven hemos sacado los caracteres especiales. En este ejemplo están seguidos pero pueden estar en cualquier lugar y también tengan en cuenta que también pueden ser números.

Vamos al tercer ejemplo.

3)Estaba esperando1 cuando aparecio?
DEBE DEVOLVER: Eaastb eeaosprnd1 cnduao aaeioprc?


Nótese que en este ejemplo los números y caracteres especiales que aparecen no se mueven y no se informan porque están al final de la palabra.
Los ejemplos dos y tres pueden estar mezclados.

-----------------------------------------------------------------------------------------------------------------------------------------------------
Les voy a explicar brevemente el codigo y a grandes rasgos:

Tengo un primero vector que obtiene los caracteres,luego lo que hago es proceder a "rastrear" los caracteres y dividirlos segun sean vocales (mayusculas o minusculas) o consonantes(mayusculas o minusculas) .Si,obviamente no es ninguno de ellos,es un caracter especial:

Les explico los procedimientos brevemente y a grandes rasgos:

A)Obtengo mi primer vector en la etiqueta veccadena_llenado
B)Luego voy a la etiqueta Rastreo,en donde pregunto si son vocales o consonantes ,si es verdad,voy a sus respectivas etiquetas hago la impresion del caracter(no se que elemento puedo usar para esto un segundo vector o variable de tipo string que acepte la escritura de caracteres)

C)Si no es ninguna vocal o consonante sera un caracter especial,en donde voy hasta un procedimiento que se encarga de SEPARAR ,IMPRIMIR Y DECIRME LA POSICION EN LA CUAL FUE ENCONTRADO


Bueno ahora les voy a mostrar como lo tengo planificado ( yo uso el emu8086 ):


#make_COM#

org 100h


.stack ;Declaramos el tamanio de la pila ¿No?

.data;declaraciones de los vectores y otras variables que vamos a usar
declariaciones de los vectores y otras variables que vamos a usar



.code text ;Empieza el programa en si mismo
;-------------------------------------------------------------------


veccad_llenado:;Etiqueta en la cual vamos a proceder a llenar el
;vector y ademas tener en cuenta si el usuario borro
;algun caracter.

;Ademas tenemos que averiguar el tamanio final del
;vector para poder trabajar con el loop "rastreo"

;Ademas ya sea en este vector o antes,tenemos que
;mostrar el mensaje: "Ingrese su cadena:" " "(espacio)
;-------------------------------------------------------------------


mov cx,"X" ;ES UN EJEMPLO PERO LA IDEA ES:
;POR ESTO MISMO,NECESITAMOS EL TAMANIO VERDADERO DEL
;VECTOR,PARA PODER LOOPEARLO Y RASTREAR Y DIVIDIR LOS
;CARACTERES,ESO BUSCAMOS.

;-------------------------------------------------------------------
;Antes de empezar con la siguiente etiqueta ,Luego del mensaje:
;"Ingrese su cadena:" (con su respectivo espacio).

;Despues de esto,hay que dejar un renglon hacia abajo y luego:
;"La cadena reordenada es:" y luego empezar a escribir a continuacion.
;1 sola vez el mensaje por supuesto.
;--------------------------------------------------------------------

rastreo: ;Etiqueta en la cual vamos a COMPARAR EL CONTENIDO
;EN LA PRIMERA POSICION DE ESE VECTOR(veccadena-contenido-)
;obviamente,por las vocales,ESA ES LA IDEA:


CMP veccadena(contenido),'A' ;Empezamos por mayusculas,si es asi(JE),
;SALTO hasta la etiqueta llamada
JE imp_voc ;"impresion_voc".

;(Una pregunta:Si salto hasta una etiqueta,no se como volver/retomar la
;siguiente instruccion.Cuando haces un CALL "nombreproc" yo se que al
;final "RET" retorna alpunto exacto donde fue llamado,pero con una
;simple etiqueta no se como hacerlo ).Sospecho que es poniendo la misma
;instruccion RET al final de la etiqueta "imp_voc".


CMP veccadena(contenido),'a';Si la comparacion anterior no resulta
;IGUAL (JE) comparamos denuevo por la misma
;letra pero en minuscula si es asi(JE)
;SALTO hasta la misma etiqueta
JE imp_voc ;"impresion_voc"


;(Aca me surje la misma pregunta,me surje la misma duda en todas las
;instrucciones:Si salto hasta una etiqueta no se como volver/retomar la
;siguiente instruccion.Cuando haces un CALL "nombreproc" yo se que al
;final "RET" retorna al punto exacto donde fue llamado,pero con una
;simple etiqueta no se como hacerlo ).Sospecho que es poniendo la misma
;instruccion RET al final de la etiqueta "imp_voc".


CMP veccadena(contenido),'E'

JE imp_voc

CMP veccadena(contenido),'e'

JE imp_voc

CMP veccadena(contenido),'I'

JE imp_voc

CMP veccadena(contenido),'i'

JE imp_voc

CMP veccadena(contenido),'O'

JE imp_voc

CMP veccadena(contenido),'o'

JE imp_voc

CMP veccadena(contenido),'U'

JE imp_voc

CMP veccadena(contenido),'u'

JE imp_voc


;Bueno,repetimos este paso con todas la vocales mayusculas y minusculas.

;----------------------------------------------------------
;Obviamente,si no es ninguna vocal(mayus. o minus.)


CMP veccadena(contenido),65 ;Vamos a COMPARAR,SI EL CONTENIDO EN LA
;PRIMERA POSICION DE ESE VECTOR
;(veccadena-contenido-)ESTA POR ABAJO(JB)
;del codigo 65 en decimal que representa
;la "A" (segun la tabla ASCII).

JB vecespeciales ;SI ESTA POR ABAJO,vamos a vecespeciales


CMP veccadena(contenido),90 ;SI NO ESTA POR ABAJO,volvemos a comparar
;SI EL CONTENIDO EN LA PRIMERA POSICION DE
;ESE VECTOR(veccadena-contenido-)
;SI ESTA POR ABAJO O ES IGUAL(JBE)que el
;codigo 90 en decimal que representa la
;"z"(segun la tabla ASCII).

;SI ES ASI,SIGNIFICA QUE ESTA DENTRO DE
;LAS MAYUSCULAS POR LO TANTO VAMOS A LA
JBE imp_conso ;ETIQUETA "imp_conso"


CMP veccadena(contenido),97 ;SI NO ESTA POR ABAJO O ES IGUAL A 90
;comparamos,SI EL CONTENIDO EN LA PRIMERA
;POSICION DE ESE VECTOR
;(veccadena-contenido-)ESTA POR ABAJO(JB)
;DE 97 el codigo en decimal que representa
;la "a".

;SI ESTA POR ABAJO DE 97,nos vamos a
JB vecespeciales ;vecespeciales


CMP veccadena(contenido),122 ;SI NO ESTA POR ABAJO DE 97,comparamos
;SI EL CONTENIDO EN LA PRIMERA POSICION
;DE ESE VECTOR(veccadena-contenido)SI ESTA
;POR ABAJO O ES IGUAL(JBE)que el codigo
;122 que en decimal representa la "z".

;SI ESTA POR ABAJO O ES IGUAL de 122
JBE imp_conso ;vamos a "imp_conso"



;SI NO ESTA EN NINGUN LADO ANTERIOR
;SIGNIFICA QUE ES MAS GRANDE QUE 122
CALL vecespeciales ;por lo tanto hacemos CALL vecespeciales


;------------------------------------------------------------------

;Luego,hacemos la etiqueta Retomo,en la cual adentro hacemos una
;variable contadora del vector y por supuestoincrementamos el
;vector(para recorrerlo) por ultimo,loop rastreo para volver a rastrear.

Retomo:

*Variable contadora del vector ;La voy a usar en "vecespeciales"

*Incrementas el vector (para recorrerlo)


*Pregunto si el contenido en esa posicion del vector es igual a "enter"
*Si es igual ,ponemos "Pulse un tecla" o simplemente se termina el
programa(mostrando todas las consignas obviamente)

loop rastreo

;------------------------------------------------------------------




vecespeciales PROC

;Despues del mensaje "Ingrese su cadena:"(con su respectivo espacio)
;Tenemos que dejar un renglon hacia abajo,es decir vamos a graficar la
;situacion:

;Ingrese su cadena: 123 2est5aba6 donde
;La cadena reordenada:xxxxxx6 xxxx
;1 posicion 1 ;TODO ESTO HACE "vecespeciales"
;2 posicion 2 ;TODO ESTO HACE "vecespeciales"
;3 posicion 3 ;TODO ESTO HACE "vecespeciales"
;2 posicion 5 ;TODO ESTO HACE "vecespeciales"
;5 posicion 9 ;TODO ESTO HACE "vecespeciales"


;Como vieron dentro de esta funcion lo que se va hacer seria la parte
;de lo caracteres especiales y con mensajes consecutivos dejando
;un espacio,todo esto depende de lo que se ingrese ,es decir:

;Se los imprime,espacio en blanco y luego se imprime la posicion.


;Para llevar a cabo dentro de esta funcion lo que se necesita es el
;contenido de la direccion del vector (o el contenido,lo que sea
;posible) y el contador de la etiqueta "rastreo" para eso la creamos.


RET

vecespeciales ENDP

;-------------------------------------------------------------------

imp_voc:


;Ya sea que usemos un segundo vector o un cadena de tipo string en
;donde se pueda escribir a traves de 2 etiquetas

;Esta etiqueta lo que hace obviamente recibe el contenido de veccadena
;y lo imprime en el elemento que usemos (vector o una cadena o variable
;de caracteres) luego hace el (JMP) hacia "Retomo" dentro de "Rastreo"
;Es decir:


codigo


JMP Retomo

;---------------------------------------------------------------------

imp_conso:


;Lo mismo que la etiqueta "imp_voc"

codigo

JMP Retomo

;--------------------------------------------------------------------





ret

-------------------------------------------------------------------------------------------------------------------------------------------------

Espero sus sugerencias ya que mi planteo presenta errores y espero sus consejos,COMO LES DIJE ANTES LES AGRADEZCO SU TIEMPO,DE VERDAD,MUCHAS GRACIAS :)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda Ordenar Vector

Publicado por Nacho (48 intervenciones) el 23/10/2016 18:09:37
Es un programa coplejo hasta en alto nivel.

Lo principal es estructurarlo bien.

- se mete la frase
- se declara un vector del mismo tamaño
- se pone en ese vector desde la posición 0 hasta encontrar un espacio. La siguiente vez será desde ese espacio hasta el siguiente Con esto vamos sacando cada frase.
- se procesa palabra

palabrear:

- se quitan caracteres especiales
- se procesa cada palabra



procesarpalabra PROC

se mira si es vocal o consonante.

Esto mira si es vocal o consonante
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
cmp         eax,61h
je            es_vocal
 
cmp         eax,41h
je            es_vocal
 
cmp         eax,65h
je            es_vocal
 
cmp         eax,45h
je             es_vocal
 
cmp         eax,69h
je             es_vocal
 
cmp         eax,49h
je            es_vocal
 
cmp         eax,6Fh
je            es_vocal
 
cmp         eax,4Fh
je            es_vocal
 
cmp         eax,75h
je            es_vocal
 
cmp         eax,55h
jne          no_es_vocal
 
es_vocal:  se hace lo que sea
 
no_es_vocal:   se hace lo que sea
 
jmp al primer cmp



La cuestión en los saltos condicionales es estructurarlos bien, no usar un ret. Una manera de hacerlo es como ese ejemplo.

Queda mucho
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ayuda Ordenar Vector

Publicado por Vanessa (7 intervenciones) el 23/10/2016 18:25:32
Hola Nacho! Gracias por tu tiempo de verdad, si obviamente tenes razon ,es un enunciado complejo hasta en alto nivel y coincido con vos en estructurarlo bien.

Mi primera duda surje cuando:

A)Declaraste el vector de 40 caracteres,supuestamente si el usuario te ingreso menos caracteres vos tenes que saber ese tamaño real del vector (porque claro,lo declaraste en 40 pero en realidad uso menos caracteres).
Yo se que en C++, declaras el vector y siempre termina con el caracter terminador '\0' pero en assembler ¿Como termina,con el caracter null/nulo ?

¿Para que te sirve el tamaño verdadera del vector? Porque despues tenes que Loopearlo (o sea ,caracter por caracter) va decrementando....Ah menos que hagas lo contrario ,o sea,empieces aumentando en lugar de ir decrementando (como tope maximo 40 incrementos) y preguntes si tiene el caracter terminador o el enter.

No quiero abusar de tu tiempo pero te dejo mi mail : snob.metro33@outlook.com para consultas ,es que te agradezco mucho tu tiempo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Ordenar Vector

Publicado por Nacho (48 intervenciones) el 24/10/2016 12:56:27
En c++ una cadena introducida por el teclado termina en \0 porque eso ha puesto la función que usas.

En asm puedes usar una función del c o c++, o la del dos, y la cadena acabará en \$, o la de la int 16h de la bios y puedes poner tú el carácter que quieras.

El tamaño del vector tienes que tenerlo presente para no desbordarlo, para no intentar leer o, peor, escribir fuera de él.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ayuda Ordenar Vector

Publicado por Vanessa (7 intervenciones) el 01/11/2016 02:46:07
Te muestro ,sólo falta unirla como tiene que ser(vocales y consonantes):

img1

img2


En la primer imagen separé debidamente las letras pero no puedo quitar los caracteres "nulos" por eso salen espaciadas,en la segunda imagen se ve como se van guardando las letras y se ven los nulos.

Necesitaria alguna forma para desprenderme de ellos o cuando los muestre por pantalla quizas no tenga que usar el OFFSET variable.
Asimismo,tengo 2 vectores diferentes que las contienen pero cuando imprimo el primero me imprime el segundo,es algo chistoso,porque si uso 2 vectores es para separarlas,sera por los espacios nulos o quizas me desbordé.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda Ordenar Vector

Publicado por Vanessa (7 intervenciones) el 01/11/2016 04:05:45
Era declarando las variables con el signo '$' y el offset
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Ordenar Vector

Publicado por Nacho (48 intervenciones) el 01/11/2016 10:47:53
Me imagino que para sacar la cadena usarás la función del dos, que espera el carácter $ como final de cadena. Como al introducir la cadena está puesta, seguramente lo que hagas es borrarla al quitar los caracteres especiales, con lo que el dos imprime más allá de la cadena. Eso da como resultado también lo de que cuentas de que imprime el segundo búfer.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda Ordenar Vector

Publicado por Vanessa (7 intervenciones) el 01/11/2016 17:35:29
Exactamente, por eso ahora usé correctamente el offsset de la variable -con el servicio 09(es el mismo para imprimir cadena de caracteres ) de la int 21h. Ahora básicamente Tengo que "parchar" mucho el programa pero ya está saliendo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Ordenar Vector

Publicado por André (1 intervención) el 09/11/2016 15:52:31
Hola, Vanessa. Yo también estoy haciendo un trabajo parecido. estoy cursando en la utn pacheco y todavìa me cuesta realizar algunos pasos. Me podrás dar una manito?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda Ordenar Vector

Publicado por Vanessa (7 intervenciones) el 09/11/2016 16:22:57
Hola,les muestro como se ve el programa:

img1
En este caso,el programa luce como pide el enunciado(no hay caracteres en el medio de las palabras)

img2

En este caso,el programa en si hace todo bien,sólo que no está ordenado.

Esto me pasa porque en cada palabra yo la muestro en pantalla ,cuando cada palabra ordenada parcialmente la tengo que guardar en un vector,es evidente,¿Pero que pasa?

Supere los limites de usar vectores,es decir, hasta ahora llevo usando:3 vectores de forma independiente (uno con SI,DI Y BX);Tengo entendido que el BP tambien se puede usar(lo probé) pero cuando le paso contenidio al vector con indice en BP,no ocurre nada.

Es decir,tengo mi cadena original vector[si] la paso a un registro AL y de AL al "vector_final" y ocurre nada;tambien probé con hacerlo directo y nada.

La idea es con estos 2 vectores vocales y consonantes es pasarlos a un vector final en el que se mostrara finalmente por pantalla;leí sobre las instrucciones de cadena de caracteres: movsb,movsw,rep,rep movsb,rep movsw y sus consecutivas.

Yo si pudiera hacerme de otro vector con su indice (y manejarlo por supuesto,sólo de la posicion 0 hacia adelante,no lo usaria en ningun momento para volver al principio o alguna posicion anterior) ,mi idea seria "volcar" los contenidos parciales del vector consonantes y vocales(o uno de cada uno,depende de la cadena) al vector final.

Pero si consigo volcar un vector sobre otro necesitaría la posicion final en la quedó,es decir,empieza de 0 y supongamos que yo le paso 4 caracteres (estoy trabajando con bits-DB- ,no con palabras-DW)es decir quedaria en la posicion 4.

Pero por supuesto yo de antemano no conozco cual sera el tamaño de mis vectores parciales,la pregunta es¿Como calcularía la posición de desplazamiento en este caso?

Bueno,muchas gracias :) ,Saludos!


(André ,mi mail es: snob.metro33@outlook.com ,mandame ahi yo te contesto)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Ordenar Vector

Publicado por Nacho (48 intervenciones) el 09/11/2016 21:09:06
Para eso existen los contadores. Los procesadores de Intel tienen un registro sólo para eso, cx. Si usas movsb tienes el registro si o di como contador. Tienes que tenerlos controlados. Igual que el registro bp. Es el puntero base de pila. Si lo tocas puedes cargarte la referencia de los datos de la pila. Se puede usar, pero hay que tener los registros siempre muy controlados.

Una de las razones por la que los compiladores de alto nivel son más lentos es por el cuidado que tienen con los registros. Ejemplo de código generado por un compilador

00411702 movsx eax,byte ptr [c]
00411706 cmp eax,61h
00411709 je main+7Ch (41175Ch)
0041170B movsx eax,byte ptr [c]
0041170F cmp eax,41h
00411712 je main+7Ch (41175Ch)
00411714 movsx eax,byte ptr [c]
00411718 cmp eax,65h
0041171B je main+7Ch (41175Ch)

¿No te sobran los movsx después del primero?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda Ordenar Vector

Publicado por Vanessa (7 intervenciones) el 09/11/2016 21:31:44
Gracias Nacho, si, uso el registro cl como contador porque el Ch lo uso como bandera al igual que dh .Disculpa por la ignorancia, pero todavía no usé las instrucciones movsb, y me enseñaste que los compiladores de alto nivel son más cuidadosos con las variables. Si, hay que tener muy controladas los registros eso lo aprendí muy bien, sobre todo cuando llamas a las excepciones del BIOS /las interrupciones y algunas te cambian mucho los registros; Más sobre todo cuando hiciste muchísimas líneas de código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar