Ensamblador - Programa que ordene cadenas por longitud

   
Vista:

Programa que ordene cadenas por longitud

Publicado por Sadrac93 (2 intervenciones) el 29/10/2015 01:41:31
Hola que tal antes que nada mucho gusto y un placer estar en esta comunidad como verán soy nuevo en este foro y también soy un novato en programar en ensamblador y sin más preámbulo les explico mi problema:
Tengo que realizar un programa en ensamblador que dada una frase introducida por el teclado me devuelva la frase de tal manera que las palabras aparezcan ordenadas por número de carácteres sin importar el orden alfabético no se si me explique, por ejemplo se introduce la frase: "hola que tal como estan todos" y devuelve como resultado: "tal que hola como todos estan".
Hasta ahora se cómo introducir carácteres por teclado pero se me complica el crear la función para que realice el proceso de ordenamiento esto es lo que llevo hasta ahora:

.model small
.stack
.data
cad1 DB 'Escribe la oracion a ordenar:',13,10,'$'
cadena1 db 10 dup(' '),'$'

.code

inicio:
mov ax,@data
mov ds,ax
mov ah,09
mov dx,offset cad1
int 21h
lea si,cadena1

pedir:
mov ah,01h
int 21h
mov [si],al
inc si
cmp al,0dh
ja pedir
jb pedir

mov cx,10
mov ax,ds
mov es,ax
end

Como pueden ver no es mucho y me he ayudado de otros programas que he visto pero no hay nada similar a lo que yo necesito, les agradecería de antemano si pudieran ayudarme.
Sin más que decir reitero mis agradecimientos por su atención y su valioso tiempo.
Saludos!
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

Programa que ordene cadenas por longitud

Publicado por Requeteprogramador (26 intervenciones) el 29/10/2015 08:59:46
La teoría es sencilla. Vas recorriendo la frase buscando el byte 20h. Guardas en un array la posición de memoria de ese byte más 1. Luego sacas primero aquellas palabras que tengan una letra, aquella en la que una posición de memoria menos la anterior es igual a dos; luego las que tengan dos, una posición de memoria menos la anterior es igual a tres, y así.

"hola que tal como estan todos"

te quedaría el array

0, 5, 9, 13, 18, 24, 30

Puedes guardar la posición absoluta o la relativa. En este caso sería la relativa a un offset (la posición de la h del hola, que es la 0)

Posiciones de memoria que restadas de la anterior den 2 no hay, no hay palabras de una letra.
Posiciones de memoria que restadas de la anterior den 3 no hay, no hay palabras de dos letras.
Posiciones de memoria que restadas de la anterior den 4 sí hay, la sacas por la pantalla.
Y así.

Para salir de un bucle no hace falta que compruebes si es mayor y si es menor, basta con que compares si es igual o no, con un jne vale.
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

Programa que ordene cadenas por longitud

Publicado por Sadrac93 (2 intervenciones) el 29/10/2015 23:47:16
Muchas gracias por tu pronta respuesta que amable pero sigo en las mismas, en concreto mi problema es que aún no conozco al 100 por ciento cómo utilizar cada tipo de instrucciones la verdad se me hace un poco confuso he leído varios libros pero sigo en las mismas, buscando más por el foro encontré este código del usuario MSH créditos totales y reconocimiento para él:


.model small
.stack
.data
mens db 'Teclea la frase',0ah,0dh,'$' ;mensaje de inicio

cadena label byte ;aquí defines la estructura de la cadena:
max db 101 ;máximo de caracteres (100 letras + el enter)
cant db ? ;almacena la cantidad real de caracteres tecleados
campo db 101 dup (' ') ;acepta espacios en la cadena

.code
.startup

mov ax,@data ;respalda los datos a introducir en
mov ds,ax ;los registros ds y es para que no se pierdan
push ds ;durante las instrucciones siguientes
pop es

;------Inicia el programa--------------------------

mov ah,09h ;petición para mostrar mensaje
lea dx,mens
int 21h

mov ah,0ah ;petición para introducir cadena
mov dx,offset cadena
int 21h

lea si,campo ;mandamos la cadena al registro si para empezar
;a evaluar

ciclo:
mov al,[si]
cmp al,20h ;verifica si es caracter o es espacio
jne disp ;i es caracter, lo despliega en pantalla
inc si ;si es espacio, lo salta y pasa al siguiente caracter
jmp ciclo

disp:

mov ah,02h ;petición para desplegar
mov dl,al
int 21h
cmp al,0dh ;si encuentra un enter,
je salir ;sale del programa
inc si
jmp ciclo

salir:

.exit
end

Como se pude apreciar el código elimina los espacios en blanco de una frase de máximo 100 caracteres, tal vez modificando el ciclo para que ordene las palabras por longitud pueda obtener el resultado esperado pero no se cómo quedaría, si no es mucha molestia podrías ayudarme con el código de esa parte del programa?
Saludos y gracias nuevamente
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